从Crontab运行包含require_once()的PHP文件

时间:2015-06-25 12:19:11

标签: php cron crontab relative-path absolute-path

我正在尝试从crontab运行php文件。 php的目的是简单地向用户发送电子邮件。包括我的php框架的头文件。但是crontab似乎遇到了路径问题。我已经尝试将其更改为绝对路径..请参阅下面的测试用例。

使用require_once(http://www.test.com/inc/header.php)并在命令行中运行php -f test.php会导致:

PHP Warning:  require_once(): http:// wrapper is disabled in the server configuration by allow_url_include=0 in /home/user/public/test.com/public/deploy/cron/test.php on line 3
PHP Warning:  require_once(http://www.test.com/inc/header.php): failed to open stream: no suitable wrapper could be found in /home/user/public/trybe-ing.com/public/deploy/cron/test.php on line 3
PHP Fatal error:  require_once(): Failed opening required 'http://www.test.com/inc/header.php' (include_path='.:/usr/share/php:/usr/share/pear') in /home/user/public/test.com/public/deploy/cron/test.php on line 3

使用require_once('../../inc/header.php');并在命令行中运行php -f test.php会导致php文件成功执行。

但是看着我的cron标签:

*/1 * * * * php /home/user/public/test.com/public/deploy/cron/test.php

查看/ var / mail /中的结果,它会返回以下错误:

Message 23:
From user@server  Thu Jun 25 13:13:02 2015
X-Original-To: user
From: root@user (Cron Daemon)
To: chrismoore@ibrahimovic
Subject: Cron <user@server> php /home/user/public/test.com/public/deploy/cron/test.php
Content-Type: text/plain; charset=UTF-8
X-Cron-Env: <SHELL=/bin/sh>
X-Cron-Env: <HOME=/home/user>
X-Cron-Env: <PATH=/usr/bin:/bin>
X-Cron-Env: <LOGNAME=user>
Date: Thu, 25 Jun 2015 13:13:02 +0100 (BST)

PHP Warning:  require_once(../../inc/header.php): failed to open stream: No such file or directory in /home/user/public/trybe-ing.com/public/deploy/cron/test.php on line 3
PHP Fatal error:  require_once(): Failed opening required '../../inc/header.php' (include_path='.:/usr/share/php:/usr/share/pear') in /home/user/public/test.com/public/deploy/cron/test.php on line 3

似乎crontab无法像从命令行运行时那样运行php文件。我怎样才能让它发挥作用?

你能看出我做错了什么并提供解决方案吗?

Thnnks

2 个答案:

答案 0 :(得分:7)

使用__DIR__ magic constant尝试将文件包含在文件的完整路径中:

require_once(__DIR__ . '/../../inc/header.php');

这样,它将需要它的完整路径并在任何目录中工作,而不必首先更改到PHP文件的工作目录。

答案 1 :(得分:0)

另一种方法是将您的crontab更改为

*/1 * * * * cd /home/user/public/test.com/public/deploy/cron && php test.php