Я постараюсь быть немного более понятным в своем тексте, чем в заголовке.
Я создал страницу 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
if (!taxtable) throw new SomeException();
Поместите свою лоскутную логику в функцию, тогда try
эту функцию и проверьте ваши ошибки таким образом.
Не могу помочь вам очистить веб-страницу, о которой я не знаю данных. Можете ли вы привести пример данных из вашего запроса curl и таблицы образцов?
Других решений пока нет …