Отказ от использования Goutte\Client на многих страницахPhp

Кемеровские программисты php общаются здесь
Гость
Отказ от использования Goutte\Client на многих страницах

Сообщение Гость »

Я создаю сценарий очистки для проверки любых данных в этой сети. Мой скрипт должен посетить этот сайт и получить все hrefs. На этом этапе у меня не возникло никаких проблем.
На следующем шаге я проверяю, что мои данные в базе данных совпадают с теми, которые возвращаются скрапером. Сначала я очищаю все свои данные и переупорядочиваю массив. Затем я создаю цикл по всей длине этого массива. Теперь я делаю новый цикл и проверяю эти данные в первом массиве, во втором цикле то же самое. То же самое: я создаю новый массив с найденными данными, и если я ничего не нахожу, я создаю новый массив без найденных данных. В том или ином случае я использую unset(), чтобы удалить этот индекс, а также делаю новый array_slice, чтобы упорядочить индекс после удаления. После этого мне нужно некоторое время, чтобы снова вызвать свою функцию и отправить ей мой массив с минусовым индексом. Пока я создаю ассоциативный массив со всеми моими result_ok и result_ko
Моя проблема в том, что всегда мой сервер (на локальном хосте, в этом момент) доходит до таймаута, и я не знаю, как это решить.
В моем коде есть перерыв, чтобы выйти из цикла, но задержка очень очень много.
Моя логика:

Код: Выделить всё

$counter = 0;

try{
foreach($data as $content){
$file_headers = @get_headers($content["post_url"]);
if(!$file_headers || $file_headers[0] == 'HTTP/1.1 404 Not Found') {
$exists = false;
$access_ko[] = $this->order;
}else{
$client = new Client();
$website = $client->request('GET', $content["post_url"]);
$website->filter('p > a')->each(function ($node) {
// adding data into array with all link found
array_push($this->found_link, $node->text());
array_push($this->hrefs, $node->attr('href'));
array_push($this->rels, $node->attr('href'));

});// END EACH FUNCTION

}// end else

break;
}// end initial foreach

// delete empty index and order array.
$order_array = array_filter($this->found_link);
$clear_array = array_slice($order_array, 0);

// loop to compare all data
for($i=1; $itext with data
foreach($data as $result){
if($clear_array[$i] == $data[$i]["anchor_text"]){
//if condition it´s true assign data to array, that will be returned to view or PDF
$finalData = [
'pedido' => $data[$i]["order"],
'articulo'  => $data[$i]["order_name"],
'url' => $data[$i]["url"],
'post_url' => $data[$i]["post_url"],
'anchor_text' => $data[$i]["anchor_text"],
'tipo'  => $data[$i]["type_link"],
// scraping web result
'result_test' => $this->hrefs[$i],
'link_rel'  => $this->rels[$i],
];
array_push($this->result_ok, $finalData);
unset($this->found_link[$i]);
$this->newArray = array_slice($this->found_link, 0);
break;
}else{
$finalData = [
'pedido' => $data[$i]["order"],
'articulo'  => $data[$i]["order_name"],
'url' => $data[$i]["url"],
'post_url' => $data[$i]["post_url"],
'anchor_text' => $data[$i]["anchor_text"],
'tipo'  => $data[$i]["type_link"],
// scraping web result
'result_test' => $this->hrefs[$i],
'link_rel'  => $this->rels[$i],
];
$this->result_ko[] = $finalData;
array_push($this->result_ko, $finalData);
unset($this->found_link[$i]);
$this->newArray = array_slice($this->found_link, 0);
break;
}
}

$counter++;

}// end for

/*var_dump($this->result_ok);
exit();*/

while($counter checkPages($data);
return array("result_ok" => $this->result_ok, "result_ko" => $this->result_ko);
}

}catch(\Exception $e){
Log::info('have a error or warning in function checkPages in controller CheckPublicationsClientController with this message: '.  $e->getMessage());
echo "entro exception: ".$e->getMessage();
}
один пример данных:

Код: Выделить всё

/**
*   EXAMPLE DATA THAT ARRIVE TO THIS FUNCTION
*
*   "order" => "PEDIDO#20002 - mundoejecutivo.com.mx"
*   "order_name" => "mundoejecutivo.com.mx"
*   "post_url" => "https://mundoejecutivo.com.mx/empresas/empleos-mas-demandados-en-mexico-y-un-enfoque-a-especialistas-en-sap/"
*   "anchor_text" => "Xamai es partner SAP"
*   "url" => "https://mx.xamai.com/"
*   "type_link" => "follow"
*/
В post_url я ищу все ahrefs и, если они содержат ["anchor_text"], я делаю for и foreach >
Я надеюсь, что кто-нибудь сможет помочь мне оптимизировать этот код или найти лучшее решение. Сейчас мне нужно проверить 300 заказов, но вполне возможно, что это число увеличится.
Обновить
сейчас Я пытаюсь создать очередь для решения моей проблемы. Я выполнил php artisan make:job CheckPages, и только в моем дескрипторе функции у меня есть логика, позволяющая проверить, существует ли ссылка, и извлечь информацию из URL:

Код: Выделить всё

public function __construct($dataReceived)
{
$this->data = $dataReceived;
}

/**
* Execute the job.
*
* @return void
*/
public function handle()
{
try{
DB::commit();
for($i=1; $idata); $i++){
$file_headers = @get_headers($this->data[$i]["post_url"]);
if(!$file_headers || $file_headers[0] == 'HTTP/1.1 404 Not Found') {
$exists = false;
$access_ko[] = $this->data[$i]["order"];
break;
}else{
$client = new Client();
$website = $client->request('GET', $this->data[$i]["post_url"]);
$website->filter('p > a')->each(function ($node) {
// adding data into array with all link found
array_push($this->found_link, $node->text());
array_push($this->hrefs, $node->attr('href'));
array_push($this->rels, $node->attr('href'));

});// END EACH FUNCTION

break;

}// end else
}
return array("found_link" => $this->found_link, 'hrefs' => $this->hrefs, 'rels' => $this->rels);
}catch(\Exception $e){
DB::rollBack();
Log::info('have a error or warning in function checkPages in controller CheckPublicationsClientController with this message: '. $e->getMessage());
echo "entro exception: ".$e->getMessage();
}
}
Я вызываю эту очередь в своем контроллере:

Код: Выделить всё

$result = CheckPages::dispatch($newAllDataOrder);
но теперь я не знаю, что мне делать?
Спасибо, что прочитали меня и помогли мне

Подробнее здесь: https://stackoverflow.com/questions/781 ... -many-page

Вернуться в «Php»