理解为什么PHP 5.2.17到5.3.8打破了cron作业?

时间:2011-12-18 21:56:21

标签: php cron pdo

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

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

  

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.ini for PHP的自定义php.ini引起的   5.2,所以它试图加载PHP 5.2模块而不是PHP 5.3模块。

好吧看起来很合理,我说,现在继续解决这个问题!

他们更新了.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。所以' - /opt/php53/lib/php/extensions/no-debug-non-zts-20090626/pdo.so:unfined symbol:gc_remove_zval_from_buffer in the Unknown on line 0

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

  

[16-Dec-2011 03:00:01] PHP警告:require_once(../ pghqClasses / PDO.php)[function.require-once]:无法打开流:/ home中没有这样的文件或目录第19行的/XXXXXX/pghqIncs/initCron.php

因此PDO调用再次失败,但这次 仅适用于cron作业

支持小组的最终答复是:

  

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

     

chdir(dirname( FILE ));

     

到你的cron脚本的顶部,以便在执行时将目录更改为脚本的目录,从而使相对路径起作用。当从网站运行时,这一行基本上什么都不做,但它应该让你的cronjob正确运行。

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

谢谢,抱歉长度...

1 个答案:

答案 0 :(得分:1)

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

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