【问题标题】:PDO_OCI in php script not working in cronjob (crontab), but works when executed by user directlyphp脚本中的PDO_OCI在cronjob(crontab)中不起作用,但在用户直接执行时起作用
【发布时间】:2019-06-27 21:19:00
【问题描述】:

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

我已经尝试了多种方法来查找错误,但没有任何效果。首先,我通过 cronjob 中的 php -m 和 php -v 检查了 php 安装,并在以用户身份调用时将模块和版本与 php 版本进行了比较。安装的模块和版本是相同的。其次,我使用 su -u user 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 运行时,会抛出带有消息“SQLSTATE[]: (null)”的异常“PDOException”。奇怪的是,脚本已经在另一台服务器上运行,并且一切正常。

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

【问题讨论】:

  • 同时我添加了一个 systemd 计时器并删除了 cronjob,遗憾的是它并没有解决问题。

标签: php oracle pdo cron sles


【解决方案1】:

我终于找到了解决方案,如果有人遇到同样的问题,这可能会对您有所帮助。我偶然发现,系统以某种方式使用了另一个版本的 oracle 即时客户端,而不是我的用户。不知何故,即使我的用户在 cronjob 中调用了该脚本也没关系,因为它总是使用错误的版本。确保您只安装了正确版本的 oracle 即时客户端,并且仅将该版本导出为库路径。

【讨论】:

    猜你喜欢
    • 2019-09-30
    • 2016-10-03
    • 2021-01-07
    • 2011-03-29
    • 2018-02-26
    • 2020-04-21
    • 1970-01-01
    • 1970-01-01
    • 2017-07-01
    相关资源
    最近更新 更多