PHP: Require path does not work for cron job?

2019-01-18 09:42发布

I have a cron job that needs to include this file:

require '../includes/common.php';

however, when it is run via the cron job (and not my local testing), the relative path does not work. the cron job runs the following file (on the live server):

/home/username123/public_html/cron/mycronjob.php

and here's the error:

Fatal error: require(): Failed opening required '../includes/common.php' 
(include_path='.:/usr/lib/php:/usr/local/lib/php') in 
/home/username123/public_html/cron/mycronjob.php on line 2

using the same absolute format as the cron job, common.php would be located at

/home/username123/public_html/includes/common.php

does that mean i have to replace my line 2 with:

require '/home/username123/public_html/includes/common.php';

?

thanks!

5条回答
成全新的幸福
2楼-- · 2019-01-18 10:06

Technically seen the php script is run where cron is located; ex. If cron was in /bin/cron, then this statement would look for common.php in /bin/includes/common.php.

So yeah, you'll probably have to use fullpaths or use set_include_path

set_include_path('/home/username123/public_html/includes/');
require 'common.php';
查看更多
神经病院院长
3楼-- · 2019-01-18 10:12

An alternative to the solutions which recommend absolute path specification is using a chdir in your script. That way, your relative paths will work as expected.

For example, to change to the directory of the script:

$curr_dir = dirname(__FILE__);
chdir($curr_dir);

To change to the parent directory of the script:

$curr_dir = dirname(__FILE__);
chdir($curr_dir . "/..");

And so forth.

查看更多
女痞
4楼-- · 2019-01-18 10:17

It sounds as simple as just some script you are running is setting the include_path and you are including that script. use phpinfo() to check the include_path global vs local setting.

查看更多
手持菜刀,她持情操
5楼-- · 2019-01-18 10:20

nono. you need to use absolute paths on crons.

what I do is:

// supouse your cron is on app/cron and your lib is on app/lib
$base = dirname(dirname(__FILE__)); // now $base contains "app"

include_once $base . '/lib/db.inc';

// move on
查看更多
迷人小祖宗
6楼-- · 2019-01-18 10:29

If the relative path doesn't work, then it means that the current directory set when the cron tasks are running is not /home/username123/public_html. In such cases, you can only use an absolute path.

查看更多
登录 后发表回答