Почему в некоторых 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 даже без этого параметра, но он работал для меня.