注意 - 这个问题已经解决了,但我在这里发帖是为了深入了解发生了什么,因为我不明白。
我的共享主机的默认配置是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()
,等等?
谢谢,抱歉长度...
答案 0 :(得分:1)
问题是使用命令行PHP可执行文件的cron
作业正在运行,当前目录作为PHP可执行文件的位置,或者运行作业的任何帐户的主文件夹。因此,脚本中的任何相对路径都是相对于该位置解析的,而不是包含脚本的目录。
通过添加chdir()
调用,您将当前目录设置为脚本所需的位置,因此您的相对路径可以正确解析。