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

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

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

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

Спасибо.

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

6
задан Emanuel 27 January 2010 в 14:50
поделиться

4 ответа

@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();

 }

?>

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

2
ответ дан 17 December 2019 в 20:32
поделиться
set_time_limit(0)
0
ответ дан 17 December 2019 в 20:32
поделиться

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

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

0
ответ дан 17 December 2019 в 20:32
поделиться

Используйте 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=phpphertparallellel5processing Или хранить входные данные и компьютер с другим внешним сценарием с помощью крона или что-то еще.

0
ответ дан 17 December 2019 в 20:32
поделиться
Другие вопросы по тегам:

Похожие вопросы: