5

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

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

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.

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

Will not time out

<?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";

Will time out

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

Наша проблема заключается в том, что мы действительно хотим, чтобы время ожидания 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?

  • Error: User Rate Limit ExceededTimeOutError: User Rate Limit Exceeded2Error: User Rate Limit Exceededmod_reqtimeoutError: User Rate Limit Exceeded

    от Max
  • Error: User Rate Limit Exceeded

    от
  • -2

    С httpd.conf:

    Timeout: The number of seconds before receives and sends time out

    Тайм-аут 300

  • 1

    Error: User Rate Limit Exceeded

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

    Увидетьhttp://php.net/manual/en/install.fpm.configuration.php#request-terminate-timeout

  • 5

    Error: User Rate Limit Exceeded

    Zend/zend_execute_API.czend_set_timeout

    on Windows, create a new thread, start a timer on it, and when it finishes, set a global variable called timed_out to 1, the PHP execution core checks this variable for every instruction, then exits (very simplified)

    on Cygwin, use itimer with ITIMER_REAL, which measures real time, including any sleep, wait, whatever, then raise a signal that will interrupt any processing and stop processing

    on other unix systems, use itimer with ITIMER_PROF, which only measures CPU time spent by the current process (but both in user-mode and kernel-mode). This means waiting for other processes (like MySQL) doesn't count into this.

    #   ifdef __CYGWIN__
    

    в

    #   if 1
    

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

    seemsand