2011-09-22 59 views
1

我想通过cron作业运行的PHP脚本中连接到mysql数据库。它不会以某种方式连接到数据库。我在浏览器中运行相同的脚本,一切正常。我使用免费的BSD和以下是我试图运行的代码片段:通过cron运行的PHP脚本不能连接到数据库

ini_set(max_execution_time,1200); 
require_once("../settings.php"); 
$query = "insert into cron_log values(null, '". date("D d-m-Y") ."')"; 
mysql_query($query); 
exec("convert /usr/local/www/demo/cron/test.pdf /usr/local/www/demo/cron/1.jpg"); 

如果我通过cron运行上述脚本,它什么都不做。

如果我在浏览器中运行上面的脚本,它将在表中创建新的行以及创建1.jpg。

如果我删除数据库部分并通过cron运行它,它会创建1.jpg文件。

可能的原因和解决方案是什么?

+0

'file_put_contents('test.txt','Cron works'); die();'把它放在第一行。 –

+0

您是否尝试过指定脚本使用的所有文件的绝对路径? – Nexerus

+1

尝试使用'require_once'或'require_once(dirname(__ FILE __)。'/ ../settings.php')'的绝对路径; – PeeHaa

回答

4

请注意,CLI不会更改当前的工作目录。另外cron不设置它。因此,你的reqire_once调用相对于一个“随机”位置。尝试完整路径:

require_once(__DIR__."/../settings.php"); // PHP >=5.3 
require_once(dirname(__FILE__)."/../settings.php"); // PHP <5.3 
+0

谢谢..经过几个小时的实验,这帮了我很多! – DragonWork

1

我的猜测是,当您从cron运行它时,您不在正确的目录中,并且找不到settings.php文件;因此整个事情都失败了。

当您从cron运行它时,请确保脚本cds到适当的目录,以便使用相对路径找到settings.php。

1

任何显示的错误? 请确保您所指的是打印“getcwd()”的文件“settings.php”的正确文件夹。 当从cron脚本启动时,位于“/”

+0

你可以在开头插入这段代码 chdir(realpath(dirname(__FILE__))); SirFabio

+0

这假设'../ settings.php'是相对于'dirname(FILE)'的,这可能不是这种情况。另外,cron可以从命令行有效运行,你只需要做chdir(dirname($ argv [0])); – DaveRandom

2

最可能的原因是该脚本在require_once("../settings.php");行失败。这是因为通过cron调用时脚本的工作目录与通过浏览器调用时的工作目录不同。

../settings.php更改为完整路径,例如, /path/to/settings.php确认这是问题所在。

它也值得更改您的cron行为php /path/to/script.php >> /path/to/logfile.txt 2>&1,以便logfile.txt将填充脚本的输出。确保你打开display_errors来捕捉任何错误信息!