带有nohup的PHP exec可以在命令行上运行,但不能在http调用上运行

时间:2015-04-08 12:51:57

标签: php exec nohup passthru

我有这个脚本在后台运行另一个脚本,而不是等到它完成。

我的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以防万一,但它在任何情况下都无效。

1 个答案:

答案 0 :(得分:0)

在服务器上创建一个名为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通过Web服务器执行时,任何脚本的执行都由这些指令决定。最好的参考是PHP文档:http://php.net/manual/en/ini.core.php。如果您从服务器上的浏览器运行phpinfo.php,那么您正在寻找一个部分&#34; Core&#34;并在其中的disable_functions表行。

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

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

中删除exec函数
disable_functions = 

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