Избегайте ограничения времени выполнения PHP

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

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

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

Спасибо.

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

Ответ 1

@emanuel:

Я думаю, когда ваш друг сказал вам: "Друг предложил мне войти и выйти из системы часто с сервера, но я не знаю, как это сделать". Он/она, должно быть, имел в виду "Разделить ваш script вычисление на x частей работы и запуск его отдельно"

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

//script имя: 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();

 }

?>

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

Ответ 2

set_time_limit(0)

Ответ 3

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

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

Ответ 4

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

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

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