首先让我说我完全不是PHP程序员-这是我自己解决的问题。
我有一个单独位于文件中的函数,基本上看起来像这样:
<?php
function UploadFile($source, $destination){
$debugLogPath = '/biglongpath/debug.log';
file_put_contents($debugLogPath,PHP_EOL . "Beginning UploadFile function", FILE_APPEND);
set_include_path(get_include_path() . PATH_SEPARATOR . 'phpseclib');
require_once('Net/SFTP.php');
...Rest of the ftp code here...
}
?>
它正在使用phpseclib。如果我通过网络浏览器运行主要的PHP脚本(调用此函数...),则一切正常。当我通过CRON作业运行相同的脚本时,调用此函数后它将立即死亡。我已经通过在调用函数之前写出调试日志来验证了这一点-函数写入日志之前的第一条语句,但是从未写入“ Beginning UploadFile function”。
我猜测可能与require_once语句有关-通过CRON执行时可能是路径问题或权限问题?
我已经尝试将整个函数的内容包装在try / catch中,并写出Exception,但是它仍然死了。
我想知道为什么在问题陈述时有3个有用的标志表示文件正在写入?但是,这不是CLI错误日志,因此不会自动在该日志中记录任何错误。第二个建议提出的可能性更大,而可能性更大:
确保已为PHP-CLI加载了这些模块:
[libsodium
,openssl
,mcrypt
,gmp
(composer.json
提示)。
正在运行php --ini
应显示加载了哪些INI文件。即使存在相应的INI文件,也请确保其中的说明未被;
注释掉。
建议使用运行cronjob的用户的身份从CLI手动运行CLI,并启用错误报告。如果这样做没有帮助,请使用xdebug
单步进入,以查看错误的确切位置(NetBeans,Eclipse,VS Code和其他一些IDE确实支持PHP调试)。这需要一些努力来进行设置,但是随后它提供了一种更好的调试方法。