【问题标题】:PHP errors not displayed when script run via exec()通过 exec() 运行脚本时未显示 PHP 错误
【发布时间】:2016-06-06 13:23:21
【问题描述】:

我有一个通过 exec 函数从其他 php 脚本运行的 php 脚本:

exec("php /home/www/someScript.php 1>> /home/www/log.txt 2>&1");

log.txt 仅包含以下错误消息以防出错:

ERROR: the server encountered an internal error and was unable to complete your request.

但是当我使用 CLI 中完全相同的命令手动运行它时,我得到以下信息(和正确的输出):

PHP Fatal error:  Call to a member function toArray() on a non-object in /home/www/someScript.php on line 50
ERROR: the server encountered an internal error and was unable to complete your request.

致命错误抑制的原因是什么,如何正确输出到日志中?

谢谢。

【问题讨论】:

  • 你为什么要以上帝的名义这样做?我的意思是,为什么不直接使用include?
  • @HenriqueBarcelos 它是独立的脚本,例如也可以从 crontab 运行。
  • 顺便说一下,你应该从你的“someScript.php”文件中发布代码,否则我们帮不了你。
  • 不管它是独立的,在PHP中使用exec来调用另一个PHP脚本是没有意义的。
  • @HenriqueBarcelos 包含脚本中的错误会杀死主要脚本。我不希望这样,这很容易单独记录。无论我是从 cron 还是通过 exec 手动运行它,我都希望行为是相同的。

标签: php error-handling command-line-interface


【解决方案1】:

这不会解决您的问题,因此可能不是答案,但也不适合评论。

正如我在 cmets 部分所说,尝试使用 include 和 set_error_handler。

set_error_handler(function($errno, $errstr, $errfile, $errline, array $errcontext){
    echo "Error #$errno: $errstr";
    echo "\ton $errfile:$errline\n";
    echo "Stack trace:\n";
    foreach ($errcontext as $e) {
        echo "\t$e\n";
    }
});

include "/home/www/someScript.php";

restore_error_handler();

这样你的脚本在失败时不会中断,但你没有使用古怪的系统函数。然后我们就可以开始看看到底发生了什么。

【讨论】:

    猜你喜欢
    • 2020-11-18
    • 2016-03-19
    • 1970-01-01
    • 2016-05-27
    • 1970-01-01
    • 2011-07-03
    • 1970-01-01
    • 2013-11-24
    • 1970-01-01
    相关资源
    最近更新 更多