Ответы пользователя по тегу PHP
  • Где применяются key(), next(), current()?

    @rPman
    Где применяются key(), next(), current()?
    а так же reset, end и другие, использут в случаях когда работу с элементами списка нужно вести либо вне главного цикла (т.е. он вывернут наружу и использовать классический foreach не удобно), или когда необходимо параллельно работать одновременно с несколькими циклами.

    Причина банальна - в php не существует переменной - итератор, указателя на текущий элемент массива key-value массива (в терминологии javascript объектом). Это значение зашито и хранится в самом массиве.
    Ответ написан
  • Как определить используемые методы сторонней библиотеки в приложении на PHP?

    @rPman
    Можно попытаться использовать статические анализаторы кода, а можно подключить библиотеку и проанализировать классы и методы в режиме выполнения.
    Смотреть тут, т.е. получаешь список зарегистрированных классов get_declared_classes и для каждого по имени запрашиваешь список методов get_class_methods, в догонку то же самое можно сделать с функциями get_defined_functions

    И помним, что очень часто разработчики библиотек почему используют динамические имена переменных и методов класса, настроив колбек на undefined method, в этом случае список таких методов узнать автоматически невозможно.
    Ответ написан
  • Как добавить html код в функцию php?

    @rPman
    Так как php - это язык шаблонов, без тега это html в чистом виде (точнее то что должен выдать сервер) то значит если закрыть тег ?> то все что до открытия следующего <?php будет выводиться

    т.е. например так:

    <?php
    /* блаблабла код на php */
    ?>
    <div class="modal fade" id="myModal_'<?=$item->id; ?>">
    ...
    <?php
    /* блаблабла код на php */
    ?>


    Подстановка значений (выражений) можно так же кусками на php делать или используя <?=expression ?>

    Все это работает корректно как инструкция, т.е. будут работать блоки { }, и обычно редакторы корректно расставляют подсветку синтаксиса для таких вставок
    Ответ написан
    Комментировать
  • Php как написать правильно echo script a href с переменной?

    @rPman
    Так как php - это язык шаблонов, без тега это html в чистом виде (точнее то что должен выдать сервер) то значит если закрыть тег ?> то все что до открытия следующего <?php будет выводиться

    т.е. например так:

    /* блаблабла код на php */ ?>
    <script>$('.title-link__element > svg').wrap('<a href='<?= $url ?>'></a>')</script>
    <?php /* блаблабла код на php */


    внимание, в месте где нужно вставить значение переменной $url я привел пример <?=$url ?> это будет работать если включить в php.ini опцию short-open-tag а так можно обойтись обычным echo

    Все это работает корректно как инструкция, т.е. будут работать блоки { }, и обычно редакторы корректно расставляют подсветку синтаксиса для таких вставок
    Ответ написан
  • Как сократить данный код?

    @rPman
    @$this->test[$id]+=$this->test[$id]<3?1:0;
    с выводом текста совсем коряво
    @$this->test[$id]+=$this->test[$id]<3?print("получил"):1-print("нельзя");


    но не надо так делать
    Ответ написан
    Комментировать
  • Проходить только один раз по ключу в Foreach PHP?

    @rPman
    Можно пересоздать массив, используя в качестве идентификатора то что должно быть уникальным (актуально если сами элементы не уникальны но нужно учитывать от их данных только часть, или же там не хранятся данные а только способ их получить и array_unique не прокатит)

    $tmp=[];
    foreach($data as $item)
       $tmp[$item->id]=$item;
    
    foreach($tmp as $id=>item)
      // do smthng
    Ответ написан
    Комментировать
  • Как вытащить переменную PHP из .php файла в .html-файл с помощью AJAX?

    @rPman
    на сервере php файл должен возвращать, к примеру json
    echo json_encode($my_cool_object);

    на клиенте, jquery должен делать запрос
    $.get('my_cool.php',function(data){alert(data);},'json')
    Ответ написан
    8 комментариев
  • Как спарсить сайт через PHP с более 30 тыс. ссылками?

    @rPman
    Варианты
    - запустить 10-100 своих парсеров параллельно и подправить код чтобы они брали следующую ссылку из какой-нибудь базы данных, учитывающей транзакции многопользовательского доступа или блокировки.
    - переделать парсер так же работающий в одном потоке, но использующий к примеру curl_multi, когда запросы к сайту идут асинхронно

    И помним, админу сайта может не понравиться 100500 запросов к их серверу, так как это похоже на ддос.
    Ответ написан
    Комментировать
  • Как создать мгновенно самоперезапускающийся скрипт php?

    @rPman
    while(true);do php some.php;sleep 1;done
    sleep 1 это чтобы между запусками была пауза, можешь убрать но если ошибка будет возникать сразу при запуске, такой скрипт будет жрать ресурсы просто так, что иногда выходит в копеечку в облачных хостингах с оплатой за ресурсы.

    не забудь отметить ошибку в логе чтобы реагировать на них
    Ответ написан
    Комментировать
  • Как получить историю транзакций с биржи Poloniex?

    @rPman
    Обычно наоборот, работают с текущего момента времени и в прошлое, пока данные в принципе возвращаются.

    Устанавливая только end на время самой первой сделки в предыдущем запросе минус 1
    Ответ написан
  • Можно ли написать try-catch один раз?

    @rPman
    Написать можно но смысла в этом практически нет, а вреда полно

    В момент ошибки вместо записи ее в логи сервера, эта ошибка выпадет у клиента, или верстка сломается и страничка будет кривая и непонятная. 99% пользователей увидят, закроют и пойдут дальше, не возвращаясь, а ты так об этом и не узнаешь.

    Если try catch будут не единственными, то корневой имеет смысл чтобы отлавливать 'все остальные' ошибки и отправлять их в свой собственный лог (чтобы их поправить само собой)... ну кому как удобно
    Ответ написан
  • Как правильно работать с большим количеством данных?

    @rPman
    Избавляйся от ... where fld like '%...%' это самые плохие по скорости запросы, хотя не всегда это возможно без увеличения размера базы, вообще полнотекстовый поиск можно отдавать на откуп стороннему приложению (это может расширить возможности фильтрации), считай это еще одной формой индекса, хотя лучше данные по другому хранить. Я встречал ситуации когда в varchar хранили значения справочника из десятка значений, но делали по нему like %% что грузило базу прилично, когда как сделать простой комбобокс на порядок эффективнее и удобнее - поиск по подстроке лучше по справочнику делать на клиенте.

    Без индексов скорее всего никуда, если в запросе идет фильтрация по полю, то если не создать на него индекс, этот запрос и будет создавать нагрузку

    В некоторых специфических случаях, можно делать запросы заранее (для более шустрой пагинации например), запрашивая сразу несколько страниц наперед, с учетом движения вперед (и возможно назад, в общем прогноз должен предполагать что перелистывание продолжится), запрос на будущие записи делать заранее, пока пользователь смотрит текущий результат. Недостаток подхода - при удачном прогнозе действий пользователя отзывчивость интерфейса повышается, как и средняя нагрузка на базу. Так же добавляет отзывчивости если окно запроса будет больше окна отображения (т.е. для отображения 10 строк запрашиваешь 30, начиная с предыдущей страницы)

    Частный случай прогноза, не делать select ... limit ... на каждую страницу, а при смене фильтра запрашивать весь диапазон, но только идентификаторы, сохранив их либо в таблице на сервере либо на бакэенде, генерирующим запросы вида select ... id in (...), последнее если количество записей не больше тысяч. Кстати именно постраничная навигация с прогруженным списком id самая шустрая

    Кешируй результаты запросов, можно на клиенте, можно даже средствами браузерного кеша, очень часто работа человека состоит в перемещении туда сюда по своим запросам, так зачем нагружать лишний раз сервер тем что уже известно. Осторожно с инвалидацией данных, и кстати не всегда она так уж и критична.

    Некоторые фильтрации данных возможно эффективнее делать на клиенте, как бы это странно не звучало, но клиент по скорости работы может даже превосходить сервер, так почему бы часть данных не хранить в принципе на нем и не фильтровать там же, но это зависит от особенности данных, гонять и хранить гигабайты клиенту не удобно (особенно если это браузер). Это может сильно усложнить алгоритм пагинации, но подумай, так ли человеку нужно знать какой номер строки у него сейчас, обычно достаточно понимать общий прогресс (сколько примерно до конца списка и сколько данных в принципе).

    p.s. диск на сервере hdd или ssd? если не хватает денег на большой ssd, настрой маленький ssd как кеш к медленному hdd (linux bcache), даже когда данные полностью не влезают в кеш, это дает заметный прирост, потому что hdd начинает менее случайно двигаться, плюс добавляется буферизация записи (данные записываются на ssd и лежат там пока hdd не освободится), так же дает эффект ускорения записи вынос журнала файловой системы (если ext4) на ssd (требуется пара гигабайт от силы).

    Осторожно, если высокие требования к надежности хранения, кеширующий ssd в режиме записи лучше пусть будет хотя бы raid1, так как иначе при смерти ssd починить данные, размазанные по диску и кешу будет очень сложно. Для кеша только для чтения это не так критично (при смерти ssd сервер просто упадет, не убивая данные).

    Но мне больше нравится резервирование на лету (настроить онлайн репликацию, пусть и на слабый, бакап сервер)
    Ответ написан
    1 комментарий
  • Как передать байтовую строку из python скрипта в PHP?

    @rPman
    preg_replace_callback('/\\\\x([0-9a-f]{2})/',function($m){return hex2bin($m[1]);},закодированная строка);
    Ответ написан
    Комментировать
  • Почему при копировании в инпут буквы "ё" появляются проблемы у strtr?

    @rPman
    проверяй кодировку, причем она должна совпадать как в заголовках http, так и на странице и в коде.

    совет, для utf8 используй mb_... аналоги функций, куча странных проблем уйдет
    Ответ написан
    Комментировать
  • Можно ли как то вычислить контрольную сумму для папки?

    @rPman
    Запакуй папку tar-ом, без сохранения архива, через пайпы передай в md5sum, получишь результат
    $md5=explode(' ',`tar -cf - /path/to/dir | md5sum`)[0];
    upd. осторожно, используй относительные пути а не прямые, так как этот путь файлов так же хешируется

    на php делать все будет тупо сложнее и медленнее

    p.s. новые версии tar поддерживают --order=name чтобы гарантировать хоть какой то порядок файлов
    Ответ написан
    Комментировать
  • Помощь с POST запросом php?

    @rPman
    Измени теги вопроса, так как у тебя сторона браузера, т.е. Javascript

    Делать это с помощью ajax запроса или самостоятельно собирать с помощью xmlhttprequest
    Ответ написан
    Комментировать
  • Как отредактировать doc/docx на PHP?

    @rPman
    docx, это zip архив с набором текстовых xml файлов, простейшие манипуляции с текстом там максимально простые, хотя формат и не простой, но в большинстве задач в дебри залезать не придется.
    Ответ написан
    Комментировать
  • Параллельные запросы к СУБД во время отсутствия кэша записи - какой алгоритм?

    @rPman
    Проблема не в кеше и его экспирации, проблема именно в генерации контента, когда данных в кеше нет либо когда требуется его перегенерация при изменениях данных.

    Определенно, необходимо отлавливать эту ситуацию и останавливать генерацию контента на всех страницах кроме одной, буквально - 'тормозить, чтобы двигаться быстрее'.

    Вариант реализации - метод, в котором генерируется контент, используя in memory key-value базу данных (наверное лучше не memcached, так как оно не гарантирует сохранность данных, хотя если администрировать с оглядкой на это, почему нет, можно предложить складывать в memcache определенное значение перед стартом генерации, и проверять именно на него), отмечает начало и конец этого процесса, со ссылкой на идентификатор этих данных (страница сайта например), т.е. запись появляется только на время генерации данных, и при наличии записи тормозит процесс.

    Логично было бы не делать случайный sleep для этого, а ждать ивент от соседнего процесса, в идеале средствами этой базы данных
    Ответ написан
    2 комментария
  • Можно ли сымитировать отправку POST запроса?

    @rPman
    curl - мощная утилита и одноименная библиотека (в php есть curl_init/curl_setopts/curl_exec) позволяет создать http запрос

    Браузеры в отладочной консоли (network monitor) позволяют на выбранном запросе из лога (нажав правую кнопку - copy - copy as curl) получить готовую строчку запуска curl полностью симулирующю его.
    Ответ написан
    1 комментарий
  • Как запустить python скрипт из под php?

    @rPman
    Добавь в команду 2> err.txt

    Проверь что можешь писать в текущий каталог

    Вместо shell_exec попробуй passthru($cmd,$return_int) сможешь увидеть код возврата $return_int а еще этот метод не съедает вывод программы
    Ответ написан
    Комментировать