Вопрос по ubuntu, mysql, apache, php – Реальное max_execution_time для PHP на Linux

5

Согласно документации:

<code>max_execution_time only affect the execution time of the script itself. 
Any time spent on activity that happens outside the execution of the script
such as system calls using system(), stream operations, database queries, etc.
is not included when determining the maximum time that the script has been running.
This is not true on Windows where the measured time is real.
</code>

Это подтверждается тестированием:

Will not time out

<code><?php
set_time_limit(5);
$sql = mysqli_connect('localhost','root','root','mysql');
$query = "SELECT SLEEP(10) FROM mysql.user;";
$sql->query($query) or die($query.'<br />'.$sql->error);
echo "You got the page";
</code>

Will time out

<code><?php
set_time_limit(5);
while (true) {
  // do nothing
}
echo "You got the page";
</code>

Наша проблема заключается в том, что мы действительно хотим, чтобы время ожидания PHP не зависело от того, что он делает, через определенный промежуток времени (поскольку мы не хотим занимать ресурсы, если знаем, что нам не удалось доставить страницу в приемлемом количестве. времени, как 10 секунд). Мы знаем, что можем играть с такими настройками, какMySQL wait_timeout для запросов SQL, но время ожидания страницы будет зависеть от количества выполненных запросов.

Некоторые люди пытались придуматьобходные и это не представляется осуществимым.

Q: Is there an easy way to get a real PHP max_execution_time on linux, or are we better timing out elsewhere, such as Apache level?

Ваш Ответ

3   ответа
1

иrequest_terminate_timeoutпция @ php-fpm. Если вы используете PHP-FPM, это, скорее всего, то, что вам нужно.

Если эта опция установлена, вы можете указать PHP-FPM завершить запрос через N секунд, независимо от того, что делает PHP.

Видетьhttp: //php.net/manual/en/install.fpm.configuration.php#request-terminate-timeou для подробностей.

5

но он обязательно сделает то, что вы хотите, если вы захотите изменить и перекомпилировать PHP.

Посмотрите на исходный код PHP наhttps: //github.com/php/php-src/blob/master/Zend/zend_execute_API. (файлZend/zend_execute_API.c), у функцииzend_set_timeout. Это функция, которая реализует ограничение по времени. Вот как это работает на разных платформах:

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

На Cygwin, используйте itimer с ITIMER_REAL, который измеряет Реального время, включая любой сон, подожди, что угодно, затем поднимитесигна это прерветлюбо обработка и остановка обработки

В других системах Unix используйте itimer с ITIMER_PROF, который измеряет только процессорное время, затраченное текущим процессом (но как в пользовательском режиме, так и в режиме ядра). Это означает, что ожидание других процессов (например, MySQL) не учитывается.

Теперь вы хотите изменить itimer в вашем Linux с ITIMER_PROF на ITIMER_REAL, что, конечно, вам нужно сделать вручную, перекомпилировать, установить и т. Д. Другое различие между этими двумя заключается в том, что они также используют другой сигнал при таймере заканчивается. Поэтому я предлагаю изменить ifdef:

#   ifdef __CYGWIN__

#   if 1

так, чтобы вы установили как ITIMER_REAL, так и сигнал, который ожидает PHP для SIGALRM.

Во всяком случае, вся эта идея не проверена (я использую ее для какой-то очень специфической системы, где ITIMER_PROF не работает, и она Кажется на работу), без поддержки и т. д. Используйте его на свой страх и риск. Он может работать с самим PHP, но может сломать другие модули, в PHPа такж в Apache, если они по какой-либо причине используют сигнал SIGALRM или другой таймер.

-2

Timeout: количество секунд до получения и отправки тайм-аута

Timeout 300

На самом деле, я тестировал с ApacheTimeOut установлен в2 (секунды), и это никак не влияет. Есть ли что-то еще, кромеmod_reqtimeout ты можешь порекомендовать Джона? Max
это не повлияет на обработку PHP kuba

Похожие вопросы