На следующем шаге я проверяю, что мои данные в базе данных совпадают с теми, которые возвращаются скрапером. Сначала я очищаю все свои данные и переупорядочиваю массив. Затем я создаю цикл по всей длине этого массива. Теперь я делаю новый цикл и проверяю эти данные в первом массиве, во втором цикле то же самое. То же самое: я создаю новый массив с найденными данными, и если я ничего не нахожу, я создаю новый массив без найденных данных. В том или ином случае я использую 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"
*/
Я надеюсь, что кто-нибудь сможет помочь мне оптимизировать этот код или найти лучшее решение. Сейчас мне нужно проверить 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