У меня есть этот скрипт, который запускает другой в фоновом режиме, не дожидаясь его завершения.
Мой скрипт.php:
$cmd = "nohup php script2.php > /dev/null 2>&1 &";
exec($cmd);
Мой скрипт2.php:
sleep(10);
mail("[email protected]","test","ok");
Если я запускаю его в командной строке, он работает нормально: звонок завершается сразу же, и через 10 секунд я получаю новое письмо в свой почтовый ящик.
Но если я позвоню на мой сценарий с Http: //myserver/script.php, Я ничего не получаю.
Обратите внимание, что с помощью:
$cmd = "php script2.php > /dev/null 2>&1";
работает в обоих вызывающих методах. Так что что-то не так с http-вызовом и использованием nohup.
Я также попробовал passthru и shell_exec вместо exec с теми же результатами.
Также попробовал этот на всякий случай, но это не сработало ни в коем случае.
Создайте файл на своем сервере с именем phpinfo.php.
Этот файл будет иметь только одну строку кода:
<?php echo phpinfo() ?>
Если вы не уверены, здесь есть полное руководство:
http://www.inmotionhosting.com/support/website/php/create-phpinfo-page-to-see-php-settings
Многие хостинговые компании могут отключить exec (), и вы не сможете изменить файл php.ini.
Если так, то лучше всего начать с функции php mail.
http://php.net/manual/en/function.mail.php
Дополнительная информация о php.ini:
Ваше первоначальное утверждение, что оно работает из командной строки, а не из вызова через браузер, делает для меня директивы php.ini наиболее вероятным виновником. Когда PHP выполняется через веб-сервер, выполнение любого сценария продиктовано этими директивами. Лучший справочник — документация PHP: http://php.net/manual/en/ini.core.php. Если вы запускаете phpinfo.php из браузера на вашем сервере, вы ищете раздел «Ядро» и в нем строку таблицы disable_functions.
На моем сервере разработки есть много отключенных функций; в том числе exec () и fork ().
Если вы можете редактировать свой файл php.ini, вы можете удалить функцию exec из строки
disable_functions =
и перезапустите ваш веб-сервер; хотя я бы обескуражил это. Эта функция отключена из соображений безопасности.
Других решений пока нет …