我写了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作业中失败。
答案 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
,而不是:
/var/www/web1/scripts/
/var/www
当您使用相对文件名,例如data.csv
(开头没有/
)时,完整路径会创建为CWD . $filename
,因此:
/var/www/web1/scripts/data.csv
/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