2015-12-19 2 views
1

Я написал скрипт PHP, который будет проходить через ок. 500 URL-адресов и проверить их состояние:Получить эффективный URL-адрес и его статус с помощью cURL

<?php 
$ch = curl_init(); 

curl_setopt($ch, CURLOPT_URL, $url); 
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); 
curl_setopt($ch, CURLOPT_NOBODY, true); 
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); 
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); 
curl_exec($ch); 

$destURL = curl_getinfo($ch, CURLINFO_EFFECTIVE_URL); 
$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE); 

curl_close($ch); 

echo $destURL . " - " . $statusCode; 

Может ли это быть оптимизировано дальше или есть лучший способ сделать это?

+0

выглядит, как вы забыли 'curl_exec ($ ч)'! Другой способ может заключаться в использовании 'curl_multi_exec', но проблема в том, что ответ от curl_multi_info_read не очень полезен. Curl_multi_exec позволяет обрабатывать URL-адреса параллельно, поэтому должен быть быстрее – RamRaider

+0

@RamRaider Я добавил оператор 'curl_exec ($ ch)' в вопросе. Он должен был быть таким, просто забыл поставить его здесь в вопросе. Я также планировал использовать 'curl_multi_exec', но я не могу понять, как его реализовать, поскольку мне нужен окончательный эффективный URL-адрес и их статусы. – littleibex

+0

У меня была небольшая игра с curl_multi ... некоторое время назад (был занят, поэтому задержка), но, как вы уже упоминаете, вы не можете легко возвращать эффективный URL-адрес или статус http, и, как я уже сказал, curl_multi_info_read почти бесполезен – RamRaider

ответ

1

Вы можете сделать это довольно легко с GuzzleHttp:

use GuzzleHttp\TransferStats; 

$effectiveURL = ''; 
$statusCode = 0; 

$client = new GuzzleHttp\Client(); 
$client->get($url, [ 
    'on_stats' => function (TransferStats $stats) use (&$effectiveURL, &$statusCode) { 

     $effectiveURL = (string) $stats->getEffectiveUri(); 
     if ($stats->hasResponse()) { 
      $statusCode = $stats->getResponse()->getStatusCode(); 
     } 

    }, 
]); 

echo $effectiveURL . '<br>'; 
echo $statusCode; 
Смежные вопросы