Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Обработка ошибок в multi CURL

 PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи


 Страниц (1): [1]   

> Описание: Как получить код произошедшей ошибки curl_errno?
tisar
Отправлено: 20 Мая, 2010 - 22:12:39
Post Id


Новичок


Покинул форум
Сообщений всего: 18
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




Подскажите пожалуйста как при использование multi CURL (многопоточный CURL), проверить произошла ли ошибка при загрузке?
при использование обычного CURL делал следующее:
PHP:
скопировать код в буфер обмена
  1.         $content = curl_exec($ch);
  2.         $errmsg  = curl_error($ch);
  3.         $header  = curl_getinfo($ch);
  4.         curl_close( $ch );
  5.        
  6.         if ($err<>0)
  7.         {
  8.                 echo 'Страница ' .$header['url'].' не была загружена из-за ошибки http_code: '.$header['http_code'].' err:' .$err.', errmsg: '.$errmsg;
  9.                 return 'ERROR: Страница ' .$header['url'].' не была загружена из-за ошибки http_code: '.$header['http_code'].' err:' .$err.', errmsg: '.$errmsg;
  10.         }
  11.         else
  12.         {
  13.                 return $content;
  14.         }

но при проверке на ошибку(curl_error) при использование multi CURL, всегда возвращается результат 0. Строка 85. Ниже приведён листин функции используемой для загрузке данных:
Спойлер (Отобразить)

Что я делаю не так и как можно выполнить проверку на ошибку произошедшую вовремя загрузке.

(Отредактировано автором: 20 Мая, 2010 - 22:17:03)

 
 Top
JustUserR
Отправлено: 21 Мая, 2010 - 11:46:06
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




tisar пишет:
Но при проверке на ошибку(curl_error) при использование multi CURL, всегда возвращается результат 0. Строка 85. Ниже приведён листин функции используемой для загрузке данных:
В случае работы с multi_curl вы не запускаете каждый поток отдельно а инициализируете их и запускаете потом все сразу через специальную оболочку - таким образом каждый изначально-инициализированный curl-объект не хранит результат запроса и соответственно код ошибки Поэтому информацию о каждом потоке надо смотреть также через функцию multicurl-оболочки curl-multi-info-read - конкретный пример ее использования есть здесь http://ru2.php.net/manual/en/fun...ti-info-read.php


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
tisar
Отправлено: 21 Мая, 2010 - 21:24:03
Post Id


Новичок


Покинул форум
Сообщений всего: 18
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




У меня почему то функция curl-multi-info-read и curl_multi_exec выдаёт странные данные:
PHP:
скопировать код в буфер обмена
  1. do
  2.         {
  3.                 $xx=curl_multi_exec($mh, $running);
  4.                 echo '<br>curl_multi_exec: '.$xx.',running: '.$running.'<br>';
  5.                 $info = curl_multi_info_read($mh);
  6.                 echo '$info: ';
  7.                 print_r($info);
  8.                 sleep(1);
  9.         }
  10.         while($running > 0);   

При работающем интернете:
Цитата:
curl_multi_exec: -1,running: 3
$info:
curl_multi_exec: 0,running: 3
$info:
curl_multi_exec: -1,running: 3
$info:
curl_multi_exec: -1,running: 3
$info:
curl_multi_exec: 0,running: 3
$info:
curl_multi_exec: -1,running: 3
$info:
curl_multi_exec: 0,running: 0
$info: Array ( [msg] => 1 [result] => 0 [handle] => Resource id #5 )

Если инет отключён:
Цитата:
curl_multi_exec: -1,running: 3
$info:
curl_multi_exec: 0,running: 3
$info:
curl_multi_exec: 0,running: 0
$info: Array ( [msg] => 1 [result] => 6 [handle] => Resource id #5 )

1) curl_multi_exec должны возвращать CURLM_CALL_MULTI_PERFORM до тех пор пока все потоки не завершены и по их завершению CURLM_OK, у меня же она возвращает 0 или -1;
2) curl_multi_info_read должна возвращать CURLMSG_DONE в ячейке 'msg', если поток завершился корректно, у меня возвращается всегда 1 в независимости от наличия инета. Что за 0 или 6 содержится в ячейке result?

Я что то не так понимаю или делаю не так? Использую denver PHP 5.2.12

(Отредактировано автором: 21 Мая, 2010 - 21:43:39)

 
 Top
JustUserR
Отправлено: 22 Мая, 2010 - 12:47:37
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




tisar пишет:
У меня почему то функция curl-multi-info-read и curl_multi_exec выдаёт странные данные:
Таким образом получается что обе указанные функци у вас выдают необычный результат - но при успешном соединении и получении HTTP-ответов функция curl_multi_getcontent выдает верные данные для каждого из потоков?
tisar пишет:
Я что то не так понимаю или делаю не так?
Приведенные вами константы multicurl-соединения типа CURLMSG_DONE на самом деле являются числами и служат лишь для удобства (Это похожий на ENUM механизм) - то есть эти константы предназначаются для проверки наподобие $x===CURLMSG_DONE - но в print_r выводе конечно же будут фигурировать обычные численные константы поэтому здесь у вас все правильно
Вы можете просмотреть конкретные значения констант и увидеть что CURLMSG_DONE как раз означает единицу - при этом помните что работать надо именно с multicurl-объектов а не первоначально-инициализированным и singlecurl-объектами которые сами по себе не используются а берется только их конфигурация
Если multicurl не работает для многих потоков то в случае PHP установлен у вас как модуль Apache то его внешние соединения также облагаются ограничениями web-сервера - то есть если в httpd.conf установлено определенный макисмум пареллельных соединений или другой нагрузки то таким образом вы не сможете обойти их - можете попробовать установить PHP как модуль CGI или сделать ео чистый запук как консольного CLI-скрипта


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
tisar
Отправлено: 23 Мая, 2010 - 06:33:55
Post Id


Новичок


Покинул форум
Сообщений всего: 18
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




А где можно найти описание констант из ячеек массива msg и result (удалось смоделировать 3 разных ответа 0, 6 и 7, но что они означают)?
 
 Top
valenok Модератор
Отправлено: 23 Мая, 2010 - 09:44:05
Post Id



Здесь могла бы быть ваша реклама


Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006  
Откуда: Israel


Помог: 3 раз(а)






-----
Truly yours, Sasha.
 
My status
 Top
JustUserR
Отправлено: 23 Мая, 2010 - 13:05:44
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




tisar пишет:
А где можно найти описание констант из ячеек массива msg и result (удалось смоделировать 3 разных ответа 0, 6 и 7, но что они означают)?
Именно для этого в модули и встраивают соответствующий набор ENUM-констант - делайте проверку получаемого результата на идентичность с определенной константой и получайте исходное состояние - то есть например if(msg===CURLMSG_DONE) то значит что передача успешно произошла и тд


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
tisar
Отправлено: 26 Мая, 2010 - 14:46:48
Post Id


Новичок


Покинул форум
Сообщений всего: 18
Дата рег-ции: Май 2010  


Помог: 0 раз(а)




Всем спасибо за ответы, очень помогли.

Переписав свой код заставил всётаки работать curl_exec, curl_error и curl_getinfo.

Спойлер (Отобразить)


P.S.: зачем столько заморочек с этими константами, не проще ли было сделать получение ошибок как в обычном курле?
 
 Top
JustUserR
Отправлено: 27 Мая, 2010 - 14:10:21
Post Id



Активный участник


Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009  


Помог: 17 раз(а)




tisar пишет:
Всем спасибо за ответы, очень помогли. Переписав свой код заставил всётаки работать curl_exec, curl_error и curl_getinfo. P.S.: зачем столько заморочек с этими константами, не проще ли было сделать получение ошибок как в обычном курле?
Пожалуйста! В multicurl система ошибок в принципе та же самая что и в однопоточном curl - просто везьде фигурируются массивы статистических данных заместо одиночных статистических данных - поэтому и приходится выполнять поочередную проверку и получения статусов потоков и сравнение их с multicurl-константами соединения
Также можно использовать функцию curl_multi_select для получения списка текущих socket-ов созданных multicurl-ом и делать проверку для каждого из них


-----
Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик Улыбка
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Программирование на PHP »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB