我有一个在 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 路径。干杯!