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

时间:2016-11-11 21:21:21

标签: php cron require silent

我有一个从浏览器运行的备份脚本没有问题。它从数据库中提取数据并将其写入低于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。其他一切都有效。

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

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

3 个答案:

答案 0 :(得分:0)

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

答案 1 :(得分:0)

我相信问题可能是PHP 7错误。仅当CRON调用 broke 并使用' fix '时,该代码才删除封闭的PHP标记?> 。尽管很难相信这可能是一个问题,但是我进行了很多单元测试,删除了先前的代码,等等。我正在运行PHP 7.0.33。由CRON运行时,其他十几个(备份)脚本都没有中断。

答案 2 :(得分:0)

作为nzn indicated,这很可能是由包含的文件触发的错误引起的。从外部很难诊断。一种可能的情况是该文件中的相对ChromeDriverService service = ChromeDriverService.CreateDefaultService(); service.Port = 5001; using (var driver = new ChromeDriver(service)) { driver.Navigate().GoToUrl("http://testing-ground.scraping.pro/login"); var userNameField = driver.FindElementById("usr"); var userPassField = driver.FindElementById("pwd"); var loginButton = driver.FindElementById("//input[@value='Login']"); userNameField.SendKeys("admin"); userNameField.SendKeys("12345"); loginButton.Click(); var result = driver.FindElementByXPath("//div[@div='case_login']/h3").Text; File.WriteAllText("result.txt", result); driver.GetScreenshot().SaveAsFile("@screen.png", ScreenshotImageFormat.Png); } / include。一种验证方法是通过从其他位置在控制台上运行脚本。 f可能是在启动PHP之前从cron调用require,或者在进行进一步包含之前在主文件中进行了cd