Cronjob脚本失败,但可通过浏览器(Zip存档PHP)工作

Cronjob脚本失败,但可通过浏览器(Zip存档PHP)工作,php,cron,Php,Cron,我有一个PHP脚本,当我通过SSH执行它时,它会生成大的zip文件,但当通过cron执行时,同一个脚本会间歇性地失败 我尝试过的事情: 更改脚本内部的路径,但由于它是通过SSH执行的,所以这不应该是问题所在 在cron命令中更改PHP可执行文件的路径(我运行了“whereis PHP”并使用了2个可用的PHP可执行文件位置) 修改的文件权限 将时间限制设置为ini_集合('max_execution_time',990000)和via设置时间限制(990000) 托管公司提供了六张支持票,但他

我有一个PHP脚本,当我通过SSH执行它时,它会生成大的zip文件,但当通过cron执行时,同一个脚本会间歇性地失败

我尝试过的事情:

  • 更改脚本内部的路径,但由于它是通过SSH执行的,所以这不应该是问题所在
  • 在cron命令中更改PHP可执行文件的路径(我运行了“whereis PHP”并使用了2个可用的PHP可执行文件位置)
  • 修改的文件权限
  • 将时间限制设置为ini_集合('max_execution_time',990000)和via设置时间限制(990000)
  • 托管公司提供了六张支持票,但他们帮不上忙
我现在尝试的最后一件事是手动设置一个时间限制,在这个时间限制之后,cronjob将失败,包括: /bin/timeout-S2990000但我认为这是没有用的,因为通常没有时间限制,除非我遗漏了什么

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

这是我当前的cron命令:

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

感谢您的帮助。

不幸的是,让这部作品成功的唯一解决方案是一部难看的作品,这部作品效果很好。这是一个简单的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上的脚本执行

不幸的是,使此工作正常的唯一解决方案是一个丑陋的工作,它非常有效。这是一个简单的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上的脚本执行

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

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

我会做:编写日志,查看脚本失败的地方。将限制设置为“no limit”(两个函数都设置为“0”),而不是太高的值。是否可能来自cron的第一个调用与第二个cron作业重叠?请参阅,这是Codeigniter框架的设置,但您可能会从中得到一些结论……如果您知道它在哪里失败,那么您是否尝试作为间接路径转到ZipArchive?这通常会导致错误。这里有一个测试,转到运行该测试的用户的主目录,键入/usr/bin/php/home/script.php,看看您得到了什么。这有两个原因,1)cron没有使用您的用户名,或者2)cron用户无法写入/tmpI的目录权限问题:写入日志以查看脚本失败的位置。将限制设置为“no limit”(两个函数都设置为“0”),而不是太高的值。是否可能来自cron的第一个调用与第二个cron作业重叠?请参阅,这是Codeigniter框架的设置,但您可能会从中得到一些结论……如果您知道它在哪里失败,那么您是否尝试作为间接路径转到ZipArchive?这通常会导致错误。这里有一个测试,转到运行该测试的用户的主目录,键入/usr/bin/php/home/script.php,看看您得到了什么有两个原因,1)cron没有使用您的用户名,或者2)存在cron用户无法写入/tmpI的目录权限问题。我怀疑这是php存档函数的某种缺陷,因为现在我在SSH进入服务器后通过终端运行命令时,它甚至没有执行我怀疑这是PHP存档功能的某种缺陷,因为现在我在SSH进入服务器后通过终端运行命令时,它甚至没有执行