ФорумПрограммированиеPHP для идиотов → Некорректная обработка max_execution_time

Некорректная обработка max_execution_time

  • Stas86

    Сообщения: 5 Репутация: N Группа: Кто попало

    Spritz 6 февраля 2011 г. 19:19

    Здравствуйте, при переносе сайта на домашний хостинг (есть полный доступ к любым настройкам конфигов) столкнулся с проблемой.

    Скрипты не реагируют на max_execution_time. Можно ставить любое значение, но если запустить скрипт с бесконечным циклом, то он и будет выполняться бесконечно. Что конечно же не совсем устраивает.

    Для иллюстрации приведу небольшой листинг.

    <?php
    $begin = time();
    sleep(90);
    $alltime = time()-$begin;
    echo 'Sleep ' . $alltime . ' seconds<br/>';
    $foo = ini_get('max_execution_time');
    echo 'max_execution_time = ' . $foo;
    ?>


    Скрипт отрабатывает 90 секунд и выводит на экран следующее:

    Sleep 90 seconds
    max_execution_time = 30


    Большая просьба - помочь разобраться. Что может мешать корректной обработке директивы max_execution_time? Мне нужно поставить время выполнения скрипта 30 секунд. Это бы устроило.
  • Lirck

    Сообщения: 1658 Репутация: N Группа: Джедаи

    Spritz 6 февраля 2011 г. 19:33, спустя 13 минут 41 секунду

    Note: The set_time_limit() function and the configuration directive 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(), the sleep() function, database queries, etc. is not included when determining the maximum time that the script has been running.

    Т.е. sleep не учитывается в max_execution_time.
  • Stas86

    Сообщения: 5 Репутация: N Группа: Кто попало

    Spritz 6 февраля 2011 г. 19:52, спустя 18 минут 50 секунд

    Note: The set_time_limit() function and the configuration directive 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(), the sleep() function, database queries, etc. is not included when determining the maximum time that the script has been running.
    Т.е. sleep не учитывается в max_execution_time.
    Спасибо.. Скрипт наподобии этого

    <?php
    $begin = time();
    do
    {
    $curtime = time();
    }
    while($curtime < $begin + 35);
    $alltime = time()-$begin;
    echo 'Sleep ' . $alltime . ' seconds<br/>';
    $foo = ini_get('max_execution_time');
    echo 'max_execution_time = ' . $foo;
    ?>

    действительно не успевает отработать…

    Но мне нужно ограничить время на выполнении как раз операций на внешние действия (работа с файловой системой). sleep() я для примера привел… Как выяснилось - попал пальцем в небо. Вот как ограничить время выполнения скрипта, в котором, к примеру, есть sleep()? Есть ли методы?

    Мне нужно, чтобы абсолютно все скрипты работали максимум 30 секунд. Вне зависимости от их содержимого. Пробовал директиву Апача TimeOut ставить. Не помогает. Что еще можно?
  • fgets

    Сообщения: 1099 Репутация: N Группа: Кто попало

    Spritz 6 февраля 2011 г. 22:58, спустя 3 часа 5 минут 48 секунд

    ещё можно головой подумать, первое что пришло на ум:
    $s = 0;

    function mysleep($time, &$s)
    {
    $s++; if ($s !== 30) sleep($time);
    }

    mysleep(1, $s);
    Спустя 52 сек.
    вернее if ($s < 30)
  • phpdude

    Сообщения: 26646 Репутация: N Группа: в ухо

    Spritz 6 февраля 2011 г. 23:42, спустя 44 минуты 26 секунд

    fgets, пизедц у тебя код :-D
    Спустя 25 сек.
    и подскажи: чем твой гавнокод отличается от строчки $s = 30; sleep(30); ? :D
    Спустя 16 сек.
    еще и со ссылочными переменными … полный пиздец
    Сапожник без сапог
  • Stas86

    Сообщения: 5 Репутация: N Группа: Кто попало

    Spritz 7 февраля 2011 г. 2:18, спустя 2 часа 36 минут 2 секунды

    fgets

    Та ну мне как бы не нужно изобретать новую функцию sleep. Говорю же - для примера ее привел. Просто хочется поставить ограничение и на выполнение подобного скрипта. То есть пишем sleep(90) и если стоит max_execution_time = 30, то скрипт не выполнится. Это так хочется.

    Кстати, в сборке Денвера, которой я пользуюсь в винде - скрипт, который я приводил в начале топика (со sleep) действительно не выполняется. Пишет, что превышено допустимое время в 30 секунд. А вот на хостинге линуксовом - отрабатывает все 90. В чем загвоздка не пойму…
  • Stas86

    Сообщения: 5 Репутация: N Группа: Кто попало

    Spritz 7 февраля 2011 г. 11:20, спустя 9 часов 2 минуты 10 секунд

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

    В общем, вставил на каждой итерации своего бесконечного цикла такую строку:

    $begin = time();
    while(условие)
    {
    if(!$this->mysleep(1,$begin,30))
    return;
    // тело цикла
    }

    , функция mysleep выглядит так:

    function mysleep($seconds,$begin,$limit)
    {
    sleep($seconds);
    if($begin + $limit <= time())
    return false;
    else
    return true;
    }
  • TRIAL

    Сообщения: 988 Репутация: N Группа: Джедаи

    Spritz 7 февраля 2011 г. 12:29, спустя 1 час 8 минут 58 секунд

    А не проще просто написать sleep(5) например? Зачем столько лишних извращений то?
    from TRIAL with LOVE
  • Абырвалг

    Сообщения: 6480 Репутация: N Группа: Джедаи

    Spritz 7 февраля 2011 г. 12:56, спустя 26 минут 24 секунды

    а как обстоят дела с usleep?
  • Stas86

    Сообщения: 5 Репутация: N Группа: Кто попало

    Spritz 7 февраля 2011 г. 18:41, спустя 5 часов 45 минут 3 секунды

    А не проще просто написать sleep(5) например? Зачем столько лишних извращений то?


    Мне нужно, чтобы цикл не выполнялся более 30 секунд. 30 секунд и он обрывается. Как тут уже правильно заметили - max_execution_time не действует на внешние операции…

    а как обстоят дела с usleep?


    Точно также.

Пожалуйста, авторизуйтесь, чтобы написать комментарий!