【发布时间】:2014-09-29 20:28:36
【问题描述】:
我有一个名为 cronStats.php 的脚本,它从 Apple 的 autoingest 工具中提取数据(有关应用程序下载、区域等的数据)并填充数据库以供以后访问。
当脚本在浏览器中执行时,一切正常。但是,当使用计划的 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 作业,“无内容”语句意味着 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
编辑 2 - 解决方法: 解决对处于类似情况的任何人都有效的方法。它不是优雅/高效,实际上并没有解决问题,但它的价值:在另一个文件上设置一个 cron 作业:例如runCron.php:
<?php
executeScript();
function executeScript() {
file_get_contents("http://website.com/path/to/php/cron/cronStats.php");
informOfExecution();
}
然后在绝对 url 处执行实际文件。 informOfExecution() 方法向我发送一封电子邮件通知更新。直接对文件进行 cron 作业会很好,但完成总比完美好。谢谢大家。
【问题讨论】:
-
发布您的 crontab 条目
-
它不是卷曲而是 fopen;用户是否具有文件\目录所需的权限
-
你可以先关闭 curl_close 而不是关闭文件指针,如果没有内容可以添加
echo curl_error($ch);。错误消息表明您正在尝试写入奇怪的 HTTP Url,您可以在触发该错误的位置粘贴一行吗? -
这是您的答案,而不是
$fp = fopen($abFilename, "w+");,所以您实际上是在尝试写入 HTTP url$fp = fopen('http: //www.website.com/path/to/cron/dailyStat_20140930_12345678.gz', "w+");,这是不可能的。正如@Dimitri 建议的那样,尝试输入您的 croncommand: /web/cgi-bin/php5 cd $HOME/html/path/to/php/cron/ && php ronStats.php > cron.log 2>&1并设置 $abFileName='./dailyStat_20140930_12345678.txt' -
对不起,我从来没有使用过 cPanel 我有自己的网络服务器......我也看到我有一个错误所以试试。
cd pathtoyourcron && /web/cgi-bin/php5 runStats.php通常你应该能够通过添加 ` >cron.log 2>&1` 来输出脚本错误和 std,所以尝试第一个,如果它有效,请尝试cd pathtoyourcron && /web/cgi-bin/php5 runStats.php >cron.log 2>&1希望这会有效