Почему в некоторых URL-адресах PHP cURL отображается как "тайм-аут"?

Я использую PHP cURL для получения некоторой информации о тегах из различных URL-адресов. Мои запросы иногда работают, но иногда они не работают вообще. Есть ли какая-то причина, почему мой код не работает? (Обратите внимание, что я также использую simple_html_dom):

$webpage = 'http://www.some_url.com';

$curl = curl_init(); 
curl_setopt($curl, CURLOPT_URL, $webpage);  
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);  
curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, 10);
curl_setopt($curl, CURLOPT_FAILONERROR, true);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_AUTOREFERER, true);
curl_setopt($curl, CURLOPT_FRESH_CONNECT, true);

$str = curl_exec($curl);  
curl_close($curl);  

$html = '';

if( !empty($str) )
{
    require_once( 'simple_html_dom.php');

    $html= str_get_html($str);
    $element = $html->find('h1', 0);
    $webpage_name = strip_tags($element);

    $item = $html->find('meta[name=description]', 0);
    $description =  $item->content;
}

// save $description to database
// save $webpage_name to database

Примерно для половины URL-адресов, которые я пробую, описание и имя_страницы хранятся в моей базе данных, но для другой половины они не сохраняются, и сценарий просто останавливается. То есть, когда пользователь отправляет URL-адрес на мой веб-сайт, во время загрузки URL-адреса на мой сайт отображается индикатор выполнения. Затем индикатор выполнения исчезает, и URL отображается на моей веб-странице, чтобы пользователь мог увидеть его после завершения отправки URL-адреса. Для проблемных URL-адресов индикатор выполнения исчезает, но ссылка не появляется на странице, и в моей базе данных ничего не сохраняется. Что мне не хватает?

3 ответа

Решение

Мой журнал ошибок говорит "Вызов неопределенной функции mb_detect_encoding()". Эта функция требует, чтобы было включено расширение mbstring (оно необходимо для simple_html_dom.php). У MAMP это установлено по умолчанию, и поэтому оно работает на моем сервере разработки, но не на моем рабочем сервере. Я поместил запрос на включение mbstring на моем производственном сервере Linux, так что я сообщу всем, если это на самом деле в чем проблема. Я видел несколько постов онлайн с людьми, имеющими ту же проблему, поэтому я надеюсь, что это поможет многим людям.

Попробуйте использовать curl_getinfo до вашего curl_close вызов. В дополнение к куче другой полезной информации, он даст вам код состояния HTTP, который позволит вам узнать, что происходит с вашими запросами. Это должно дать вам ответы, которые вам нужны... просто убедитесь, что удалить это CURLOPT_FAILONERROR настройка (или установите его на false).

Ваш вопрос был давно, но вот мое решение. У меня была такая же проблема, curl работал локально на моей машине с Windows, но не на Linux. Просто некоторые URL, а не все. Я использовал CURLOPT_SSL_VERIFYPEER со значением false, затем я также добавил CURLOPT_SSL_VERIFYHOST. По крайней мере, в моем случае URL-адреса не работали из-за того, что SSL-сертификаты не были четко определены для домена, к которому я пытался получить доступ. Я не знаю, почему он работал на Windows даже без этого параметра, но он работал для меня.

Другие вопросы по тегам