У меня есть следующая команда exec()
с символом &
sign в конце, чтобы сценарий работал в фоновом режиме. Однако сценарий не работает в фоновом режиме. Это время в браузере через ровно 5,6 минут. Также, если я закрываю браузер, скрипт не работает.
exec("/usr/local/bin/php -q /home/user/somefile.php &")
Если я запустил скрипт через командную строку, он не истечет. Мой вопрос: как я могу предотвратить таймаут. Как запустить сценарий в фоновом режиме с помощью exec, чтобы он не зависел от браузера. Что я делаю неправильно и на что я должен смотреть.
exec()
вызывается из вашей исполняемой программы, поэтому я предлагаю вам перенаправить выходы на /dev/null
(файл с виртуальной записью, который автоматически потеряет все записанные вами данные).
Попробуйте запустить:
exec("/usr/local/bin/php -q /home/gooffers/somefile.php > /dev/null 2>&1 &");
Примечание: 2>&1
перенаправляет вывод ошибки на стандартный вывод, а > /dev/null
перенаправляет стандартный вывод в этот виртуальный файл.
Если у вас все еще есть трудности, вы можете создать скрипт, который просто выполняет другие скрипты. exec()
следует за процессом, когда он выполняет задачу, но освобождается, когда задача завершена. если исполняемый скрипт просто выполняет другой, задача выполняется очень быстро, и exec выпускается одинаково.
Давайте посмотрим на реализацию. Создайте exec.php
который содержит:
<?php if (count($argv) == 1) { die('You must give a script to exec...'); } array_shift($argv); $cmd = '/usr/local/bin/php -q'; foreach ($argv as $arg) { $cmd .= " " . escapeshellarg($arg); } exec("{$cmd} > /dev/null 2>&1 &"); ?>
Теперь запустите следующую команду:
exec("/usr/local/bin/php -q exec.php /home/gooffers/somefile.php > /dev/null 2>&1 &");
Если у вас есть аргументы, вы можете их также указать:
exec("/usr/local/bin/php -q exec.php /home/gooffers/somefile.php xyz > /dev/null 2>&1 &");
shell_exec()
этого вам нужно будет использовать shell_exec()
:
shell_exec("/usr/local/bin/php -q /home/gooffers/somefile.php &");
При этом, если у вас есть доступ к оболочке, почему бы вам не установить это как cronjob? Я не уверен, почему скрипт PHP вызывает другой запуск такого типа.