PHP exec with nohup 适用于命令行,但不适用于 http 调用

PHP exec whit nohup works on commandline but not on http calls

我有这个脚本 运行 另一个在后台,没有等待它完成。

我的script.php:

$cmd = "nohup php script2.php > /dev/null 2>&1 &";
exec($cmd);

我的script2.php:

sleep(10);
mail("me@mail.com","test","ok");

如果我在命令行中 运行 它,它工作正常:调用立即完成,10 秒后我的收件箱中收到一封新邮件。

但是如果我用 http://myserver/script.php 调用我的脚本,我不会收到任何东西。

注意使用:

$cmd = "php script2.php > /dev/null 2>&1";

两种调用方式均适用。所以http调用和nohup的使用有问题。

我也尝试过 passthru 和 shell_exec 而不是 exec 得到相同的结果。

为了以防万一,也尝试了 this,但无论如何都行不通。

在您的服务器上创建一个名为 phpinfo.php 的文件。

这个文件只有一行代码:

<?php echo phpinfo() ?>

如果您不确定,这里有一个完整的教程: http://www.inmotionhosting.com/support/website/php/create-phpinfo-page-to-see-php-settings 许多托管公司可能会禁用 exec(),您可能无法更改 php.ini 文件。

如果是这样,最好的办法是从 php 邮件功能开始。 http://php.net/manual/en/function.mail.php

关于 php.ini 的其他信息: 您最初声明它是从命令行运行的,而不是通过浏览器调用运行的,对我来说,php.ini 指令最有可能是罪魁祸首。当 PHP 通过网络服务器执行时,任何脚本的执行都由这些指令决定。最好的参考是 PHP 文档:http://php.net/manual/en/ini.core.php。如果您从服务器上的浏览器 运行 phpinfo.php,您正在寻找一个部分 "Core" 并且在其中 disable_functions table 行。

在我的开发服务器上,有很多功能被禁用;包括 exec() 和 fork()。

如果您可以编辑 php.ini 文件,则可以从行

中删除 exec 函数
disable_functions = 

并重新启动您的网络服务器;尽管我会劝阻它。出于有效的安全原因,该功能已被禁用。