Задать вопрос
Ответы пользователя по тегу PHP
  • Как посмотреть чем занят процесс (php-fpm сайта)?

    @rPman
    /proc/{идентификатор_процесса}/
    содержит кучу информации о процессе, например cmdline - команду запуска, а environ - переменные окружения, fd/... список открытых файловых дескрипторах выглядящих как симлинки на соответствующие файлы или сокеты

    на сколько я знаю, fpm передает подробную информацию о запросе в переменных окружения, так что смотри там

    p.s. формально ты можешь приаттачить отладчик gdb к процессу, но помним что это интерпретатор php, без отладочной информации понять будет что либо сложно
    Ответ написан
    Комментировать
  • Как сделать, чтобы изменения php.ini входили в силу?

    @rPman
    В конфигурационном файле php.ini изменил
    а в каком именно файле произвел изменения?
    в /etc/php есть каталоги по версиям и по apache/cli/... менять настройки нужно в правильном месте
    Ответ написан
    Комментировать
  • Как из статичного метода вызвать динамичный?

    @rPman
    Динамические методы при работе работают с экземпляром объекта (внутри это $this а снаружи эито то что перед '->'), а статические методы не имеют такого объекта и в таком случае нужно явно передавать его.

    В твоем случае например добавить в метод static exec параметр $this (кстати не называй это так, чтобы путаницы не было) либо завести статичную переменную и хранить в ней в виде массива (или последний созданный, в общем под задачу) все экземпляры объекта.

    p.s. весь смысл статичных методов - работа до того как экземпляр объекта создан, например создать его.
    Ответ написан
    Комментировать
  • Как релизовать поиск по сайту без базы?

    @rPman
    у тебя 100 php файлов и в каждом ты определяешь переменные константой, с содержимым куски html?

    пишешь простейший парсер своих php файлов регулярными выражениями (например построчно, все что между '<<
    чуть более интересный способ, пишешь или берешь готовый поисковик по своему сайту (который собирает уже готовые страницы http запросами)

    p.s. в любом случае это извращение
    чтобы нормально работать с данными - они должны быть машиночитаемые, и не важно, в базе данных или в json/serialize файлах
    Ответ написан
    Комментировать
  • Как сбрасывать сессию авторизации пользователя при смене пароля или для выхода на других устройствах?

    @rPman
    Сохраняй идентификатор сессии session_id в базе данных с привязкой к пользователю (1 к М так как пользователь может авторизоваться с разных устройств), при необходимости отзыва доступа (смена пароля или пользователь пожелал) просто удали определенную по этому идентификатору
    session_id($sid);
    session_destroy();
    session_commit();

    механизм сессий в php это просто готовое решение простой базы данных в памяти, и оно становится неудобным при увеличении количества серверов в бакэнде, поэтому возможно сразу все хранить в базе данных кажется более удобным.

    кстати в настройках php можно указать как хранить сессии session.save_handler например redis или memcached, это значит централизованно и немного проще управляться
    Ответ написан
    Комментировать
  • Поддерживает ли PHP асинхронность на уровне ядра языка программрования?

    @rPman
    из коробки в php есть асинхронные методы работы с сокетами, метод socket_select позволяет создать event loop и вести асинхронную коммуникацию

    так же библиотека curl позволяет вести загрузку в фоновом режиме с помощью curl_multi_...

    используя штатные механизмы языка созданы библиотеки по типу ReactPHP с помощью которых можно создавать событийно-ориентированные приложения, например асинхронный websocket и http сервер в одном приложении. Если сравнивать с nodejs, где асинхронность 'из каропки' то реализация на php чуть медленнее но так каксам язык в большинстве случаев работает быстрее, в некоторых случаях код будет работать быстрее (например я писал простейший веб сервис, работающий со сжатыми gzip файлами 'построчно', так вот на nodejs было сильно медленнее, но сам event loop там быстрее)

    p.s. чтобы nodejs по скорости был сравним с php приходится осторожно выбирать какими методами пользоваться, например штатные объекты и массивы там медленнее чем класс Map
    Ответ написан
    3 комментария
  • Почему тормозит код записи в MySQL после разбивки его на функции?

    @rPman
    хоть один пример такой функции показал бы

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

    p.s. гугли - php профилирование вызовов функций
    Ответ написан
    1 комментарий
  • Как запустить php скрипт после ajax запроса?

    @rPman
    Вопрос немного не понятен.
    * Если задача в php скрипте как то отличить обычную загрузку страницы от запроса, то к запросу нужно добавить параметры, это нормальный способ, специально для этого созданный. Параметры могут быть добавлены напрямую в ссылку, это формат запроса http get (используется по умолчанию) или как дополнительные поля запроса http post, в любом случае метод ajax jquery все делает автоматически и достаточно указать данные в settings в виде массива key->value в параметре data
    * Если проблема в том что запрос выполняется параллельно загрузки данных браузером и может быть прерван принудительно браузером или при проблемах с соединением, то типичный способ - запускать свои задачи отдельным приложением (сервисом), с которым веб приложение (то что внутри index.php) должно как то общаться (обычно используют тот же http протокол но это не обязательно, например один из способов - оставить в базе данных задачу, список которых и будет мониторить это приложение). Способов тьма, написано куча решений, особенно когда речь идет о высоконагруженных задачах, но настоятельно рекомендуется решить подобную задачу самостоятельно, благо там нет ничего сложного.
    В данном решении должно появиться понятие задачи, у которой есть статусы новая, исполняется, завершена, ошибка,... а на стороне клиента это соответственно должно обрабатываться.

    Чтобы клиентская сторона оперативно могла получить информацию об окончании запущенной задачи, вместо периодических опросов по таймеру (которые сильно нагружают веб сервер с примерно квадратичной трудоемкостью от количества клиентов) рекомендуется использовать websocket, на стороне сервера должно быть запущено соответствующее приложение (либо отдельное либо сам бакэнд должен быть реализован в виде этого веб сервера) которое будет мониторить состояние задач и рассылать сообщения об их изменении клиентам.
    Ответ написан
    Комментировать
  • Почему PHP кэширует содержимое скрипта при запуске из sudo?

    @rPman
    linux запущен из wsl windows?
    что то похожее (точнее там была разница значений внутри linux контейнера из windows было странно разное)

    для linux это однозначно неправильное поведение, на дефолтном окружении такого поведения не возникает, вспоминай что такое делал с linux что оно так стало вести.

    p.s. консольный php работает без кеширования
    Ответ написан
    6 комментариев
  • Какой есть инструмент для генерация pdf из html на стороне сервера?

    @rPman
    pdf принтер, любой (драйвера ставятся даже с pdf-просмотрщиками, плюс есть опенсорс плюс кажется у майкрософта что то есть), подбираешь под свою операционную систему, настраиваешь его на автоматическое сохранение файлов без запроса у пользователя, и печатаешь что угодно.
    Ответ написан
    Комментировать
  • Как получить данные из второй стоки по подставным значениям из первой?

    @rPman
    окончание искомой строки символ '/' либо конец строки ?

    универсально и просто - регулярные выражения, функция preg_match_all с регуляркой что то типа
    \/(category|product)\/([^/]+)
    Ответ написан
    Комментировать
  • Конвертация телепрограммы в json на php?

    @rPman
    Настоятельно рекомендую не работать с xml/json огромного размера, а размещать информацию в чем то более подходящем, например база данных, ее и обновлять удобнее и запросы делать проще

    По вопросу, использовать нужно потоковые парсера, которые не загружают xml в память а обрабатывают элементы подряд, например xmlreader
    Ответ написан
  • Что быстрее поиск по файлу JSON в PHP или в базе посредством MySQL?

    @rPman
    1000 записей скорее всего можно на клиента выгрузить и в javascript искать это будет самый быстрый вариант

    Базы данных это скорее по удобство скорость поиска с поддержкой записи и расширения размера базы, поэтому это рекомендуется по умолчанию, не обязательно mysql, можно обойтись sqlite

    Если говорить про конкретный случай, то загрузка дампа памяти из файла в готовом виде типа var_export, или лучше igbinary_serialize, будет самым эффективным способом

    Но нужно понимать что если алгоритм поиска сложный, не просто по подстроке, то тут уже сам php будет давать накладные расходы
    Ответ написан
    Комментировать
  • Как оставить в UTF-8 строке только 2х байтовые символы?

    @rPman
    Почти наверняка проблема в обработке строк в csv
    Если наверно обрабатывать все символы включая \n то логично что содержимое колонок перемещается и будет мусор

    У меня не было проблем с fgetcsv но нужно явно указать разделители колонок и "
    Ответ написан
  • Как правильно сделать сохранение "глобальной переменной"?

    @rPman
    Может сначала задачу свою озвучишь?

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

    Так же тестировать такой код сложнее, ведь если поведение класса определяется только его внутренним состоянием, это состояние проще симулировать.

    Но если логика программы даже не подразумевает подобного, то почему нет? Отличный пример - объект базы данных, если программа даже в самых жутких кошмарах не предпологает работу с несколькими базами одновременно, зачем описывать объект Database и таскать ссылку на него в каждом объекте проекта, когда глобальный его экземпляр более чем достаточен (кстати в таких случаях может хватит статики, синтаксически это удобнее).
    Ответ написан
    Комментировать
  • Многопоточность в PHP?

    @rPman
    Зачем на каждое значение из первого файла перечитывать второй?

    Речь не о языке программирования, а о архитектуре приложения. Тебе нужен индекс, некий массив, лоучше в быстрой памяти (оперативной) который бы позволил за минимальное время 'константу' или хотя бы 'логарифм' найти запись во втором файле.

    Обычный массив key-value (array в php) очень эффективно работает, в крайнем случае вместо значений можно хранить хеши (пракда проверить на случай коллизий все же рекомендуется), т.е. тебе достаточно загрузить в оперативную память второй массив, сохранив значения в ключах массива $index[$value]=0, и затем построчно загружать данные из первого файла и проверять isset($index[$value])

    p.s. если же данные в оперативную память сохранять не вариант, используй базы данных, там готовые индексы, оптимизированные на работу с диском, самое простое, начни работать с sqlite
    Ответ написан
    Комментировать
  • Как поставить условие, при невыполнении которого удаляется запись в бд через n-ое время?

    @rPman
    Попробуй переверни логику по другому:
    Не удалять 'по крону' запись, а при чтении из базы выводить только те записи, которые удовлетворяют условию - запись не старее 24h и email_status!=0
    Само же удаление производить когда-нибудь потом, время выбирать уже тебе и разово для всей базы а не для одной записи.
    Ответ написан
    9 комментариев
  • Как, используя PHP, скачать страницу с динамической подгрузкой?

    @rPman
    У тебя 2 основных способа:
    1. разобраться в том как работает этот сайт, какие http запросы отправляет, как их собирает (можно отследить в инспекторе в браузере по F12 закладка network, можно сохранить запросы в json . har файл и анализировать позже, в худшем случае придется анализировать js код) и написать свое приложение, которое будет отправлять те же самые запросы, библиотек полно, например curl, есть одноименная утилита так и поддержка в языках программирования, в т.ч. на php, кстати в инспекторе браузера, нажав правую кнопку мыши на запросе можно скопировать curl команду для его повтора.

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

    2. используя полноценный браузер, например инжектить свой javascript на его страницу с помощью расширения или вставив код прямо в консоль, или используя удаленное управление из своей программы, например selenium

    этот подход заметно проще, например javscript который будет нажимать на кнопку Подписаться на странице хабр qna:
    $('.btn_subscribe').click()
    Помимо всего, этот способ позволяет обойти большинство защит от автоматизации, так как это буквально кликать мышкой по кнопкам но главный недостаток - на каждого пользователя будет требоваться полноценный браузер (иногда можно сэкономить), что очень затратно по ресурсам
    Еще одна проблема этого способа - нет универсального способа определить момент, когда окончилась загрузка страницы, в каждом случае придется выявлять самостоятельно критерии (например появление определенного html элемента), большинство просто выставляют таймаут по больше, но если будут проблемы с интернетом или на стороне веб сервиса, этот подход даст сбой.
    Ответ написан