Использовать PHP для выполнения системной команды с длительным периодом ожидания?


Нам нужно распаковать/распаковать очень большой архивный файл на сервере, к которому у нас нет доступа по SSH. Один из наших альтернативных вариантов - выполнить системную команду с помощью PHP, чтобы распаковать файл.

Проблема в том, что для распаковки/распаковки файла требуется довольно много времени. PHP завершает тайм-аут до его завершения.

Есть ли способ заставить команду untar полностью выполняться независимо от того, истекло время ожидания PHP-скрипта или нет? Как асинхронное выполнение?

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

Author: Jake Wilson, 2012-02-28

3 answers

Из руководства :

Функция set_time_limit() и директива конфигурации max_execution_time влияет только на время выполнения самого скрипта . Любое время, потраченное на действия, которые происходят вне выполнения сценария, такие как системные вызовы с использованием system(), потоковые операции, запросы к базе данных и т.д., Не включается при определении максимального время выполнения сценария. Это не относится к Windows где измеренное время равно реальный.

Возможно, происходит то, что у вашего клиента (браузера) истекает время ожидания. Такое отключение может привести к прерыванию работы сценария. Чтобы предотвратить это, вы можете сделать:

ignore_user_abort(true);

Затем вам понадобится второй скрипт, который позволит вам проверить ход выполнения. Одна из идей состоит в том, чтобы записать вывод tar в файл, который ваш второй скрипт может проверить в конце, чтобы убедиться, что это сделано. Другой способ - вызвать сценарий оболочки, который, в свою очередь, запускает tar. Этот сценарий оболочки может либо проверить код возврата и коснитесь файла с его результатами, или он может создать элементарный файл блокировки во время работы.

 1
Author: webbiedave, 2012-02-28 00:11:39

Это должно сработать, если конфигурация вашего сервера не запрещает вам изменять эти значения:

set_time_limit( 0);
ini_set( 'max_execution_time', 0);

См. set_time_limit и max_execution_time.

 0
Author: nickb, 2012-02-27 23:58:14

Если сервер работает в системе *nix, может быть доступна команда nohup. ie

nohup tar ... >outfile.txt

Затем вы могли бы заставить PHP-скрипт сканировать outfile.txt пока операция не закончится

 0
Author: Bjørne Malmanger, 2012-02-28 00:03:56