运行CRON时,'require'会无声地失败

问题描述 投票:2回答:3

我有一个从浏览器运行的备份脚本没有问题。它从数据库中提取数据并将其写入低于2MB的ZIP文件。

它主要从服务器运行,但在遇到特定行时失败(无声):

require ('/absolute-path/filename');  // pseudo filespec

这是几个这样的陈述之一。这些是库文件,除了“将内容放入内存”之外什么都不做。我肯定已经消除了路径问题的任何可能性。我正在使用条件is_readable()测试文件,输出它,并自己发送电子邮件。

$fs = '/absolute-path/filename'; // pseudo filespec
if (is_readable ($fs) ) { 
    mail('myaddress','cron','before require'); // this works reliably
    require ($fs); // can be an empty file ie. <?php ?>
    mail('myaddress','cron','after require'); // this never works.
}

当我评论require($fs)时,脚本继续(主要是,见下文)。

我检查了行尾(隐形字符)。不是每个单独的include-ed文件,但肯定运行的文件具有换行(NL)结尾(Linux风格),而不是换行符+回车(NL CR)(Windows风格)。

我试过要求一个空文件(只是<?php ?>)来查看脚本是否会超过这一点。它没有。

我试过从包含的脚本中调用mail();。我收到了邮件。再说一遍,我知道道路是对的。它正在执行,但它永远不会返回,我没有错误,至少在PHP日志中没有。 CRON工作死了......

这是一个新服务器。我刚刚将应用程序从PHP 5.3.10迁移到PHP7。其他一切都有效。

我不认为我的内存不足。我在脚本中的这一点上甚至没有从数据库中获取数据,但它似乎是某种累积错误,因为当我注释掉有问题的行时,错误会转移到另一个同样令人费解的无声失败中。代码。

我应该看一下其他有用的测试,日志或环境条件吗?我可以问网站主持人吗?

php cron require silent
3个回答
0
投票

这通常意味着在包含的文件中触发了一些致命错误。如果未打开所有错误,则在包含具有某些致命错误的文件时,PHP可能会无提示失败。 PHP 7在PHP 5.3没有的某些内容上抛出致命错误,例如Division by Zero。如果您无法访问服务器配置以打开所有错误,则调用未定义的函数将无提示失败。您可以尝试调试,将 die('test'); __halt_compiler(); 放在行的开头,从顶部开始,在第一个<?php标记之后的行上,看看它是否加载。如果它确实逐行逐行取代(虽然不要切割控制结构!)并在每次重复测试后再次测试时,你知道错误就在上面一行。


0
投票

我相信问题可能是PHP 7错误。代码只有在CRON调用时才会中断,而'fix'是删除关闭的PHP标记?>。虽然很难相信这可能是一个问题,但我做了很多单元测试,删除了之前的代码等等。我正在运行PHP 7.0.33。在CRON运行时,其他十几个(备份)脚本都没有破坏。


0
投票

作为nzn indicated,这很可能是由包含文件触发的错误引起的。从外面来看,很难诊断出来。可能的情况是该文件中的相对include / require。一种验证方法是通过从其他位置在控制台上运行脚本。 f可能是在启动PHP之前从cron调用cd或在进行进一步包含之前在主文件中执行chdir(__DIR__)

© www.soinside.com 2019 - 2024. All rights reserved.