Считается ли время сна для ограничения времени выполнения? - PullRequest
48 голосов
/ 12 апреля 2009

У меня есть два вопроса относительно функции sleep() в PHP:

  1. Влияет ли время ожидания на ограничение максимального времени выполнения моих PHP-скриптов? Иногда PHP показывает сообщение «превышено максимальное время выполнения 30 секунд». Появится ли это сообщение, если я использую sleep(31)?

  2. Есть ли риски при использовании функции sleep()? Стоит ли много производительности процессора?

Ответы [ 5 ]

84 голосов
/ 12 апреля 2009

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

<?php
  sleep(ini_get('max_execution_time') + 10);
?>

Спойлер: В Linux время ожидания игнорируется, но в Windows оно считается временем выполнения.

8 голосов
/ 12 апреля 2009

Это влияет только на время сценария, а не на системные вызовы, такие как sleep () Есть, видимо, ошибка, когда в Windows включен sleep (). Максимальное время выполнения составляет около реального времени, а не процессорного времени или чего-то подобного. Вы можете изменить его, однако:

  • max_execution_time директива в вашем php.ini. Это глобальная настройка;
  • Использование ini_set () с вышеуказанной директивой. Это изменит его только для текущего исполняемого скрипта, только для этого исполнения;
  • set_time_limit () : также локальное изменение.

Что касается разницы между двумя последними, я полагаю, что max_execution_time является фиксированной величиной. Запуск:

ini_set('max_execution_time', 60);

ограничит сценарий до 60 секунд. Если через 20 секунд вы позвоните:

set_time_limit(60);

сценарий теперь будет ограничен до 20 + 60 = 80 секунд.

7 голосов
/ 12 апреля 2009

Со страницы PHP sleep () есть добавленное пользователем примечание:

Примечание: функция set_time_limit () и директива конфигурации max_execution_time влияет только на время выполнения самого скрипта. Любое время, потраченное на деятельность, которая происходит за пределами исполнения скрипт, такой как системные вызовы с использованием system (), функция sleep (), запросы к базе данных и т. д. не включены при определении максимального времени скрипт запущен.

0 голосов
/ 12 апреля 2009

Другие уже рассмотрели основы ограничения времени выполнения сценариев sleep () и PHP, но вам также следует помнить о другом риске при использовании действительно длинных периодов ожидания.

Обычно, когда браузер отправляет запрос на сервер и не получает никаких данных с сервера, время соединения может истечь. Это ограничение по времени зависит от настроек браузера, но я читал, что IE7 имеет значение по умолчанию всего 30 секунд, в то время как Firefox имеет значение по умолчанию 115 секунд - вы можете проверить свою собственную конфигурацию в Firefox перейдя к about: config и отфильтровав для network.http.keep-alive.timeout (ограничение времени указывается в секундах).

Редактировать: у меня смешались модули для network.http.keep-alive.timeout и browser.urlbar.search.timeout. Это действительно в секундах, а не в десятых долях секунды.

0 голосов
/ 12 апреля 2009

а) Да, это считается до предела времени (поэтому режим сна (31) вызовет ошибку)

b) Это противоположно снижению производительности ЦП - оно позволяет другим приложениям использовать ЦП (когда приложение спит, загрузка ЦП этого приложения будет около 0%). Помимо отвлечения времени от пользователя, я не могу думать о каких-либо рисках использования этого.

...