Избегайте ограничения по времени выполнения PHP - PullRequest
6 голосов
/ 27 января 2010

Мне нужно создать скрипт на языке PHP, который выполняет перестановку чисел. Но PHP имеет ограничение по времени выполнения, установленное на 60 секунд. Как можно запустить скрипт так, чтобы, если вам нужно запустить более 60 секунд, не были прерваны сервером. Я знаю, что могу изменить максимальный лимит времени выполнения в php, но я хочу услышать другую версию, которая не требует заранее знать время выполнения скрипта.

Друг предложил мне часто входить и выходить с сервера, но я не знаю, как это сделать.

Любой совет приветствуется. Пример кода будет полезен.

Спасибо.

Сначала мне нужно ввести число, скажем, 25. После этого скрипт запускается, и ему нужно сделать следующее: для каждого числа <= 25 он создаст файл с числами, сгенерированными на текущая стадия; для следующего числа он откроет файл, созданный ранее, и создаст другую файловую базу на строках открытого файла и так далее. Поскольку это занимает много времени, мне нужно избегать прерывания работы сценария сервером. </strong>

Ответы [ 4 ]

2 голосов
/ 27 января 2010

@ emanuel:

Полагаю, когда ваш друг сказал вам: «Друг предложил мне часто входить и выходить с сервера, но я понятия не имею, как это сделать». Он, должно быть, имел ввиду х работ и запустите отдельно "

Например, с помощью этого скрипта вы можете выполнить его 150 раз, чтобы получить 150! (факторинг) и показать результат:

// имя скрипта: calc.php

<?php

 session_start();

 if(!isset($_SESSION['times'])){

    $_SESSION['times'] = 1;

    $_SESSION['result']  = 0;

 }elseif($_SESSION['times'] < 150){

    $_SESSION['times']++;

    $_SESSION['result'] = $_SESSION['result'] * $_SESSION['times'];

    header('Location: calc.php');

 }elseif($_SESSION['times'] == 150){

    echo "The Result is: " . $_SESSION['result'];

    die();

 }

?>

Кстати, @Davmuz, вы можете использовать функцию set_time_limit () только на серверах Apache, на серверах Microsoft IIS это недопустимо.

0 голосов
/ 27 января 2010

Вы можете попытаться поместить вызовы, которые вы хотите сделать, в очередь, которую вы сериализуете в файл (или кэш-память?), Когда операция завершена. Затем вы можете использовать CRON-демон для выполнения этой очереди каждые шестьдесят секунд, чтобы он продолжал выполнять работу и завершал задачу.

Недостатками этого подхода являются проблемы с добавлением в очередь, с блокировкой файлов и тому подобное, и если вам нужны результаты немедленно, это может оказаться проблематичным. Если вы добавляете материал в базу данных, это может сработать. Кроме того, это не очень эффективно.

0 голосов
/ 27 января 2010

Используйте set_time_limit (0), но вы должны отключить safe_mode: http://php.net/manual/en/function.set-time-limit.php Я предлагаю использовать фиксированное время (set_time_limit (300)), потому что если в скрипте есть проблема (бесконечные циклы или утечки памяти), это не может быть источником проблем.

Веб-сервер, как и Apache, также имеет максимальный лимит времени 300 секунд, поэтому его нужно изменить. Если вы хотите создать приложение Comet, может быть лучше выбрать другой веб-сервер, чем Apache, который может иметь длительные запросы.

Если вам требуется длительное время выполнения тяжелого алгоритма, вы также можете реализовать параллельную обработку: http://www.google.com/#q=php+parallel+processing Или сохраните входные данные и компьютер с помощью другого внешнего сценария с cron или чем-либо еще.

0 голосов
/ 27 января 2010
set_time_limit(0)
...