【问题标题】:PHP exec whit nohup works on commandline but not on http calls带有 nohup 的 PHP exec 可以在命令行上工作,但不能在 http 调用上工作
【发布时间】:2015-04-08 12:51:56
【问题描述】:

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

我的脚本.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,但无论如何都没有用。

【问题讨论】:

  • 而不是/dev/null,你能把输出重定向到一个临时日志文件,看看日志文件中是否列出了任何错误?还要检查您的 /var/log/httpd/error_log 和 /var/log/httpd/access_log 文件是否有错误。
  • thnx Tim:这是找到部分问题的线索......我非常专注于脚本是否正常工作,以至于我在我的开发服务器上进行了虚假测试。
  • 我电脑上的问题是这样的,但我现在可以处理它。 stackoverflow.com/questions/29112446/…
  • @Gorka 您是否找到了使nohup 使用 PHP 处理 HTTP 调用的解决方案?你的解决方案是什么?谢谢!

标签: php exec nohup passthru


【解决方案1】:

在您的服务器上创建一个名为 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,您正在寻找“核心”部分以及其中的 disable_functions 表行。

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

如果您可以编辑 php.ini 文件,则可以从该行中删除 exec 函数

disable_functions = 

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

【讨论】:

  • I BSimpson... 首先,谢谢你的回答。但是,如果您正确阅读了我的问题,则使用 as 命令“php script2.php > /dev/null 2>&1”在这两种情况下都可以正常工作...因此, exec() 在我的服务器上工作正常,因此它具有邮件功能。
  • 只是为了确认:我的本地、开发和生产服务器对我的 Php 核心指令 'disable_functions' 有这个值:没有值
  • 好的。从你的 phpinfo.网络服务器(在我的情况下为 Apache)环境是否将 PATH 设置为包含 nohup 的位置。如果没有,在 $cmd 中设置完整路径,看看它是否有效?并尝试@tim berspine 的建议
  • 另外,由于您运行了 shell_exec,您是否将返回回显给浏览器?是NULL吗?
  • 感谢您的帮助:不幸的是,由于我需要在后台运行 script2.php,它不会返回任何内容...因此,即使script2.php 工作正常(已测试)。 php.net/manual/es/function.shell-exec.php
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-06-20
  • 2012-11-02
  • 1970-01-01
  • 2015-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多