理解为什么PHP 5.2.17到5.3.8会中断cron工作


Understanding why PHP 5.2.17 to 5.3.8 breaks cron jobs?

注意-这个问题已经解决了,但我在这里发布是为了了解发生了什么,因为我不明白。

我的共享主机的默认配置是PHP 5.2.17。当我问他们我是否可以升级到5.3。他们说当然可以,然后引用:

PHP 5.3的处理程序被添加到我们的共享和转售服务器那些希望利用它的人。为了利用这个处理程序,您需要需要在.htaccess文件中添加以下代码:

Action application/x-hg-php53 /cgi-sys/php53
AddType application/x-hg-php53 .php

为了进一步说明为什么我们目前没有默认设置,这是由于旧的PHP脚本与新脚本的兼容性问题5.3版本。因此,为了防止破坏客户端站点上的旧脚本,我们将默认的PHP版本保留为5.2.X。

所以我这样做了,很快发现这杀死了我的网站使用PDO。调用new PDO();导致日志中没有发现类错误。

共享主机的支持响应为:

我们的PHP 5.3安装已经启用了PDO。这里的问题是似乎是由基于PHP的PHP .ini的自定义PHP .ini引起的所以它尝试加载PHP 5.2模块而不是PHP 5.3模块。

ok似乎是合理的,我说,现在去修正它吧!

他们更新了。ini文件,并将处理程序添加到我的。htaccess中,并且…

您的网站似乎可以正常加载,但如果您发现任何问题,请告诉我们。

这是真的,现在主站点和PDO工作正常,phpinfo()检查确实确认我是在5.3.8上,但几个小时后,一个cron工作死亡了:

[16-Dec-2011 03:00:01] PHP警告:PHP启动:无法加载动态库'/opt/php53/lib/PHP/extensions/no-debug-non-zts-20090626/pdo. PHP所以' -/opt/php53/lib/php/extensions/no-debug-non-zts-20090626/pdo。gc_remove_zval_from_buffer in Unknown on line 0

和来自cron作业目录的错误日志:

[16-Dec-2011 03:00:01] PHP警告:require_once(../pghqClasses/PDO.php) [function. PHP]/home/xxxxxx/pghqincs/initcron .php第19行

所以PDO调用再次失败,但这一次仅用于cron作业

支持团队的最终回复是:

我以前见过这种行为,PHP脚本中的相对路径没有指向正确的位置。根据PHP手册,CLI PHP和其他PHP接口的区别之一是CLI PHP不会将目录更改为脚本的目录。http://www.php.net/manual/en/features.commandline.differences.php为了解决这个问题,我添加了以下行:

chdir(dirname (FILE));

放到cron脚本的顶部,这样,在执行时,它会将目录更改为脚本的目录,从而使相对路径工作。当从网站运行时,这一行基本上不会做任何事情,但它应该使您的cronjob正确运行。

它确实有效。我的cron工作运行顺利,我的主要网站很好,每个人都很高兴在5.3.8上,但最后一点故障排除完全失去了我,我想有人向我解释一下,包括如何为cron失败,而不是为public_html脚本,为什么我们是chdir(),等等?

问题在于使用命令行PHP可执行文件的cron作业以当前目录或运行该作业的任何帐户的主文件夹作为PHP可执行文件的位置运行。因此,脚本中的任何相对路径都是相对于该位置解析的,而不是包含脚本的目录。

通过添加chdir()调用,您将当前目录设置为脚本所期望的位置,因此您的相对路径解析正确。