PHP 脚本不是 运行 通过 cron 作业

PHP Script is not running via cron job

我有一个 php 脚本查询 MySQL 和 IBM Informix 数据库(位于其他主机),生成 json 文件,处理信息并将其插入 MySQL 数据库.

该脚本有一个主文件和另一个具有查询处理功能的文件。保持这样:

/opt/project
     script.php
     functions.php

script.php需要functions.php文件,根据对数据库的查询生成json正在执行的地方,并插入处理的数据。

我可以运行使用绝对或相对路径顺利地编写脚本。

里面 /opt/project:

# php script.php

其他地方:

 # /usr/bin/php /opt/project/scrpt.php

但是,当它由cron 作业执行时,不起作用。我确实已经设置了通知环境变量,执行了日志测试,甚至创建了一个 shell 脚本到 运行 script.php 和 cron 运行 宁 shell 脚本。

服务器路径 (CentOS 7): /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin

已尝试的 Crontab 内容:

SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
* * * * * /usr/bin/php /opt/project/script.php

使用 root 提前命令:

SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
* * * * * root /usr/bin/php /opt/project/script.php

更改目录:

SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
* * * * * cd /opt/project && /usr/bin/php script.php

Cron 到 运行 shell 脚本而不是 php 直接:

SHELL=/usr/local/bin   
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
* * * * * cd /opt/project && sh run_script.sh

其中 shell 脚本具有以下内容:

#!/usr/bin/env bash

cd /opt/project

PHP=`which php`
$PHP script.php

cron 日志没有显示任何错误,如果我将输出重定向到文件,它会创建文件,但 运行 php 脚本没有,即使 shell 脚本来做到这一点。我尝试在 crontab 中不设置 SHELL 和 PATH,但也不起作用。

请尝试:

* * * * * /full/path/to/your/run_script.sh

改为:

* * * * * cd /opt/project && sh run_script.sh

如果您希望执行 bash 或 sh 脚本,脚本的路径应该是上述绝对路径或:

./run_script.sh

注意 ./。否则脚本不会被执行。

还可以通过以下方式使您的 bash 脚本可执行:

chmod +x run_script.sh

您也可以直接 运行 脚本,而无需来自 cron 的 run_script.sh

* * * * * /absolute/path/to/php -f "/absolute/path/to/script.php"

为了将当前目录更改为您的 php 脚本所在的目录,您可以在 php 脚本的开头使用它:

chdir(dirname(__FILE__));

因为当你用 cron 运行 php 编写脚本时,php 的当前目录不是脚本而是不同的(因为它是由 cron 启动的)

问题出在连接IBM Infomix数据库的SDK变量上。虽然我已经设置了 PATH,但有必要从我在安装 Informix SDK 时定义的 IBM Informix 导出环境变量。奇怪的是,即使有 PDO 例外,当我用 &>.

重定向错误标准输出时,也没有产生任何错误

可能存在一种最优雅的方式来做到这一点,但我不能玩现场环境。关注当前有效的 cron 作业:

SHELL=/usr/local/bin
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/opt/IBM/informix/bin
14,29,44,59 * * * * root export INFORMIXSERVER=<data_source_name> && export INFORMIXDIR=<path_to_informix_sdk> && export INFORMIXTMP=<path_infomix_tmp> && export INFORMIXSQLHOSTS=<path_to_sqlhost_file> && export $PATH:$INFORMIXDIR/bin && /usr/bin/php /opt/project/script.php &> /var/log/project/task.log