Оптимизация загрузки текстовых / HTML файлов в PHP - PullRequest
0 голосов
/ 20 декабря 2018

Я пытаюсь загрузить несколько файлов, которые находятся в папке с последовательными именами, например 1.html, 2.html, 3.html, 9999.html

Что будетбыть лучшим способом для чтения / обработки файлов HTML с использованием PHP?

[Файл также будет использоваться DOMXPath!] *

Ниже приведен код пользовательского интерфейса

<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 Ответ

0 голосов
/ 21 декабря 2018
  1. используйте API curl_multi для параллельной загрузки страниц, что должно значительно ускорить загрузку, пример использования curl_multi можно найти здесь .

  2. использует сжатие для передачи, поскольку файлы .html сжимаются очень хорошо, что также должно привести к значительному повышению производительности.чтобы использовать сжатую передачу, просто установите для CURLOPT_ENCODING пустую строку, например, curl_setopt($ch,CURLOPT_ENCODING,"");, и curl будет использовать сжатие для передачи.

  3. вы можете микрооптимизировать использование процессора, создав только DOMDocument.и DOMXPath элементы один раз, и повторно используйте элементы, потому что создание их из большого исходного кода html требует времени процессора, а ваш код создает их дважды без веской причины.в частности, это будет быстрее и потребляет меньше ресурсов процессора:

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

Если они могут быть кэшированы, то их локальные кэшированные версии, возможно, в сочетании с демоном обновления или cronjob, должны дать большую производительность, чем все остальные 3 подхода оптимизации, вместе взятых.вы можете узнать, как создавать локальные кэшированные копии данных здесь .. как создавать демоны или cronjobs, которые зависят от ОС (в Unix-подобных системах, таких как Linux, BSD или Mac,вы обычно используете Cron, в Windows-системах вы обычно используете команду at или Task Scheduler)
...