如何让 crontab 使用不同的 PHP 安装位置?

如何让 crontab 使用不同的 PHP 安装位置?

我有一个在 Mac OS X 10.5 计算机上运行 PHP 5.3.5 的 MAMP 设置。我正在尝试安装一个执行 PHP 脚本的 crontab,该脚本位于我的 MAMP 服务器上。如果我使用 /usr/bin/php 中的 php 安装(版本 5.2.15),我只能让 crontab 执行。换句话说,这是 PHP 的预装 MAC OS X 安装。执行 crontab 时如何使用我的 MAMP 版本的 PHP?我对 unix 的了解不够,无法在 /usr/bin/php 安装新版本的 PHP,但这可行吗?

我希望 crontab 使用以下命令执行我的 PHP 脚本曼普的PHP 版本;这是因为我知道脚本成功运行,并且得到了所需的输出。但是,当我尝试使用位于 /usr/bin/php 的系统默认 PHP 安装执行 crontab 时,出现致命 PHP 错误。

--

如果这可能有用,这里是 /usr/bin/php 与 MAMP 版本的结果。第一个代码示例成功执行我的 php 脚本:

$  MAMP_PHP_PATH="/applications/mamp/bin/php5.3/bin/php"
$  $MAMP_PHP_PATH -f /path/to/my/script.php

现在,当我简单地运行以下命令时会发生以下情况:

$  # whereis php in this case returns usr/bin/php
$  php -f /path/to/my/script.php

导致以下错误(格式化我的):

Fatal error: require_once(): 
Failed opening required '/path/to/includes/initialize.php' 
(include_path='.:') in /path/to/my/script.php on line 3

最后,这就是我的 crontab 文件的样子(使用 MAMP 的 php):

15 * * * * /Applications/MAMP/bin/php5.3/bin/php /path/to/my/script.php

没有 MAMP 的 php:

15 * * * * php /path/to/my/script.php

谢谢

答案1

在 crontab 中设置所需的环境变量。例如:

PATH=/Applications/MAMP/bin/php5.3/bin:/usr/local/bin:/usr/bin:/bin
MAMP_PHP_PATH=/applications/mamp/bin/php5.3/bin/php
15 * * * * php /path/to/my/script.php

答案2

短的答:最终我只是安装了PHP的最新版本到我的系统上。

长的答案(以及我一路上承受的所有痛苦):
当 crontab 运行时,我不断收到错误,该错误表明我在脚本中实例化的某个类 SoapClient没有被发现。我的自动加载功能也没找到;因此,如OP所示,我收到此错误:

Fatal error: require_once(): 
Failed opening required '/path/to/includes/initialize.php' 
(include_path='.:') in /path/to/my/script.php on line 3

还有另一个类似的错误,我不断收到这样的错误,我发现问题是旧版本的 php 没有启用 SOAP 扩展,当自动加载函数寻找它时,它检查了 php 安装的php.ini文件中包含以下行:include_path并检查其中的目录以查找我试图包含的 SOAP 类。当它找不到该类时,就会出现致命错误。 笔记: (include_path在你的 php.ini 文件中的工作方式类似于你的 Unix 环境中的 $PATH 变量)。

我使用locate php.ini命令和一点直觉,发现我系统的 php.ini 文件位于/private/etc/php.ini.default.这是当时的位置老的php.ini 文件 – php 5.2 版本的文件。要点是,soap 根本没有启用,因此include_path我的 php.ini 文件的参数找不到它的位置。

因此,我下载了 PHP 5.4.4 并运行以下命令:

$ ./configure --enable-soap --with-mysql
$ make
$ make install

安装是在/usr/local/bin.但是,根 php 安装位于 中/usr/bin,因此我执行了以下命令将所有内容移至/usr/local/bin/usr/bin,以覆盖旧的 php 版本:

$ sudo cp -Rvf /usr/local/bin/ /usr/bin

我指定:
-R复制层次结构中的所有文件/usr/local/bin/-v仅显示一条输出消息,说明在进程发生时哪些文件被移动,以及,这允许我根据需要-f覆盖适用的文件。/usr/bin

一旦我用新版本覆盖了旧版本的 PHP,新版本的位置php.ini文件在其他地方。但是哪里?我跑了这个来找出答案:

$ php -i | grep -i "configuration file"
  Configuration File (php.ini) Path => /usr/local/lib
  Loaded Configuration File => /usr/local/lib/php.ini

进行适当的更改后,我用 php 5.4.4 安装附带的新 php.ini 文件覆盖了 /private/etc/php.ini.default 中的文件。

中提琴。 cron 作业正在运行,我根本不需要指定不同的 php 路径。干杯!

相关内容