我有一个从浏览器运行的备份脚本没有问题。它从数据库中提取数据并将其写入低于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。其他一切都有效。
我认为我的内存不足。我在脚本中的这一点上甚至没有从数据库中获取数据,但它似乎是某种累积错误,因为当我注释掉有问题的行时,错误转移到另一个同样令人费解的沉默代码进一步失败。
我应该查看其他有用的测试,日志或环境条件吗?我可以问网站主持人吗?
答案 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
。