【问题标题】:Running large PHP script as cron job in background to avoid 503 error在后台运行大型 PHP 脚本作为 cron 作业以避免 503 错误
【发布时间】:2016-03-19 11:21:45
【问题描述】:

我有一个 PHP 脚本 editxml.php,它使用几个 foreach 循环组合了一组 XML 文件。它适用于 4 或 5 个文件,但如果我尝试 20 个文件,则服务器超时并收到 503 错误。该脚本输出一个保存在同一目录中的 XML 文件,但不需要在浏览器中显示任何内容。我怎样才能在后台运行它直到它完成?

$fileout = 'output.xml';
$dst = simplexml_load_file( 'template.xml' );
$dst = dom_import_simplexml( $dst )->ownerDocument;
$parent = $dst->getElementsByTagName( 'root' )->item(0);

$files = array(
"1.xml", // desc
"2.xml", // desc
"3.xml", // desc
"4.xml", // desc
"5.xml", // desc
"6.xml", // desc


);  

foreach ($files as $xml) {

$src = simplexml_load_file($xml);

    foreach( $src->product as $product )
  {
      $node = dom_import_simplexml( $product );
      $node = $dst->importNode( $node, 1 );
      $parent->appendChild( $node );
  }
}

$final = new DOMDocument();
$final->loadXML( $dst->saveXML(), LIBXML_NOBLANKS );
$final->formatOutput = True;
echo $final->saveXML();
$fh = fopen( $fileout, 'w') or die ( "can't open file $fileout" );
fwrite( $fh, $final->saveXML() );
fclose( $fh );

我正在使用带有 serverpilot 的 digitalocean ubuntu 14.04 droplet,但是任何需要 shell/bash 或远程 ssh 或 PATH 更改的东西对我来说都非常困难,所以我想尽可能避免这种情况。我知道路径,但远程连接 PHP 和 shell 等...不是我的强项。

* 15 * * * /opt/sp/php5.6/bin/php -f /path/to/trigger.php > /dev/null 2>&1

对触发editxml.php 文件的trigger.php 文件运行cron 作业是否会保持脚本在后台运行? trigger.php 内部是: exec("/path/to/editxmltest.php > /dev/null &");

【问题讨论】:

标签: php bash apache cron


【解决方案1】:

您的服务器似乎在执行时超时。通过在代码顶部添加以下代码来增加执行时间

set_time_limit(0);

你也可以在php.ini上增加(Refer)

ini_set('max_execution_time', 300); //300 seconds = 5 minutes

请查看以下主题以获得最佳实践,

Running php script as cron job - timeout issues?

【讨论】:

  • 谢谢,我之前曾尝试使用set_time_limit(0); ignore_user_abort(true);,但没有任何运气。我想我将不得不编辑 php.ini 文件。完成后我会报告。
  • Derek,在没有 cron 的情况下执行代码。它工作正常吗?
  • 如果我将它缩小到 3 或 4 个文件,是的,但是当我增加它时它会超时。我忘记了 serverpilot 使访问您的 php.ini 文件变得比平时更困难,所以我必须就此与他们联系。
  • Derek,尝试在 php.ini 上更改并在 phpinfo() 上验证它,让我知道它解决了。祝你好运!!
  • 我确实按照这些说明更改了 PHP.ini 文件,但它似乎不起作用:serverpilot.io/community/articles/… 如果这是一个非常大的操作怎么办?最终输出文件将解压缩 500mb。有没有更有效的方法来运行这么大的进程?
【解决方案2】:

有关此 subreddit 线程修复的更多信息:https://www.reddit.com/r/PHPhelp/comments/4a9l48/best_practices_for_running_a_large_php_script_in/

我最终以登录用户的身份从命令行手动运行它,我会担心稍后会自动执行该过程,但 PHP 过程已成功完成并将文件输出到正确的目录。我使用的命令是

nohup php -q /path/to/test.php > /path/to/process_log.xml 2>&1 &

【讨论】:

    猜你喜欢
    • 2011-05-10
    • 1970-01-01
    • 2011-05-02
    • 2018-06-11
    • 2016-12-06
    • 2017-09-03
    • 2020-02-28
    • 2018-07-30
    • 1970-01-01
    相关资源
    最近更新 更多