【问题标题】:Cronjob script fails, but works via browser (Zip Archive PHP)Cronjob 脚本失败,但可以通过浏览器工作 (Zip Archive PHP)
【发布时间】:2017-10-16 22:36:00
【问题描述】:

我有一个生成大型 zip 文件的 PHP 脚本,当我通过 SSH 执行它时它可以工作,但是当通过 cron 执行时,相同的脚本间歇性失败。

我尝试过的事情:

  • 更改脚本中的路径,但由于它是通过 SSH 执行的,所以应该不是问题
  • 在 cron 命令中更改 PHP 可执行文件的路径(我运行“whereis php”并使用了 2 个可用的 PHP 可执行文件位置)
  • 修改文件权限
  • 将时间限制设置为 ini_set('max_execution_time', 990000); 并通过 set_time_limit (990000);
  • 向托管公司提交了六张支持票,但他们无能为力

我现在尝试的最后一件事是手动设置一个时间限制,在此之后 cronjob 将失败,包括: /bin/timeout -s 2 990000 但我认为这没用,因为通常没有时间限制,除非我错过了什么。

日志文件显示,在我从类 ZipArchive 实例化一个对象并尝试执行 addFile 方法后,脚本失败。

这是我当前的 cron 命令:

30 4 * * * /bin/timeout -s 2 990000 /usr/bin/php /home/script.php > /tmp/script.log

感谢您的帮助。

【问题讨论】:

  • 我会做:写日志看看脚本失败的地方。将限制设置为“无限制”(两个函数都为“0”)而不是值这么高。
  • 您的 cron 的第一个调用是否可能与第二个 cron 作业重叠?
  • stackoverflow.com/a/36190095/2275490,这是 Codeigniter 框架的设置,但您可能会从中得到一些结论......
  • 如果您知道它失败的地方,那么您是否尝试将 ZipArchive 作为间接路径?这通常会导致错误。这是一个测试,进入运行它的用户的主目录并输入 /usr/bin/php /home/script.php 看看你得到了什么
  • 有两个原因,1)cron没有使用你的用户名,或者2)cron用户不能写入/tmp的目录权限问题

标签: php cron


【解决方案1】:

通常当 PHP 脚本通过网络服务器运行但不通过命令行界面时,这是因为配置不同。您可以尝试备份当前 CLI 的 php.ini 并将当前 CGI 的 php.ini 复制到 CLI 的位置。如果您能够正确执行脚本,您就知道这是因为配置。

【讨论】:

  • 我怀疑这是 PHP 的存档功能的某种错误,因为现在当我通过 SSH 进入服务器后通过终端运行命令时它甚至没有执行
【解决方案2】:

不幸的是,使这项工作的唯一解决方案是一个丑陋的工作,它工作得很好。这是一个简单的CURL脚本,执行crontab无法执行的文件。然后我把CURL文件放在crontab中。

所以我通过 crontab 执行 CURL 脚本,然后执行无法通过 cron 执行的脚本。这很丑陋,但它有效..

# Open a PHP/CURL session
$s = curl_init();

# Configure the PHP/CURL command
curl_setopt($s, CURLOPT_USERAGENT,'Mozilla/5.0 (compatible; Googlebot/2.1; +http://www.google.com/bot.html)');
curl_setopt($s, CURLOPT_URL, "HTTP://YOUR_DOMAIN.COM/SCRIPT.PHP"); // Define target site
curl_setopt($s, CURLOPT_RETURNTRANSFER, TRUE);  // Return file contents in a string
curl_setopt($s, CURLOPT_BINARYTRANSFER, false);  // Indicate binary transfer
curl_setopt($s, CURLOPT_REFERER, "https://google.ca");     // Referer value
curl_setopt($s, CURLOPT_SSL_VERIFYPEER, FALSE); // No certificate
curl_setopt($s, CURLOPT_FOLLOWLOCATION, TRUE);  // Follow redirects
curl_setopt($s, CURLOPT_MAXREDIRS, 4);          // Limit redirections to four

# Execute the PHP/CURL command (send contents of target web page to string)

if($run_the_script = curl_exec($s))
    echo "cron executed!";

cron 脚本在标头中包含以下内容,它对执行脚本的普通用户提供了松散的保护:

if (isset($_SERVER['REMOTE_ADDR']) AND $_SERVER['SERVER_ADDR'] != $_SERVER['REMOTE_ADDR']) die('Permission denied.');

^ 检查文件是否由与服务器位于同一 IP 的脚本执行

【讨论】:

    猜你喜欢
    • 2016-11-30
    • 2014-05-16
    • 2018-05-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-18
    • 1970-01-01
    相关资源
    最近更新 更多