I wrote a command line utility using Zend Framework to do some nightly reporting. It uses a ton of the same functionality the accompanying site. It works great when I run it by hand, but when I run it on cron I have include path issues. Seems like it should be easily fixed with set_include_path, but maybe I'm missing something?
My directory structure looks like this:
/var/www/clientname/
application
Globals.php
commandline
commandline_bootstrap.php
public_html
public_bootstrap.php
library
Zend
In public_bootstrap.php I use set_include_path without a problem, relative to the current directory:
set_include_path('../library' . PATH_SEPARATOR . get_include_path());
If I understand correctly, in commandline_bootstrap.php I need to put in the absolute path, so cron knows where everything is. My file starts like this:
error_reporting(E_ALL);
set_include_path('/var/www/clientname/library' . PATH_SEPARATOR . get_include_path());
require_once "../application/Globals.php";
But when I run it via cron I get the following error:
PHP Fatal error: require_once(): Failed opening required '../application/Globals.php' (include_path='/var/www/clientname/library/') in /var/www/clientname/commandline/zfcli.php on line 11
I think PHP is accepting my new path, because when I run it command line and dump the phpinfo I can see:
include_path => /var/www/clientname/library/:.:/usr/share/pear:/usr/share/php => .:/usr/share/pear:/usr/share/php
I admit the syntax here looks a little strange, but I can’t 开发者_如何学Gofigure out how to fix it. Any suggestions would be greatly appreciated.
Thanks summer
Take a look at the Pádraic's approach to zf-cli
at ZFPlanet.
Here is a little shell script I use to execute php file from the shell, so I'm sure what the cwd is:
#!/usr/bin/env php
<?php
chdir(dirname(__FILE__));
include('doctrine-cli.php');
There was also a bug in the autoloader's isReadable()
prior to 1.10.4, try upgrading.
Most probably the current directory of the CRON job is not the commandline
directory. Use getcwd()
to check the current directory.
[Edit:]
Also do not use relative paths in set_include_path
as this may result in unexpected behaviour - except of course for the current directory .
. You can use realpath()
to get the the absolute path, before you add it to the include_path
.
精彩评论