PHP: кодирование долго выполняющихся сценариев, когда серверы ограничивают время выполнения - PullRequest
7 голосов
/ 14 мая 2010

FastCGI-серверы, например, накладывают ограничение времени выполнения для сценариев PHP, которое нельзя изменить с помощью set_time_limit() в PHP. IIS делает это тоже, я считаю.

Я написал скрипт импорта для приложения PHP, который хорошо работает в mod_php, но не работает в FastCGI (mod_fcgid), потому что скрипт убивается через определенное количество секунд. Я еще не знаю, как определить ваш лимит времени в этом случае, и еще не решил, как мне его обойти. Делать это небольшими порциями с перенаправлениями - это похоже на один клудж, но как?

Какие методы вы бы использовали при кодировании долго выполняющейся задачи, такой как задача импорта или экспорта, когда отдельный скрипт PHP может быть завершен сервером через определенное количество секунд?

Предположим, вы создаете переносимый сценарий, поэтому вы не обязательно знаете, будет ли PHP в конечном итоге работать под mod_php, FastCGI или IIS или будет ли установлено максимальное время выполнения на уровне сервера. Это, вероятно, также исключает использование shell-скриптов и т. Д.

Ответы [ 3 ]

4 голосов
/ 14 мая 2010

Использовать интерфейс командной строки PHP , который не подчиняется ограничениям времени скрипта, установленным веб-серверами. Если вам нужно автоматизировать выполнение вашего скрипта, вы можете запланировать его с помощью cron.

0 голосов
/ 14 мая 2010

Делать это маленькими кусками с перенаправлениями - это похоже на один клочок, но как?

Именно так я обработал полную резервную копию базы данных форума (phpBB), когда встроенный механизм экспорта начал превышать ограничение max_execution_time.

Я делал это по одной таблице за раз, и для больших таблиц, состоящих из 5000 строк. (Оказалось, что ограничивающим фактором во всем процессе было не время выполнения экспорта, а фактически размер файла, который phpmyadmin мог обработать при импорте.)

После каждого куска экспорта я возвращал страницу с мета-тегом обновления в заголовке, перенаправляя скрипт обратно к себе с номером таблицы следующего блока и начальной строкой в ​​строке запроса.

<?php if(!$all_done){
    $new_url=$_SERVER['PHP_SELF'].'?tablecount='.$count;
    if(!$tabledone && ""!=$start_row && null!=$start_row){
        $new_url.="&startrow=".$start_row;
    } else {
        $new_url.="&startrow=0";
    }
    echo('<meta http-equiv="refresh" content="0.5;url='.$new_url.'" />');
} ?>

Счетчики были такими, чтобы я мог перебирать массив имен таблиц, которые я получил с помощью SHOW TABLES.

Прежде чем у меня хватило ума отбросить гигантскую таблицу соответствия слов (которую phpBB может перестроить самостоятельно) из экспорта, этот сценарий резервного копирования мог занять более получаса.

0 голосов
/ 14 мая 2010

То, о чем вы на самом деле говорите, это очереди на работу. Это практика асинхронного запуска PHP-кода из запроса внешнего интерфейса. Есть два основных способа сделать это в PHP. Одним из них является использование программы под названием Gearman, другим - использование очереди заданий Zend Server, с которой я лично больше знаком. У меня есть пост в блоге о том, как вы можете это сделать, который называется Do Queue . Я обнаружил, что имеющаяся у меня реализация очень проста в использовании.

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...