2011-12-18 88 views
2

注意 - 这个问题已经解决了,但是我在这里贴出来找到洞察发生了什么,因为我不明白。了解为什么PHP 5.2.17到5.3.8会打破cron作业?

我的共享主机的默认配置是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的php.ini for PHP 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.so' - /opt/php53/lib/php/extensions/no-debug-non-zts-20090626/pdo.so:undefined symbol:gc_remove_zval_from_buffer in Unknown on line 0

从cron作业目录中的错误日志:

[16日 - 12月2011年3点00分01秒] PHP的警告:require_once(../ pghqClasses/PDO.php)一次function.require-] :未能打开流:在/ 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(目录名(FILE ));

到你的cron脚本的顶部,这样,当它被执行时,它会将目录改变为脚本的目录,因此使相对路径起作用。当从网站运行时,这一行基本上什么也不做,但它应该让你的cronjob正常运行。

它确实有效。我的cron工作正常运行,并且我的主要站点很好,每个人都很高兴5.3.8,但最后一点问题的解决完全失去了我,我希望有人向我解释包括可能会失败的原因一个cron,但不是为public_html脚本,为什么我们是chdir(),等等?

谢谢大家,很抱歉的长度...

回答

1

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

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

+0

谢谢安德鲁。你能解释为什么主要网站从'/ public_html /'工作,但cron作业失败'/ pghqCron /',尽管从'/ pghqIncs /'中包含两个拉包括?这是让我困惑的部分。 – Drew 2011-12-18 22:46:02

+0

我对PHP的配置并不熟悉,但我的猜测是在php.ini或其他地方有一个配置行,它告诉在Apache中运行的PHP处理程序在哪里找到你的包含。 – 2011-12-18 22:49:59