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

时间:2018-12-20 18:05:01

标签: php curl file-get-contents php-curl

我正在尝试下载多个文件,这些文件位于具有连续名称的文件夹中,即 1.html,2.html,3.html,9999.html

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

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

下面是用户界面的代码

<?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;
?>

后台搜寻器

upload_symbols_to_crashlytics(gsp_path: "./App/GoogleService-Info.plist")

到目前为止,性能看起来确实很慢。如何改进/优化代码?

1 个答案:

答案 0 :(得分:1)

  1. 使用curl_multi api并行下载页面,这将极大地提高下载速度,您可以找到使用curl_multi here的示例。

  2. 使用压缩进行传输,因为.html文件压缩得很好,这也将带来显着的性能改进。要使用压缩传输,只需将CURLOPT_ENCODING设置为emptystring,例如curl_setopt($ch,CURLOPT_ENCODING,"");,然后curl将使用压缩进行传输。

  3. 您可以通过仅创建以下内容来微优化CPU使用率: 一次使用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种优化方法。您可以了解如何创建数据here的本地缓存副本。有关如何创建守护程序或cronjobs的信息,这是特定于OS的(在类似Unix的系统上,例如Linux,BSD或Mac,您可以d通常会在Windows系统上使用Cron,通常会使用at命令或Task Scheduler