curl php下载脚本在浏览器中工作正常但在cronjobs中失败

时间:2012-03-16 15:34:22

标签: php curl download cron modx

我写了curl php脚本,工作是在成功插入后从一个网站下载csv文件。当我在浏览器中启动它时工作正常但是当我把它放在cron作业列表上时它失败了。我在日志中看到内存耗尽错误一次,所以我猜我的服务器给了我较少的内存给cron。

我该如何解决这个问题?

你可以看到部分代码,它正在进行下载工作,通常只有:

<?php
...
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_POST, 1);
curl_setopt ($ch, CURLOPT_COOKIEJAR, 'cookie.txt');
curl_setopt ($ch, CURLOPT_COOKIEFILE, 'cookie.txt');
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt ($ch, CURLOPT_POSTFIELDS, $postfields);
$fp = fopen("data.csv", "w");
curl_setopt($ch, CURLOPT_FILE, $fp);
curl_exec ($ch);
curl_close ($ch);
fclose($fp);

只想再说一遍,这是代码的一部分,一切都在浏览器中运行良好,在cron作业中失败。

5 个答案:

答案 0 :(得分:1)

通常这意味着在调用服务器和通过命令行调用时,PHP(php.ini)的配置是不一样的。我不确定这是一个最佳实践,但我通常会让我的cronjob在我的脚本上调用wget以确保它们在我测试它们的相同环境中运行,即通过网络服务器。

# m h  dom mon dow   command
  * *  *   *   *   wget -O - http://myapp.example.com/cron/run > /dev/null 2>&1

*表示命令将在任何地方运行:

  • 分钟
  • 小时
  • 每月的某一天
  • 一周中的某一天

-O选项告诉wget不将脚本的输出写入文件 “&gt; / dev / null 2&gt;&amp; 1”只是重定向脚本的输出以避免cron的默认行为(即向用户发送带有命令输出的电子邮件)。

答案 1 :(得分:1)

假设您使用的是CRON的标准配置,那么您的cwd(当前工作目录)是~//或类似的东西,但是当您运行脚本时您的cwd设置为dir( __FILE__)(当前脚本目录)。

假设您使用的是脚本/var/www/web1/scripts/script1.php,而不是:

  • 网站cwd = /var/www/web1/scripts/
  • CRONs cwd = /var/www

当您使用相对文件名,例如data.csv(开头没有/)时,完整路径会创建为CWD . $filename,因此:

  • 网络完整路径/var/www/web1/scripts/data.csv
  • CRONs完整路径/var/www/data.csv

您可以使用以下方法轻松避免这种情况:

define( 'PATH_ROOT', dirname( __FILE__) . '/');
// ...
curl_setopt ($ch, CURLOPT_COOKIEJAR, PATH_ROOT . 'cookie.txt');
curl_setopt ($ch, CURLOPT_COOKIEFILE, PATH_ROOT . 'cookie.txt');
// ...
$fp = fopen( PATH_ROOT . "data.csv", "w");

还要确保您的系统用户已连接并且脚本将全部运行(请查看CRON长或向自己发送电子邮件)。

答案 2 :(得分:1)

就像解决方法一样,您可以在浏览器中执行此操作,而无需修改PHP脚本。例如:

30 * * * * /usr/bin/lynx -source http://mypage/status/cron > /dev/null

它的行为就像在浏览器中一样,并且可以避免您不得不处理代码和环境问题。

或者,您可以使用wget而不是PHP脚本。

答案 3 :(得分:0)

“php /home7/philbike/public_html/atlanticauto/assets/components/cronmanager/cron.php”命令怎么样?它在你的终端有用吗?

答案 4 :(得分:0)

最后,使用我的第一个设置:cd /home7/philbike/public_html/atlanticauto/assets/components/cronmanager/ && php cron.php

我应该在不使用系统变量的情况下编写csv文件的路径:

/home7/philbike/public_html/atlanticauto/data.csv