使用cron作业执行PHP脚本

问题描述:

我有一个名为cronStats.php的脚本,用于从Apple的autoingest工具(应用程序下载,区域等数据)中提取数据并在稍后填充数据库以供访问。使用cron作业执行PHP脚本

当脚本在浏览器中执行时,一切正常。但是当使用计划的cron作业来执行脚本时会出现错误。

下面是相关代码:

function pullITCData($username,$password,$VND,$date) { 

$fields_string = "USERNAME=" . urlencode($username); 
$fields_string .= "&PASSWORD=" . urlencode($password); 
$fields_string .= "&VNDNUMBER=" . $VND; 
$fields_string .= "&TYPEOFREPORT=Sales"; 
$fields_string .= "&DATETYPE=Daily"; 
$fields_string .= "&REPORTTYPE=Summary"; 
$fields_string .= "&REPORTDATE=$date"; 

$fn = "dailyStat_" . $date . "_" . $VND; 
$filename = $fn . ".gz"; 

//$abFN = __DIR__ . "/" . $fn; 
//$abFilename = __DIR__ . "/" . $filename; 

$abFN = $fn; 
$abFilename = $filename; 

$ch = curl_init(); 
echo("<br>abFN url is $abFN"); 
echo("<br>abFilename url is $abFilename"); 
$fp = fopen($abFilename, "w+"); 

//set the url, number of POST vars, POST data 
curl_setopt($ch, CURLOPT_URL, 'https://reportingitc.apple.com/autoingestion.tft'); 
curl_setopt($ch, CURLOPT_POST, 7); 
curl_setopt($ch, CURLOPT_POSTFIELDS,$fields_string); 
curl_setopt($ch, CURLOPT_FILE, $fp); 

//execute post 
$contents = curl_exec ($ch); 
$fileCreated = false; 

if ($contents === false) { 
    echo("<br> no contents"); 
} else { 
    echo("<br>contents found"); 
} 


fclose($fp); 
curl_close($ch); 

//delete the opened file 
if ($fileCreated == true){ 
    unlink("$abFN"); 
} 

} 

我已经删除了简洁一些代码。基本上,我将一串变量传递给Apple的摄取工具,然后返回一个.txt.gz文件(然后打开并解析,此处未显示)。

当浏览器执行时,我得到“找到内容”语句,但是通过Cron Job,“无内容”语句表示CURL_EXEC由于某种原因失败。

我的想法是无法创建.GZ文件,因为Cron作业正从另一个目录(?)执行。我尝试设置一个绝对URL写.txt.gz,不过这也失败:

[function.fopen]: failed to open stream: HTTP wrapper does not support writeable connections in 

我在一个不知如何着手。有任何想法吗?编辑: 感谢您的反馈意见,非常感谢。 基于BojanT的cron命令:

/web/cgi-bin/php5 cd "$HOME/html/path/to/php/cron/ && php cronStats.php > cron.log 2>&1 

,我发现了以下错误:

/bin/sh: -c: line 0: unexpected EOF while looking for matching `"' 
/bin/sh: -c: line 1: syntax error: unexpected end of file 

EDIT 2 - 补救措施: 变通方法是在类似情况下工作的人。它不是优雅/高效的,并没有真正解决问题,而是它的价值:在另一个文件上设置一个cron作业:例如runCron.php:

<?php 

executeScript(); 

function executeScript() { 
file_get_contents("http://website.com/path/to/php/cron/cronStats.php"); 
informOfExecution(); 
} 

然后它在绝对url处执行实际文件。 informOfExecution()方法向我发送电子邮件通知更新。 cron直接处理文件会很好,但是做得比完美更好。谢谢大家。

+2

发布您的crontab条目 – Dimitri 2014-09-29 20:39:30

+2

其不卷曲它的fopen;用户是否具有文件\目录所需的权限 – 2014-09-29 20:42:27

+1

您可以先关闭curl_close而不是关闭文件指针,如果没有内容可以添加'echo curl_error($ ch);'。该错误消息表明您正在尝试写入HTTP Url,这很奇怪,您能否在触发该错误的地方粘贴一行? – BojanT 2014-09-29 20:54:44

使用'cd'更改您的文件目录,然后运行您的文件。 例如:

* * * * * cd /f1/f2/f3/f4/ && php thing.php >> /home/output/outputs.txt