我使用Zend Framework编写了一个命令行实用程序来进行一些夜间报告。它在附带的网站上使用了大量相同的功能。当我手动运行它时效果很好,但是当我在cron上运行它时,我会包含路径问题。好像它应该很容易用set_include_path修复,但也许我错过了什么?
我的目录结构如下所示:
/var/www/clientname/
application
Globals.php
commandline
commandline_bootstrap.php
public_html
public_bootstrap.php
library
Zend
在public_bootstrap.php中,相对于当前目录,我使用set_include_path没有问题:
set_include_path('../library' . PATH_SEPARATOR . get_include_path());
如果我理解正确,在commandline_bootstrap.php中我需要放入绝对路径,所以cron知道一切都在哪里。我的文件是这样开始的:
error_reporting(E_ALL);
set_include_path('/var/www/clientname/library' . PATH_SEPARATOR . get_include_path());
require_once "../application/Globals.php";
但是当我通过cron运行时,我收到以下错误:
PHP致命错误:require_once(): 打开失败 '../application/Globals.php' (include_path中= '/无功/网络/客户端名/库/') 在 /var/www/clientname/commandline/zfcli.php 在第11行
我认为PHP接受了我的新路径,因为当我运行命令行并转储phpinfo时,我可以看到:
include_path => /var/www/clientname/library/:.:/usr/share/pear:/usr/share/php => :在/ usr /共享/梨:在/ usr /共享/ PHP
我承认这里的语法看起来有点奇怪,但我无法弄清楚如何修复它。任何建议都将不胜感激。
由于 夏季
答案 0 :(得分:2)
在ZFPlanet查看Pádraic对zf-cli
的处理方法。
这是我用来从shell执行php文件的一个小shell脚本,所以我确定cwd是什么:
#!/usr/bin/env php
<?php
chdir(dirname(__FILE__));
include('doctrine-cli.php');
在1.10.4之前还有a bug in the autoloader's isReadable()
,尝试升级。
答案 1 :(得分:0)
很可能CRON作业的当前目录不是commandline
目录。使用getcwd()
检查当前目录。
[编辑:]
也不要在set_include_path
中使用相对路径,因为这可能会导致意外行为 - 当然除了当前目录.
。在将realpath()
添加到include_path
之前,您可以使用{{1}}获取绝对路径。