我有一个从浏览器运行的备份脚本没有问题。它从数据库中提取数据并将其写入低于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可能会无提示失败。 PHP 7在PHP 5.3没有的某些内容上抛出致命错误,例如Division by Zero。如果您无法访问服务器配置以打开所有错误,则调用未定义的函数将无提示失败。您可以尝试调试,将
die('test');
__halt_compiler();
放在行的开头,从顶部开始,在第一个<?php
标记之后的行上,看看它是否加载。如果它确实逐行逐行取代(虽然不要切割控制结构!)并在每次重复测试后再次测试时,你知道错误就在上面一行。
我相信问题可能是PHP 7错误。代码只有在CRON调用时才会中断,而'fix'是删除关闭的PHP标记?>。虽然很难相信这可能是一个问题,但我做了很多单元测试,删除了之前的代码等等。我正在运行PHP 7.0.33。在CRON运行时,其他十几个(备份)脚本都没有破坏。
作为nzn indicated,这很可能是由包含文件触发的错误引起的。从外面来看,很难诊断出来。可能的情况是该文件中的相对include
/ require
。一种验证方法是通过从其他位置在控制台上运行脚本。 f可能是在启动PHP之前从cron调用cd
或在进行进一步包含之前在主文件中执行chdir(__DIR__)
。