• Страница обходится роботом, но отсутствует в поиске - как добавить сайт в поиск Яндекса?

    yaleksandr89
    @yaleksandr89
    olakakur,
    robots не делал т.к. он нужен для закрытия страниц от интексации, насколько я понимаю.

    Неправильно понимаете. Не буду копировать определение из гугла, если простыми словами: "этот файл нужен для того, чтобы объяснить поисковым роботам что можно индексировать, а что индексировать нельзя. Сам же файл файл состоит не только из одной директивы disallow, там есть и другие :)

    sitemap нареканий со стороны яндекса.вебмастер не вызывает (добавил уже). Что посоветуете дописать?

    Правильно, чисто с технической стороны, ссылка добавленная в карту сайта - соответствует (у неё есть протокол, у неё есть домен и т.д.). Только она битая, если перейти по ней вывалиться 404 (которая кстати у вас тоже не настроена и подтягивается с хостинга, где расположен ваш сайт (джино).
    Просто наберите после названия своего сайта /sitemap.xml (https://www.xn----8sbfic3a5an7d7b.xn--p1ai/sitemap.xml) и сами все поймете.

    Совет один, ознакомиться с рекомендациями составить правильно два файла. После этого проверить робот.тхт на ошибки, а сформированную карту сайта добавить в соответствующий раздел.

    P.S. если не хотите ковыряться с картой сайта, есть сервисы, которые её генерируют её (например: https://htmlweb.ru/analiz/sitemap.php), но так как у вас сайт на одну страницу (других я не нашел :) ) Советую сделать вручную, что бы понимать, что за колдовство происходит в этом файл и так как у вас сайт самописный, при обновление содержимого желательно будет менять даты в этой карте.
  • Как осуществить поиск файла по префиксу?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Дмитрий, картинка приходит от клиента, поэтому её нет смысла даже хранить на сервере (файл с её хэшем хочу создать исключительно для проверки).
    Фактически от клиента приходит запрос, с данными, на основании которых формируется письмо и отправляется клиенту.

    Ладно пошел дальше налаживать контакт с Lumen, может все же получиться через него все реализовать. А спасибо за помощь уже не по теме вопроса :)
  • Как осуществить поиск файла по префиксу?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Дмитрий, плюс/минус рецепт один, только почти везде делается по "привычному" header().
    Я на таком уровне (ручками) с заголовками не работал, знаете какой меня момент смущает и на который я не смог чуткого ответа найти.

    Ок, пусть в response я засуну полученный хэш и сделаю проверку по нему (200 возвращать или 304). У меня в голове пока не укладывается - закешировать нужно изображение, но ответ будет один общий (ответом является сформированный html шаблон письма).

    Возможно ли (и нужно ли) закешировать только изображение, а остальное отдавать 200. Просто у меня тут ещё путаница и из-за неё видимо я начинаю тупняки ловить. Я вообще до начала этой недели не думал, что работа с заголовками может вызвать такую боль :)

    Раньше ,как-то обходилось готовыми решениями, ну или полу готовыми (допилинными под себя)
  • Как осуществить поиск файла по префиксу?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Дмитрий, и эту главу и Request и Cached прочитал не раз. По документации реализовал response с 304 ответом и дописанными вручную заголовками.

    Но в любом случае для значения заголовка Etga получить хэш. Наверное в любом случае нужно будет производить (сравнение с файлом и пришедшим урл). И ещё интересный вопрос, как полученный хэш записать в значение заголовок ETag при ответе...на php ничего сложного:
    $file = ...
      $last_modified_time = filemtime($file); 
      $etag = md5_file($file);
    
      header("Last-Modified: ".gmdate("D, d M Y H:i:s", $last_modified_time)." GMT"); 
      header("Etag: $etag"); 
    
      //... проверка по last_modified_time, если true, то header("HTTP/1.1 304 Not Modified");


    Но тут люмен, с которым я познакомился менее недели назад :). Поэтому уже рассматриваю вариант вручную реализовать Etag в моей задачи, так как информации найти не могу :(
  • Как осуществить поиск файла по префиксу?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Кэш, но не самопальный :) так что вы почти правы))
    Если в двух словах: на сервер приходит запрос, среди прочего в нем есть url изображения (это сервис email рассылки, развернут с помощью PHPMailer и Lumen).
    Изображение это не будет меняться или ооочень редко. Соответственно хочу закешировать, логика у меня такая:
    1. При первом запросе получить хэш файла и поместить во временный файл (либо скопировать содержимое через file_put_content и поместить в файл, тут пока ХЗ у меня такого рода задача - первый раз попалась).
    2. При повторном запросе сравнить суммы и в случае совпадения отдать 304.

    Пока на этапе создания файла и сравнения имеющегося хэша и вновь пришедшего. Как решу эту задачу уже буду работать с HTTP заголовками (планирую реализовать через ( ETag + If-None-Match)

    P.S. читал доки по Люмену, честно говоря так и не вкурил, как через него все реализовать, а сидеть и чахнуть не хочеться, поэтому решил пойти иным путем.
  • Fileinfo() получение информации о типе файла по url. Как сделать?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Спасибо! Прям то что нужно :)
    is_Image

    private static function is_Image(string $filename): string
        {
            if (!defined('ALLOWED_MIME_TYPE')) {
                define('ALLOWED_MIME_TYPE', [
                    'png' => 'image/png',
                    'jpe' => 'image/jpeg',
                    'jpeg' => 'image/jpeg',
                    'jpg' => 'image/jpeg',
                    'gif' => 'image/gif',
                    'bmp' => 'image/bmp',
                    'ico' => 'image/vnd.microsoft.icon',
                    'tiff' => 'image/tiff',
                    'tif' => 'image/tiff',
                    'svg' => 'image/svg+xml',
                    'svgz' => 'image/svg+xml'
                ]);
            }
            list($width, $height) = getimagesize($filename); // Getting image size
            $imgInfo = new finfo(FILEINFO_MIME_TYPE);
            $imgMime = $imgInfo->buffer(file_get_contents($filename));
    
            // Checking image type
            if (array_search($imgMime, ALLOWED_MIME_TYPE)) {
                // ...
            } else {
                self::userError("'logo_url': invalid image format. given - {$imgMime}");
            }
            return $filename;
        }

  • Сохраняет ли getimagesize() изображение на сервер?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Lander, чувствую вопрос с подвохом :) Конечно знаю.
    Если вы про эту строчку
    сохранить в файл (пока задумка реализовать через tmpfile())

    То я написал предварительно)) сейчас я понял, что такой вариант не подойдет, а нужно использовать tempnam()
  • Сохраняет ли getimagesize() изображение на сервер?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Lander, ну я думал вопрос тривиальный и ответ о нем не знаю только я :) поэтому спросил без уточнения, а в итоге получилось не все так однозначно))

    А то получается что у вас любой файл после получения о нем информации удаляется с сервера.

    Это и нужно) Да и из файлов передаются только изображения, остальное текстовая информация.
  • Сохраняет ли getimagesize() изображение на сервер?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    DevMan,
    я когда-то задавался подобным вопросом и ради этого заглянул в исходники

    Я ещё в начале тернистого пути :) подобные попытки уже предпринимаю, но пока с переменным успехом. А тут на ровном месте, так "зарылся" что подумал: "лучше спросить, чем ковырять исходники"

    кстати, если вам нужны только размеры, и файлы могут быть большими, лучше пользовать не getimagesize(), а что–то вроде https://github.com/tommoor/fastimage

    Кстати, сегодня при поисках инфы по getimagesize натыкался на эту репу.

    Спасибо за рекомендацию.
  • Сохраняет ли getimagesize() изображение на сервер?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    К этому варианту я тоже склонялся. Спасибо!
  • Сохраняет ли getimagesize() изображение на сервер?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Nujabes37, вот и мне сегодня таракан в голову залез, уже несколько раз перечитывал офф.доки и на русском и на анг (хз. думал может перевели криво :)). Нигде не сказано, что файл сохраняется или что файл не сохраняется.

    С другой стороны, если mime файла можно (предположительно получить по первым трем символам (забыл как "по умному называется")), то вот как получить размеры изображения без его скачивания локально...

    Вот сижу и "меня терзают смутные сомнения" :)

    p.s. наверное "пока не попробуешь не узнаешь". Завтра попробую через него (так как по мне это самый очевидные и оптимальный вариант). А дальше виднее будет.

    p.s. вторым ответом опередили :)))
  • Сохраняет ли getimagesize() изображение на сервер?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Так, мое предположение разнесено в пух и прах :) Эт хорошо, спасибо!
    Я не просто так, на ночь глядя: "дай думаю задам странный вопрос".

    Дело в том, что прилетела задача с которой ранее не сталкивался. И как я у уже понял getimagesize() для неё не подойдет.

    Суть в том, что на сервер приходит запрос, в запросе среди прочего есть url картинки. От этого url мне нужно получить 3 вещи:
    1. Размеры (длина, ширина)
    2. Тип изображения
    3. Хэш-сумму файла

    1. - 2. нужны для проверки корректности передаваемых данных. Так как запросы достаточно однотипны и сам url будет меняться крайне-крайне редко, нужно взять hash файла, сохранить в файл (пока задумка реализовать через tmpfile()) и при повторном запросе сравнивать суммы и если они совпадают отдавать 304, что бы не загружать сервер.

    Сам файл хранить на сервере нет никакого смысла, не подскажете альтернативу getimagesize(), откуда можно выдернуть эти данные?
  • Не корректно отрабатывает try\catch. Как исправить?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    getMessage(); - выводит текст сообщения переданный в конструктор, если мне не изменяет память.
    Но вот вопрос, почему тогда я не получаю текст, который я сгенерировал в throw.

    Просто я предполагал следующее,
    Создал класс (EmailSendingFailed) -> Сгенерировал исключение (("Couldn't send email. Invalid sender address '{$recipient->email}'."))->"сломал" отправку писем->При попытке отправить письмо должно появиться сообщение:

    Couldn't send email. Invalid sender address mailmail.ru.

    и...скрипт на этом должен прекратить работу. А по итогу сообщения - нет, скрипт отработал (но при этом письмо не отправилось конечно же). Хотя я уже может "загнался" на этих исключениях и не виду очевидных вещей...
  • Что я указываю неправильно в функции filter_var(..., FILTER_VALIDATE_REGEXP, ...)?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    С третьим вариантом я почти угадал :). Спасибо!
  • Почему не срабатывает условие if else?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Рональд Макдональд, спасибо, что разжевали! Действительно использование флагов рулит :) Вот такой вариант заработал.
    let allNotChecked = true;
    for (let i = 0; i < buttonsOperations.length; i++) {
        elementEnable(firstArgument, 'input', btnResult);
        elementEnable(secondArgument, 'input', btnResult);
        elementEnable(buttonsOperations[i], 'input', btnResult);
        if (buttonsOperations[i].checked === true) {
            allNotChecked = false;
            let operator = buttonsOperations[i].getAttribute('data-operation');
            calculatorOperator(operator);
            elementDisable(btnResult);
        }
        if (allNotChecked === true) {
            output.innerHTML = '<strong>Ошибка!</strong> Арифметическая операция не выбрана.';
        }
    }
  • Почему не срабатывает условие if else?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Вы имели ввиду, что-то вроде этого?
    for (let i = 0; i < buttonsOperations.length; i++) {
        elementEnable(firstArgument, 'input', btnResult);
        elementEnable(secondArgument, 'input', btnResult);
        elementEnable(buttonsOperations[i], 'input', btnResult);
    
        let allNotChecked = true;
        if (buttonsOperations.checked === true) {
            if (allNotChecked) {
                allNotChecked = false;
                let operator = buttonsOperations[i].getAttribute('data-operation');
                calculatorOperator(operator);
                elementDisable(btnResult);
            }
        } else {
            output.innerHTML = '<strong>Ошибка!</strong> Арифметическая операция не выбрана.';
        }
    }


    Честно говоря не понял, как тут флаг вкорячить и проверить на true\fasle
  • Как решить данную задачу корректно?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Дмитрий, А насчет imagick надо будет попробовать, честно говоря до сегодняшнего дня я думал, что с помощью php можно делать какие-то "топорные" вещи из разряда: создать,удалить, изменить размер,конвертировать. Но все оказывается намного гибче.

    сократить начало, ресурс можно получать независимо от расширения файла

    Спасибо за совет! Действительно можно чутка сократить код :)
  • Как решить данную задачу корректно?

    yaleksandr89
    @yaleksandr89 Автор вопроса
    Блин оказалось все крайне просто :)
    В начале файла session_start();, а перед редиректом переменные, которые указывались в качестве пути у изображений переместить в
    $_SESSION['save_origin'] = $new_name_original;
    $_SESSION['save_processed'] = $new_name_processed;


    А я голову ломал. Но спасибо за совет насчет редиректа. Не сообразил сразу.