[英]Running large PHP script as cron job in background to avoid 503 error
我有一个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
将运行cron作业的trigger.php
触发文件editxml.php
文件保存脚本在后台运行? 内部trigger.php
是: exec("/path/to/editxmltest.php > /dev/null &");
看来您的服务器执行超时。 通过在代码顶部添加以下代码来增加执行时间
set_time_limit(0);
您还可以在php.ini上增加( 请参阅 )
ini_set('max_execution_time', 300); //300 seconds = 5 minutes
请检查以下主题以获取最佳做法,
有关此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 &
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.