Очистка PHP с помощью DOM и многопроцессорной функции fopen () возвращает ошибку (вызов функции getElementsByTagName () для необъекта) при анализе html

Я постараюсь быть немного более понятным в своем тексте, чем в заголовке.

Я создал страницу php, которая очищает другой интернет-сайт и сохраняет результаты в массиве, а не в базе данных (повторяется 155 раз, и эти множественные вызовы основаны на другом массиве).

Чтобы получить более быстрый результат, я реализовал еще одну php-страницу, в которой функция fopen () многократно (примерно пять-пять раз) вызывала «чистку страницы», разделяя исходный массив на 5 частей.

Все работает каждый раз, когда я вызываю очищающую страницу, повторяющуюся 155 раз, один за другим. Но когда я использую fopen (), он начинает возвращать мне (иногда) эту ошибку:

 Fatal error: Call to a member function getElementsByTagName() on a non-object

Так что я полагаю, что это должен быть метод «многопроцессорной обработки», поэтому, если я активирую очистку слишком много времени, это возвращает мне ошибку.

Поэтому я попытался вызвать «чистящую страницу» в 3 или 2 раза лучше, чем дать отдых сценарию (sleep (1)), а затем вызвать другую в 2/3 раза чистящую страницу.
И в этом случае, иногда, я получаю, что все сценарии работают отлично, в другой раз у меня снова всегда одна и та же ошибка.

Это часть моего кода.
ИЗ СТРАНИЦЫ СКРЕБКА (скрипт скрипта):

function taxExtract($countryList,$urlTax,$countryID,$countryName,$countryTag) {

echo $urlTax;

$optionsTax = Array(
CURLOPT_RETURNTRANSFER => TRUE,  // Setting cURL's option to return the webpage data
CURLOPT_FOLLOWLOCATION => TRUE,  // Setting cURL to follow 'location' HTTP headers
CURLOPT_AUTOREFERER => TRUE, // Automatically set the referer where following 'location' HTTP headers
CURLOPT_CONNECTTIMEOUT => 300,   // Setting the amount of time (in seconds) before the request times out
CURLOPT_TIMEOUT => 300,  // Setting the maximum amount of time for cURL to execute queries
CURLOPT_MAXREDIRS => 10, // Setting the maximum number of redirections to follow
CURLOPT_USERAGENT => "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.9.1a2pre) Gecko/2008073000 Shredder/3.0a2pre ThunderBrowse/3.2.1.8",  // Setting the useragent
CURLOPT_URL => $urlTax, // Setting cURL's URL option with the $url variable passed into the function
);

$TaxCurl = curl_init($urlTax);
curl_setopt_array($TaxCurl, $optionsTax);   // Setting cURL's options using the previously assigned array data in $options
$resultTaxCurl = curl_exec($TaxCurl);
$htmlTax = $resultTaxCurl;

$domTax = new DOMDocument();
$htmlTax = $domTax->loadHTML($htmlTax);

$domTax->preserveWhiteSpace = false;

$taxFullArr = array();
$taxFullArr[] = array (
'countryID' => $countryID,
'countryName' => $countryName,
'countryTag' => $countryTag);

$alltaxtables = $domTax->getElementsByTagName('table');

if($alltaxtables->length > 1) { // GET ONLY THE FIRST TABLE IF THERE ARE MORE THAN 1
$taxtable = $alltaxtables->item(2);
}

$taxrows = $taxtable->getElementsByTagName("tr");
foreach($taxrows as $taxrow) {
$taxcols = $taxrow->getElementsByTagName('td');
if (($taxcols->item(0)->nodeValue != "Resource") and ($taxcols->item(1)->nodeValue != "VAT") and ($taxcols->item(2)->nodeValue != "Import Tax") and ($taxcols->item(3)->nodeValue != "Income Tax")) {
echo "this is Country ID: ".$countryID." - ";
echo "this is Country Name: ".$countryName." - ";
echo "this is Country Tag: ".$countryTag." - ";
echo "this is Resource: ".$taxRes = $taxcols->item(0)->nodeValue." - ";
echo "this is Vat tax: ".trim($taxIva = $taxcols->item(1)->nodeValue)." - ";
echo "this is Import tax: ".trim($taxImport = $taxcols->item(2)->nodeValue)." - ";
echo "this is Work tax: ".trim($taxWork =  $taxcols->item(3)->nodeValue)." - ";

$taxList[] = array (
'taxRes' => $taxRes,
'taxVat' => $taxIva,
'taxImport' => $taxImport,
'taxIncome' => $taxWork
);

}}
$taxFullArr[] = $taxList;
};

ОШИБКА ВСЕГДА ОТНОСИТСЯ К ЭТОЙ ЧАСТИ КОДЕКСА:

 $taxrows = $taxtable->getElementsByTagName("tr");

FROM MULTY PROCESS PAGE (многопроцессный скрипт):

 if (($totC > 150) && ($totC <= 200)) {
echo "<br>do something it's between 151-200";

//> 150 - 5 array
$part1 = array();
$part2 = array();
$part3 = array();
$part4 = array();
$part5 = array();

list($part1, $part2, $part3, $part4, $part5) = array_chunk($countryList, ceil(count($countryList) / 5));

echo "<br><br>ARRAY 1: <br>";
print_r($part1);
echo "<br>total count for part1 = ".count($part1);
$data1 = extractTax($server,$part1); sleep(1);
echo "<br><br>ARRAY 2: <br>";
print_r($part2);
echo "<br>total count for part2 = ".count($part2);
$data2 = extractTax($server,$part2); sleep(1);

resp($data1);
echo_flush();
resp($data2);
echo_flush();

echo "<br><br>ARRAY 3: <br>";
print_r($part3);
echo "<br>total count for part3 = ".count($part3);
$data3 = extractTax($server,$part3); sleep(1);
echo "<br><br>ARRAY 4: <br>";
print_r($part4);
echo "<br>total count for part4 = ".count($part4);
$data4 = extractTax($server,$part4); sleep(1);

resp($data3);
echo_flush();
resp($data4);
echo_flush();

echo "<br><br>ARRAY 5: <br>";
print_r($part5);
echo "<br>total count for part5 = ".count($part5);
$data5 = extractTax($server,$part5); sleep(1);

resp($data5);
echo_flush();
}

function extractTax($server,$cList) {
echo "<br><br><i>***** Country List Updater ******</i></p><br>";
echo "<i>***** Server $server *****</i><br>";

echo "<br><i><p class='start'>** Launched process $server **</i></p>";
$cLists = base64_encode(serialize($cList));
$url = "[...url...]/cData.php?server=".$server."&cList=".$cLists;
$child = fopen($url, 'r');
if ($child == TRUE) {
echo "<br>Worked! Move on...<br>";
} else {
$i = 0;
while ($child == FALSE && $i<=3) {
echo "There's problem with fopen(), waiting for next try<br>";
sleep(60);
$i++;
echo "<br>Attempt $i/3 (after the 3rd, I'll move on)<br>";
$child = fopen($url, 'r');
}
if ($child == TRUE) {
echo "<br>Finally worked! Moving on...<br>";
}
if ($child == FALSE && $i == 3) {
echo "After 3 usuccessful attempts, I'm moving on...<br>";
}
} return $child;
};

function resp($data) {
// get response from child (if any) as soon at it's ready:
$response = stream_get_contents($data);
echo "<br><b><p class='buytitles'>+++This is RESPONSE from process+++</b></p>";
echo "<br>".$response;
echo "<br><b><p class='buyendtitles'>---RESPONSE END process ---</b><br></p>";
fclose($data);
echo_flush();
}

Вы знаете, почему это происходит? Вы знаете, как я мог это исправить?

Просьба просить дальнейших объяснений, извините, если я не был достаточно ясен.

Alberto

0

Решение

if (!taxtable) throw new SomeException();

Поместите свою лоскутную логику в функцию, тогда try эту функцию и проверьте ваши ошибки таким образом.

Не могу помочь вам очистить веб-страницу, о которой я не знаю данных. Можете ли вы привести пример данных из вашего запроса curl и таблицы образцов?

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]