Мне нужно создать 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 или любого другого.