Задать вопрос
  • При загрузке изображения через Curl теряется информация об изображении?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    UPD: уберите CURLOPT_VERBOSE. Так как иначе verbose данные пишутся в файл и он конечно портится
    ecurl_setopt($ch, CURLOPT_VERBOSE, 1);

    вывод ошибок CURLOPT_STDERR тоже не стоит направлять в $fp.

    Чисто по функционалу не вижу проблем в коде.
    Для более точной диагностики проблемы с файлом можно сравнить их содержимое на бинарном уровне
    1. скачиваете файл браузером
    2. скачиваете файл curl

    сравниваете содержимое через через любую diff-тулзу которая умеет сравнивать бинарные данные, например https://www.fairdell.com/hexcmp/

    будет понятно, "побился" ли файл при передаче через curl и если побился то где, в начале где идут magick bytes или может быть в конце так как не дозаписался.
    А может быть у вас вообще при передаче возникли ошибки которые тоже записались в этот файл, так как указано
    ecurl_setopt($ch, CURLOPT_STDERR, $fp);

    Если при скачивании файла из браузера и при скачивании через curl их содержимое одинаковое, то проблема скорее в самом исходном файле.
    Ответ написан
    Комментировать
  • Как ускорить отдачу динамически генерируемых thumbnail'ов на PHP + GD?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Генерация изображений по сути долгая так как упирается в ресурсы сервера (CPU) и ускорить тут (на лету) вряд ли особо получится.
    Самый правильный вариант - кешировать сгенерированные превью на диск.
    Можно оставить thumb.php как промежуточное звено, при первой генерации сохраняем резалт на диск, и при повторных запросах проверять что если файл thumbnail'а есть на диске - считывать и отдавать его.
    Но самый быстрый и оптимальный вариант это всё-же кешировать и отдавать превью напрямую веб сервером, (без РНР), например при аплоаде сразу делать нужные размеры.

    Можно обойтись вообще без РНР и использовать Модуль ngx_http_image_filter_module
    https://habr.com/en/post/94435/
    https://nginx.org/en/docs/http/ngx_http_image_filt...
    Ответ написан
    Комментировать
  • Как сделать таблицу или запрос поиска между всеми таблицами?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    SELECT id FROM Toys WHERE Toys.Number = ...
    UNION
    SELECT id FROM Food WHERE Food.Number = ...

    https://dev.mysql.com/doc/refman/8.0/en/union.html

    Или все товары сложить в одну таблицу например shop_items с доп. колонкой item_type
    где item_type у вас будет toys, food и тд
    Ответ написан
    2 комментария
  • Как защитить чат от длинных символов?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    https://regex101.com/r/j6LSY8/1/

    удаляем через preg_replace всё что не разрешено регуляркой
    [^\p{Cyrillic}\p{Latin}\p{Common}\w\s]+
    Ответ написан
    3 комментария
  • Как распарсить файл типа yml с помощью php?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Это обычный xml
    Парсится стандартными библиотеками для работы с XML
    https://www.php.net/manual/ru/book.simplexml.php
    https://www.php.net/manual/ru/book.xmlreader.php

    Стандарт YML (Yandex Market Language) разработан Яндексом и основан на стандарте XML. Формат YML предоставляет больше возможностей и преимуществ, чем форматы XLS, CSV.

    https://yandex.ru/support/partnermarket/export/yml.html

    <?php
    //считываем содержимое файла
    $data = simplexml_load_file('file.xml');
    
    //достукиваемся куда надо
    foreach ($data->shop->categories->category as $row) {
    	$id = intval($row['id']);
    	$parentId = intval($row['parentId']);
    	$name = strval($row);
    	
    	var_dump($id, $parentId, $name);
    }
    Ответ написан
    2 комментария
  • Как проверить proxy с авторизацией через CURL?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    если socks то желательно указать CURLOPT_PROXYTYPE = CURLPROXY_SOCKS5

    //curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP);
    curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);


    CURLOPT_URL задайте явно протокол (http) - http://check-host.net/ip

    CURLOPT_PROXYAUTH убрать или поменять явно на ваш вариант CURLAUTH_BASIC

    из документации https://www.php.net/manual/ru/function.curl-setopt.php
    CURLOPT_PROXYAUTH Методы авторизации HTTP, используемые при соединении с прокси-сервером. Используйте те же самые битовые маски, которые были описаны у параметра CURLOPT_HTTPAUTH. В данный момент для авторизации прокси поддерживаются только CURLAUTH_BASIC и CURLAUTH_NTLM.
    Ответ написан
    1 комментарий
  • Есть ли смысл учить wordpress в 2020?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    По прогнозам некоторых людей, PHP скорее всего через год - два умрет, а вместе с ним и все CMS, написанные на нем

    Смешно такое читать. Помню такие прогнозы и 5 лет назад и даже 10 лет назад.
    Именно заставлять себя изучать WP нету смысла, тем более там ещё тот г.код под капотом.
    Потратьте время на прокачку скилов по программированию. Тогда не важно с какой CMS или фреймворком работать. При должных навыках и опыте на изучение уйдет от недели до месяца.
    Ответ написан
    1 комментарий
  • Возможно HTML текст разложить на теги, слова и пробелы?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Самым корректным способом парсить HTML на PHP будет использование модулей DOM и XPath
    https://www.php.net/manual/ru/class.domdocument.php
    Либо обёртку над ними на подобии Simple HTML DOM.

    Парсить HTML документ регулярками это плохая идея. Регулярки подходят только для совсем простых случаев, типа найти ссылку в документе и тд.
    Ответ написан
    Комментировать
  • Возможно ли написать какой-то callback что бы перезапускал цикл?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Смысл в том что мы объявляем переменную $offset, а запрос помещаем в бесконечный цикл
    Первый запрос пройдёт с вашим значением $offset. Далее Смотрим ответ, и если там есть другой next_page->offset то изменяем стартовое значение $offset на новое.
    Цикл повторяется, но в url уже подставится изменённый $offset;

    <?php
    $offset = '2020-03-03';
    while(true)
    {
        //CURLOPT_URL => "https://public.api.openprocurement.org/api/0/plans?offset={$offset}",
       //обработали ответ curl
    
       //смотрим есть ли next_page->offset в ответе
       if(isset($object->next_page->offset))
       {
            if($object->next_page->offset != $offset)
            {
                 $offset = $object->next_page->offset;
                 continue; //возвращаемся в начало while но запрос уже будет с новым $offset
            }
       }
    
        break; //прерываем while так как нету next_page->offset
    }
    Ответ написан
  • Как достать дату регистрации пользователя ВК?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    <?php
    $text = file_get_contents("https://vk.com/foaf.php?id=1488");
    preg_match('|ya:created dc:date="(.*?)"|si', $text, $arr);
    
    $time_create = strtotime($arr[1]);
    $time_current = time();
    
    $check_time = 5/*дн.*/*86400; //5 полных суток
    
    echo "Created: ".date("d-m-Y H:i:s", $time_create)."\n";
    echo "Compare date: ".date("d-m-Y H:i:s", $time_current)."\n";
    
    if(abs($time_current-$time_create) >= $check_time)
    {
        echo "С момента регистрации прошло больше 5 дн."."\n";
    }
    else
    {
        echo "С момента регистрации прошло меньше 5 дн."."\n";
    }


    результат работы

    Created: 02-12-2006 13:10:20
    Compare date: 03-03-2020 22:49:32
    С момента регистрации прошло больше 5 дн.
    Ответ написан
    9 комментариев
  • Почему некорректно работает SQL запрос в PHP коде?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    цикл в цикле
    перезаписывается $i в результате чего цикл прекращается

    for ($i=0; $i < $rows; ++$i) { 
       for ($i=0; $i < $row['rating']; ++$i) {  // <--- перезаписывает изначальный $i
       for ($i=0; $i < 5 - $row['rating']; ++$i) {  // <--- перезаписывает изначальный $i


    Замените в начале $i например на $row_num
    for ($row_num=0; $row_num < $rows; ++$row_num) {
    Ответ написан
    4 комментария
  • Выдает ошибку по памяти XMLReader::XML?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Увеличить лимит памяти на работу скрипта, например до 2гб
    <?php
    ini_set("memory_limit", "2056M"); //выделяем 2Гб памяти на работу скрипта


    Либо научиться как парсить XML потоково. Успешно таким образом парсил XML по 50Gb размером.
    https://drib.tech/programming/parse-large-xml-files-php
    Ответ написан
    Комментировать
  • Как вставить переменную в регулярное выражение PHP?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    https://3v4l.org/25S3Y

    <?php
    $data = <<<HTML
    <a href="/clothing/jacket/">Jacket</a>
    <a href="/clothing/Socks/">Socks</a>
    <a href="/clothing/Shoes/">Shoes</a>
    <a href="/clothing/Skirt/" class="xxx">test Skirt test</a>
    HTML;
    
    $type = 'skirt';
    
    preg_match('!href="([^"]+)"[^>]*?>[^<]*?'.$type.'[^<]*?<!usi', $data, $out);
    
    print_r($out[1]);
    Ответ написан
  • Для переменной надо bindParam или bindValue?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Ключевая разница в том что переменная привязывается по ссылке, и второй абзац намекающий на то что результаты запроса могут изменить значение и даже тип переменной.
    В общем если вы не понимаете зачем оно нужно и какие риски, то надёжнее использовать bindValue().

    PDOStatement::bindParam
    Связывает переменную PHP с именованным или неименованным параметром подготавливаемого SQL-запроса. В отличие от PDOStatement::bindValue(), переменная привязывается по ссылке и ее значение будет вычисляться во время вызова PDOStatement::execute().

    В большинстве случаев в подготавливаемых запросах используются только входные параметры, то есть при построении запроса доступ к ним осуществляется только в режиме чтения. Тем не менее, некоторые драйверы позволяют запускать хранимые процедуры, которые, в свою очередь, могут возвращать данные посредством выходных параметров. Зачастую, такие параметры используются одновременно как входные и как выходные.
    Ответ написан
  • Чем можно открыть vptt - формат видео сообщений вайбер?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Просто взять и открыть не получится, нет такой проги
    На этом форуме есть небольшой анализ формата https://forums.bunsenlabs.org/viewtopic.php?id=5769
    Сам файл представляет из себя архив с 2мя файлами внутри
    Первый файл картинка, второй файл RTP поток
    rtp поток можно преобразовать в видео-файл через ffmpeg, но надо знать кодек, пишут что кодек VP8
    по аудио - кодек opus

    на форуме есть итоговое решение в 2 команды, одна запускает стриминг потока, другая через ffmpeg его захватывает и пишет в mkv.

    ffmpeg -v warning -protocol_whitelist file,udp,rtp -f sdp  -i SDP  -copyts -c copy -y video.mkv

    and then in another termial:
    rtpplay -T -f video 127.0.0.1/4646 & rtpplay -T -f video 127.0.0.1/4848
    Ответ написан
    Комментировать
  • Могут ли знаки в отзыве положить страницу?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Такое возможно. Особенно если отзывы реализованы сторонним плагином, который может содержать ошибки.
    Чтобы защититься, нужно изучить проблему. То есть найти проблемный отзыв (дождаться повторения), и посмотреть логи ошибок сервера чтобы понять что конкретно этот отзыв ломает в системе.
    Исходя из этого уже сделать фильтр который не будет пропускать такие "зловредные" отзывы, либо фильтр который будет их обезвреживать.
    Ответ написан
    2 комментария
  • Вывод и форматирование текста php yii2?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Никаких проблем с тем чтобы хранить HTML в базе нету.
    Это нормальная практика, особенно если посты пишутся с использованием wysiwyg редактора.
    Wordpress так делает.

    Нюансы могут быть только
    - если вам нужно в листинге постов показать часть поста, и тогда можно перед выводом очищать текст от тегов через strip_tags() или хранить в БД 2 версии: html и чисто текстовую версию
    - использовать html sanitizer напр. https://github.com/ezyang/htmlpurifier или https://github.com/tgalopin/html-sanitizer для того чтобы очистить пост от внедрения лишних тегов или каких-то зловредных вещей. Это для случаев когда посты сможет писать кто угодно, и например вы не хотите чтобы они могли внедрить тег <script> и тд.
    Ответ написан
    Комментировать
  • Как получить message_id vk api?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Если это сообщение от бота, то никак.
    Обсуждалось тут Как переслать сообщение в беседу? (см. комменты к первому ответу)
    и тут https://github.com/negezor/vk-io/issues/127

    если у вас message.id = 0 то никак это сообщение вы дальше использовать не сможете (переслать и тд по id)
    Ответ написан
    Комментировать
  • Почему не работет запись в файл?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    вместо $this->$file надо $this->file
    $this->file
    $this->file_DZ
    Ответ написан
    Комментировать
  • Как спарсить данные со страницы?

    nokimaro
    @nokimaro
    Меня невозможно остановить, если я смогу начать.
    Используйте Developer Tools браузера (Ctrl+Shift+i)
    Там при загрузке странице на вкладке network найдёте все нужные запросы для получения данных
    Повторяете их на curl и получите данные в json которые дальше можно распарсить и использовать.

    dka733lgquxwb9alralnd9xyhqk.png
    Ответ написан
    Комментировать