увеличить время выполнения скрипта php nginx
Как увеличить время выполнения PHP-скрипта?
Если вы разрабатываете крупный проект, то на обработку некоторых данных ему может потребоваться большое количество времени. На разных хостингах стоят свои лимиты на такие действия, и если сюда вас привела необходимость увеличить это время – то я подробно расскажу, как это можно сделать.
Чтобы вы понимали, о чем идет речь, приведу небольшой пример. При выходе за выставленные рамки времени вы можете получить следующего рода ошибку:
Я расскажу о 4-х способах, как избавиться от нее.
Но стоить начать с того, что в каждом отдельном случае все перечисленные способы могут не работать, так как некоторые хостинг-провайдеры запрещают самим изменять этот параметр.
Увеличение времени выполнения PHP-скрипта через конфигурационный файл php.ini
В качестве первого способа для увеличения времени выполнения скрипта мы будем использовать файл конфигурации php.ini.
Для того чтобы точно узнать, где находится этот файл, прочитайте эту статью.
Открываете его удобным для вас способом и в самый низ вставляете:
Где «300» означает 300 секунд (меняете на свое). Этот файл, к сожалению, не на всех хостингах доступен пользователям для редактирования.
Увеличение времени выполнения PHP-скрипта через встроенную функцию «ini_set»
Второй способ основывается на использовании функции «ini_set». Ее вы вставляете непосредственно в сам файл скрипта, желательно в самый верх. Пример:
Здесь значение «300» вы также сменяете на нужное вам в секундах. Обратите внимание, что при использовании PHP в безопасном режиме эта функция будет недоступна.
Увеличение времени выполнения PHP-скрипта через встроенную функцию «set_time_limit»
Третий способ, наверное, один из самых популярных – использование функции «set_time_limit» для изменения времени выполнения скрипта. Также используется непосредственно в самом файле PHP. Пример:
Здесь «300» вы также изменяете на нужное вам значение. Вставлять код желательно в самом верху.
Последний вариант заключается в редактировании файла .htaccess, который находится в корне вашего сайта (если таковой отсутствует – создайте его).
В самый верх этого файла вставьте:
Значение «300» вы также меняете на свое.
Обратите внимание, что во всех случаях время выполнения скрипта указывается в секундах. Помимо этого, значение параметра во всех способах может принимать «0», что означает неограниченное время выполнения.
Как узнать, сколько времени отведено на выполнение PHP-скрипта?
После того, как одним из способов вы попытались изменить время выполнения скрипта, нужно узнать, действительно ли у вас это получилось.
Для этого создайте PHP-файл в корне вашего сайта, где выведите значение установленного времени:
Если время равняется тому, что вы указали – поздравляем вас, вы достигли желаемой цели. В противном же случае прочитайте статью еще раз, напишите в комментариях о вашей проблеме или направьте ее вашему хостинг-провайдеру.
Проблемы «долгих» скриптов PHP
Внешний таймаут
В первую очередь нужно установить подходящее значение параметра max_execution_time в конфиге PHP.
Веб-сервер может также проксировать запросы на другой веб-сервер, который и запустит PHP скрипт (не редкий пример, nginx — фронтенд, apache — бэкэнд). В этом случае на проксирующем веб-сервере необходимо также настраивать таймаут проксирования. Для apache ProxyTimeout, для nginx proxy_read_timeout.
Прерывание пользователем
Если скрипт запускается в ответ на HTTP-запрос, то пользователь может остановить выполнение запроса в своем браузере, в этом случае прекратит свою работу и PHP скрипт. Если же требуется, чтобы скрипт продолжил свою работу даже после остановки запроса, установите в TRUE параметр ignore_user_abort в конфиге PHP.
Потеря открытых соединений
В таких случаях следует в первую очередь попробовать увеличить таймаут соединения. Например, для MySQL можно выполнить запрос (спасибо Snowly)
Параллельный запуск
В таких случаях можно использовать блокировку используемых ресурсов, но эта задача всегда решается индивидуально. Либо можно просто проверять, не запущена ли другая копия этого скрипта, и либо подождать завершения его работы, либо завершить текущий запуск. Для этого можно просматривать список запущенных процессов, либо использовать блокировку запуска самого скрипта, что то вроде:
Нагрузка на веб-сервер
В случаях, когда долгие скрипты запускаются через веб-сервер, соединение клиента с этим самым веб-сервером остается открытым до тех пор, пока не отработает скрипт. Это не есть хорошо, т.к. задача веб-сервера как можно быстрее обработать запрос и отдать результат. Если же соединение остается висеть, то один из воркеров (процессов) веб-сервера на долгое время будет занят. А если одновременно будет запущено достаточно много таких скриптов, то они могут занять все (ну или почти все) свободные воркеры (для apache см. MaxClients), и веб-сервер просто не сможет обрабатывать другие запросы.
Поэтому следует при обработке запроса пользователя, запускать скрипт в фоновом режиме через php-cli, чтобы не нагружать веб-сервер, а пользователю отвечать что его запрос обрабатывается. При необходимости можно периодически проверять состояние обработки при помощи AJAX запросов.
Вот, пожалуй, и все что я могу рассказать по этой теме. Надеюсь, для кого-то будет полезным.
Оптимизация PHP
Существует ряд правил, которые стоит соблюдать, чтобы увеличить скорость работы приложений на PHP. Правила простые и не потребуют значительных изменений в существующих приложениях.
Fastcgi
FastCGI — это один из вариантов подключения PHP к Web серверу. Лучше всего использовать в связке с Nginx. PHP-fpm (Fastcgi контейнер для PHP) и Nginx по умолчанию поддерживают совместную работу и очень легко настраиваются.
OpCache
Как обычно выполняется PHP скрипт? PHP открывает файл с кодом, компилирует его, затем выполняет. Поскольку файлов может быть много, процесс их открытия, чтения и компиляции может отнимать кучу ресурсов. Если файлы не меняются, то постоянную компиляцию можно и не делать. Лучше сделать ее один раз и закэшировать результат.
Именно это и делает модуль opCache. Результат первой компиляции будет сохранен в кэш, с которым и будет работать PHP. Таким образом это ускорит выполнение за счет отсутствия тяжелого процесса компиляции. Когда файлы изменятся, модуль сам сбросит кэш и обеспечит перекомпиляцию. Короче, этот модуль делает очень полезную экономию ресурсов. И это без необходимости его настраивать.
В версии PHP5.5+ этот модуль поставляется в стандартной сборке. В предыдущих версиях модуль нужно устанавливать самостоятельно. Проверить наличие можно так:
Пустой вывод будет означать, что модуля нет
Если версия слишком ранняя, лучше использовать APC:
apt-cache search php-apc
Это альтернатива opCache, но делает то же самое
Кэширование
Часто код просто медленный. Например:
В этом случае, кэширование данных следует использовать как средство оптимизации.
Для PHP наиболее популярным решением для кэширования является Memcache. Очень простой в использовании и очень быстрый, т.к. поддерживает только самое необходимое.
PHP.ini
Если Вы только установили PHP, убедитесь, что Вы настроили наиболее важные параметры под Ваш сайт. Это также может сэкономить ресурсы:
Сессии
По умолчанию, PHP хранит сессии в файлах. Это довольно эффективное решение. Но когда файлов становится очень много (десятки тысяч), работа с ними будет замедляться в рамках одной папки (особенности файловых систем). В этом случае лучше перенести сессии на Memcache (php.ini):
Кроме этого, такая схема хранения позволит масштабироваться на несколько серверов.
Оптимизация кода
Помните! ООП — это всегда медленно. Объекты нужно создавать, где-то хранить и уничтожать. Не используйте объекты, если они не нужны. Например, тут:
Создаем объект только для того, чтобы сохранить данные в БД
Используем список объектов только для того, чтобы вывести свойство
В этих примерах использование ООП не имеет особого смысла. Зато расходует ресурсы. Старайтесь использовать массивы, когда объекты не нужны.
Избежали создания объекта, функция просто сохраняет данные из массива в базу или тут:
Намного лучше — сделать простую выборку и вывести нужные данные из массива
Мелочи
При работе с файлами используйте абсолютные пути. Тогда не будут происходить лишние операции поиска файла:
Константы классов работают эффективнее, чем define:
Не используем функции в условии for, т.к. они будут повторяться на каждой итерации цикла:
В качестве ключей массивов всегда указывайте строки с кавычками:
Используйте встроенные функции работы со строками вместе регулярных выражений, если это возможно.
Используйте строки с одинарными кавычками:
PHP cron-скрипты
Когда PHP используется для разработки скрипта, который будет выполняться по крону, следует избегать использования глобальных переменных. Частый пример, это просто использование общего массива:
Самое важное
Этот текст был написан несколько лет назад. С тех пор упомянутые здесь инструменты и софт могли получить обновления. Пожалуйста, проверяйте их актуальность.
Анализ медленных PHP скриптов с помощью XHprof
Пример использования очередей на beanstalkd
Правильный подход для кэширования тяжелых запросов
Как работать с Vertica из PHP с модулем ODBC
Как включить хранение PHP сессий в Memcache
Что делать, если часть логики написана на PHP, а часть на NodeJS
Nohup для запуска скрипта в фоне
Архитектурные принципы высоконагруженных приложений
Как работает Server-Sent API с примерами
Методы асинхронных вызовов в PHP
Причины и методы избавления от этой ошибки
Как улучшить время получения первого байта и отзывчивость веб-сервера
Короткие подсказки для создания быстрых PHP приложений
Что такое отказоустойчивость и как ее реализовать в PHP-приложениях
Пример использования очередей на основе Gearman и PHP
Немного о том, что такое singleton и как подключиться к MySQL с помощью него.
Чем вызвана ошибка 500 и как ее исправить в Nginx
Как эффективно использовать цикл foreach в PHP
Как исправить 504 gateway time out Nginx
Веб-сервер Nginx часто работает не только в качестве самого веб-сервера для отдачи контента, но и в качестве прокси, когда он вступает только посредником. Такая ситуация наблюдается намного чаще, чем можно было бы ожидать. Например, при работе с php-fpm и другими модулями динамических языков.
Именно в таком режиме может наблюдаться ошибка 504 gateway time out Nginx. В нашей сегодняшней статье мы попытаемся разобраться почему она возникает и как с ней бороться. Разберем несколько способов решения и причин.
Что значит 504 gateway time out Nginx?
Как я уже сказал, такая ошибка возникает, когда сервер Nginx работает в режиме прокси. Например, при использовании php-fpm или Apache. Дословно, она означает, что превышено время ожидания ответа от сервера. В нашем случае, превышено время ожидания ответа от php-fpm. Рассмотрим несколько причин такого поведения:
Дальше рассмотрим что можно сделать если вы встретились с ошибкой 504 gateway time out Nginx.
Как исправить 504 gateway time out Nginx?
Нагрузку на процессор можно узнать командой htop:
Естественно, если вы видите, что PHP занимает все процессорное время, то значит проблема в ресурсах сервера. Вы можете покопаться в движке своего сайта, пытаться оптимизировать те или иные моменты, об этом будет отдельная статья или же выбрать более мощный VPS сервер.
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
Здесь 300 означает 300 секунд, для большинства скриптов, этого будет вполне достаточно, но вы можете еще больше увеличить значение если это нужно. Также ошибка 504 может возникать, когда Nginx используется в качестве прокси для Apache или любого другого веб-сервера, тогда нужно еще настроить время ожидания для прокси. Добавьте эти строки в секцию server:
proxy_connect_timeout 600;
proxy_send_timeout 600;
proxy_read_timeout 600;
send_timeout 600;
sudo systemctl restart nginx
Более подробную информацию иногда можно увидеть в error.log:
Дальше, если проблема именно в php-fpm, вы можете отследить какие скрипты выполняются медленно с помощью встроенной функции slow-log. Для ее активации добавьте следующие строки в конфигурацию вашего пула:
sudo vi /etc/php-fpm.d/www.conf
slowlog = /var/log/php-fpm/www-slow.log
request_slowlog_timeout = 5s
Здесь 5 секунд, означает, что в лог файл будут добавляться скрипты, которые выполняются дольше пяти секунд. Вы можете менять это значение по своему усмотрению. В логе вы сможете увидеть не только сами скрипты, но и трассировку методов, которые привели к проблемам:
Дальше останется только разобраться что с этим делать, например, оптимизировать скрипты или отключить лишние плагины.
Выводы
В этой статье мы рассмотрели как исправить 504 gateway time out Nginx 1.2 7, а также почему может возникнуть эта ошибка. Надеюсь, эта информация была полезной для вас.
Русские Блоги
nginx+php появиться 502 bad gateway Вообще это не nginx Проблема, но из-за fastcgi или php Проблемы, вызванные следующим, являются общими.
php.ini из memory_limit Слишком маленький (если есть человек php (Это необходимо отметить, когда процесс программы должен занимать большой объем памяти)
вид журнал ошибок nginx Найдено pstream sent too big header while reading response headerfrom upstream Тогда проверь client head buffer , fastcgi buffer size Является ли он слишком маленьким, можно установить на 32K 。
Время выполнения программы php слишком велико и время ожидания истекло. Проверьте различные настройки времени ожидания в nginx и fastcgi. (В nginx fastcgi_connect_timeout 300; 、 fastcgi_send_timeout 300; 、 fastcgi_read_timeout 300; 、 keepalive_timeout в php-fpm request_terminate_timeout В php.ini max_execution_time )
Наконец, позаимствуйте масло Wanjin онлайн, чтобы подвести итог: процесс php-cgi недостаточен, время выполнения php слишком велико или процесс php-cgi умирает, все 502 ошибки произойдут.
Ошибка 502 не будет видна всем операторам, которые запускают PHP с nginx
Существует множество причин для nginx 502, но большинство причин можно объяснить недостаточным количеством ресурсов, то есть существует проблема с обработкой бэкэнда php-fpm, nginx отправляет правильный запрос клиента в бэкэнд-процесс php-fpm, но поскольку Проблема с процессом php-fpm привела к тому, что код php не был проанализирован правильно, и в итоге был возвращен клиенту с ошибкой 502.
Причина появления сервера 502 заключается в том, что время соединения истекло. Мы отправляем запрос на сервер. Поскольку на сервере слишком много ссылок, сервер не может дать нормальный ответ. Возникает ошибка такого типа.
Поэтому, если ваш сервер имеет очень большое количество параллелизма, вы можете сначала только увеличить машину, а затем оптимизировать ее следующим образом для достижения лучших результатов, но если ваш параллелизм не велик, но появляется 502, это обычно может быть связано с проблемами конфигурации и проблемами тайм-аута сценария.
1. Количество процессов php-fpm недостаточно
Но это не может быть изменено бесконечно. Вы можете отрегулировать количество подпроцессов php-fpm до 100 или более в соответствии с памятью сервера, 200 на сервере с памятью 4G.
2. Увеличьте количество открытых файлов в ядре Linux
Вы можете использовать эти команды (должна быть учетной записью root)
3. Тайм-аут выполнения скрипта
Если по какой-либо причине скрипт не возвращается в течение длительного времени и новый запрос не может быть обработан, вы можете соответствующим образом настроить следующую конфигурацию.
Nginx.conf в основном выглядит следующим образом
fastcgi_connect_timeout 300;
fastcgi_send_timeout 300;
fastcgi_read_timeout 300;
Если php-fpm.conf выглядит следующим образом
4. Настройки кеша относительно невелики
Изменить или добавить конфигурацию в nginx.conf
proxy_buffer_size 64k;
proxy_buffers 512k;
proxy_busy_buffers_size 128k;
Возможная причина: в компьютерном зале потеряны пакеты или в компьютерном зале установлен аппаратный брандмауэр, который запрещает доступ к имени домена.
Но самое главное, чтобы установить тайм-аут в программе, не используйте php-fpm из request_terminate_timeout ,
Лучший набор request_terminate_timeout=0;
Другой, чтобы сказать больше, эта вещь должна увеличить интерактивность сайта, но реакция будет медленной, если вы будете использовать его больше. Если ваш сайт истекает, и вы используете его, вы можете закрыть его.
6. Решение по 502:
Отрегулируйте и увеличьте отставание от php и Nginx.
PHP-FPM решение с высокой нагрузкой
Здесь только вводится метод оптимизации php-fpm, но в целом при использовании в сочетании с nginx, если один из них оптимизирован отдельно, эффект не особенно велик, и nginx необходимо оптимизировать. Ссылка на метод практики Nginx:http://blog.haohtml.com/archives/6213 Приведенные выше графики до и после оптимизации показывают, что разрыв между до и после особенно велик.
PHP-CGI (FASTCGI) приводит к плохому шлюзу nginx 502
Ошибка частого взрыва NGINX 502 BAD GATEWAY не была полностью решена после прочтения онлайн-учебника.
В настоящее время я кратко описываю способы решения проблемы 502 BAD GATEWAY: 1. В зависимости от производительности сервера увеличьте значение max_children в php-fmp.conf, который я сейчас использую
Регулярно перезагружайте php-fpm с параметром reload. Основная причина в том, что время выполнения скрипта php слишком велико, и перегрузка php-fpm может устранить эту проблему. Как полностью решить сценарий php-cgi занимает много памяти, в результате чего 502 ошибки также заслуживают дальнейшего обсуждения, в настоящее время этот подход является хорошим способом.
Конкретный метод заключается в использовании crontab для плавного перезапуска php-fpm, чтобы не влиять на работу сценариев PHP.
/10 * * * /usr/local/php/sbin/php-fpm reload
When you running a highload websitewith PHP-FPM via FastCGI, the following tips may be useful to you : )
Если ваш высоконагруженный веб-сайт использует PHP-FPM для управления FastCGI, эти советы могут быть вам полезны 🙂
1.Compile PHP’s modules as less as possible, the simple the best (fast);
Increas PHP FastCGI child number to 100 and even more.Sometime, 200 is OK! ( On 4GB memory server);
Измените способ связи Nginx и FastCGI с TCP на UnixSocket. TCP более стабилен, чем UnixSocket, при высоком параллельном доступе, но Unix Socket работает быстрее, чем TCP.
fastcgi_pass unix:/tmp/php-cgi.sock;
source /etc/profile
vi /path/to/php-fpm.conf
Change 1024 to 4096 or higher number.
vi /path/to/php-fpm.conf
Измените 1024 на 4096 или выше
.
Перезапустите PHP-FPM.
6. Using PHP code accelerator,e.g eAccelerator, XCache. And set “cache_dir” to /dev/shm on Linux.
6. Используйте ускоритель php-кода, такой как eAccelerator, XCache. На платформе Linux вы можете поставить cache_dir Укажите на / dev / shm
Интеллектуальная рекомендация
Массив объектов
Сравнение и анализ стратегий резервного копирования MySQL
Просмотр базы данных удаленного андроид устройства
Метод 1: ADB подключен к устройству, используя файл устройства Android-студии Android ADB подключение к устройству Android Экспорт файла с использованием в качестве файла устройства Explorer Способ 2.