优化PHP中的文本/HTML文件下载



我正在尝试下载多个文件,这些文件位于一个按顺序命名的文件夹中,即1.html、2.html、3.html、9999.html

使用PHP读取/处理HTML文件的最佳方式是什么

[该文件也将由DOMXPath使用!]

以下是UI 的代码

<html lang="en">
<head>
<meta charset="utf-8"/>
<script type="text/javascript" src="jquery.js"></script>
<script type="text/javascript">
$(document).ready(function() {
$('#btn').click(function() {
$('#p3').val(0);$('#p2').val(0);
var i;
$('#p1').val(parseInt($('#st').val()));
for (i = parseInt($('#st').val()); i < parseInt($('#en').val()); i++) {
var jqxhr = $.post("downloader.php", { 'id':i }, function() {
})
.always(function(data) {
if (data != 0)
$('#p2').val(parseInt($('#p2').val()) + 1);
else
$('#p3').val(parseInt($('#p3').val()) + 1);
$("#txt").val($("#txt").val() + "n" + data);
$('#p1').val(parseInt($('#p1').val()) + 1);
});
}
});
});
</script>
</head>
<body>
<form name="frm" id="frm">
Start from <input type="text" name="st" id="st" /> To <input type="text" name="en" id="en" /> <hr/>
Processing <input type="text" name="p1" id="p1" /> <br/>
Processed <input type="text" name="p2" id="p2" /> <br/>
Not found <input type="text" name="p3" id="p3" /> <br/>
<input type="button" id="btn" value="Start" />
</form>
<textarea id="txt" name="txt"></textarea>
</body>
</html>

后台爬虫

<?php
error_reporting(0);
$id = 0;
$id = intval($_POST['id'])+1;
$url = 'https://remote.server/'.$id.'.html';
//$html = curl_get_contents($url);
if (!$html = @file_get_contents($url)) {    echo 0;     }
//some processing of the data
$data = (new DOMXPath ( (@DOMDocument::loadHTML ( $html )) ))->query ( '//span[@class="data"]' )->item ( 1 )->textContent;
$data2 = (new DOMXPath ( (@DOMDocument::loadHTML ( $html )) ))->query ( '//span[@class="data2"]' )->item ( 0 )->textContent; 
/*insertion of data
$dba_host='p:localhost'; $dba_name='root'; $dba_pass=''; $dba_db='db'; $con=mysqli_connect($dba_host,$dba_name,$dba_pass,$dba_db) or die('Connection Refused !');
$stmt = mysqli_prepare($con,"INSERT INTO `tbl` *,*) VALUES (?,?)");
mysqli_stmt_bind_param($stmt,"ss", *, *);  mysqli_stmt_execute($stmt);
mysqli_stmt_close($stmt);  mysqli_close($con);
*/
function curl_get_contents ($url) {
$curl = curl_init();
curl_setopt($curl, CURLOPT_RETURNTRANSFER, True);
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl,CURLOPT_USERAGENT,'Mozilla/5.0 (Windows NT 6.1; W…) Gecko/20100101 Firefox/61.0');
$return = curl_exec($curl);
curl_close($curl);
return $return;
}
echo 1;
?>

到目前为止,表现看起来真的很慢。如何改进/优化代码?

  1. 使用curl_multi-api并行下载页面,这将大大加快下载速度,您可以在这里找到使用curl_multiply的示例。

  2. 使用压缩进行传输,因为.html文件压缩得很好,这也会显著提高性能。要使用压缩传输,只需将CURLOPT_ENCODING设置为emptystring,例如curl_setopt($ch,CURLOPT_ENCODING,"");,curl将使用压缩进行传输。

  3. 您可以通过只创建DOMDocument和DOMXPath元素一次并重复使用这些元素,因为从大型html源代码创建它们需要cpu时间,而且您的代码毫无理由地创建了两次它们。具体来说,这将更快,使用更少的CPU:

$domd=@DOMDocument::loadHTML($html); $xp=new DOMXPath($domd); $data = $xp->query ( '//span[@class="data"]' )->item ( 1 )->textContent; $data2 = $xp->query ( '//span[@class="data2"]' )->item ( 0 )->textContent;

  1. 如果它们可以缓存,则可以将它们的本地缓存版本组合起来使用更新守护进程或cronjob,应该会产生比所有守护进程都更高的性能将上述其他3种优化方法组合在一起。您可以在这里找到如何创建数据的本地缓存副本。。至于如何创建守护进程或cronjobs,这是特定于操作系统的(在类似Unix的系统上,如Linux、BSD或Mac,通常使用Cron,在Windows系统上,通常使用at命令或Task Scheduler)

最新更新