php脚本中的PDO_OCI在cronjob(crontab)中不起作用,但在由用户直接执行时有效

时间:2019-02-04 06:11:49

标签: php pdo cron oracledb sles

在控制台中执行时,连接到数据库以检索数据并将其发送到Web服务的php 5.5.14脚本可以正常工作,但在cronjob(crontab)中不起作用。当cronjob执行脚本时,未建立通过pdo_oci驱动程序的数据库连接,而是引发了带有消息'SQLSTATE []:(null)'的异常'PDOException'。

我已经尝试了多种方法来查找错误,但是没有任何效果。首先,我在cronjob中通过php -m和php -v检查了php的安装,并以用户身份将模块和版本与php版本进行了比较。安装的模块和版本相同。其次,我使用su -u用户crontab -e在我的用户下运行cronjob。然后,我记录了所有凭据和所有内容,以确保连接字符串与直接调用时的连接字符串相同。连接字符串被证明是相同的。我只是无法理解为什么直接在控制台中执行而在cronjob中却无法执行该脚本。

以下行通过pdo_oci驱动程序建立与数据库的连接:

 $con = new PDO('oci:dbname='//dburl:port/dbserver, dbuser, dbpassword);

该脚本通过crontab执行如下:

*/1 * * * * /usr/bin/php /path/to/script/phpscript.php -params

如前所述,通常会建立连接,但是当通过cronjob运行时,会抛出异常“ PDOException”和消息“ SQLSTATE [] :(空)”。奇怪的是,脚本已经在另一台服务器上运行,并且在那里一切正常。

我知道所使用的php版本非常旧,我的工作是进行1:1迁移,并且不允许升级php版本。

1 个答案:

答案 0 :(得分:0)

我终于找到了解决方案,如果有人遇到同样的问题,可能会对您有所帮助。我偶然发现,该系统以某种方式使用了除我的用户以外的其他版本的Oracle Instant Client。无论如何,即使脚本是在cronjob中与我的用户一起调用的,也没关系,因为它将始终使用错误的版本。确保仅安装了正确版本的oracle Instant Client,并且仅将该版本导出为库路径。