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
Покинул форум
Сообщений всего: 18
Дата рег-ции: Май 2010
Помог: 0 раз(а)
Подскажите пожалуйста как при использование multi CURL (многопоточный CURL), проверить произошла ли ошибка при загрузке?
при использование обычного CURL делал следующее:
echo'Страница '.$header['url'].' не была загружена из-за ошибки http_code: '.$header['http_code'].' err:'.$err.', errmsg: '.$errmsg;
return'ERROR: Страница '.$header['url'].' не была загружена из-за ошибки http_code: '.$header['http_code'].' err:'.$err.', errmsg: '.$errmsg;
}
else
{
return$content;
}
но при проверке на ошибку(curl_error) при использование multi CURL, всегда возвращается результат 0. Строка 85. Ниже приведён листин функции используемой для загрузке данных:
Покинул форум
Сообщений всего: 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/
tisar
Отправлено: 21 Мая, 2010 - 21:24:03
Новичок
Покинул форум
Сообщений всего: 18
Дата рег-ции: Май 2010
Помог: 0 раз(а)
У меня почему то функция curl-multi-info-read и curl_multi_exec выдаёт странные данные:
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
Покинул форум
Сообщений всего: 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/
tisar
Отправлено: 23 Мая, 2010 - 06:33:55
Новичок
Покинул форум
Сообщений всего: 18
Дата рег-ции: Май 2010
Помог: 0 раз(а)
А где можно найти описание констант из ячеек массива msg и result (удалось смоделировать 3 разных ответа 0, 6 и 7, но что они означают)?
valenok
Отправлено: 23 Мая, 2010 - 09:44:05
Здесь могла бы быть ваша реклама
Покинул форум
Сообщений всего: 4574
Дата рег-ции: Июль 2006 Откуда: Israel
Покинул форум
Сообщений всего: 8715
Дата рег-ции: Июнь 2009
Помог: 17 раз(а)
tisar пишет:
А где можно найти описание констант из ячеек массива msg и result (удалось смоделировать 3 разных ответа 0, 6 и 7, но что они означают)?
Именно для этого в модули и встраивают соответствующий набор ENUM-констант - делайте проверку получаемого результата на идентичность с определенной константой и получайте исходное состояние - то есть например if(msg===CURLMSG_DONE) то значит что передача успешно произошла и тд
----- Сделать можно все что угодно - нужно только старание, терпение и хороший поисковик
Безлимитный web-хостинг от 15 рублей за 40 МБ дискового пространства - http://ihost[dot]oks71[dot]ru/
tisar
Отправлено: 26 Мая, 2010 - 14:46:48
Новичок
Покинул форум
Сообщений всего: 18
Дата рег-ции: Май 2010
Помог: 0 раз(а)
Всем спасибо за ответы, очень помогли.
Переписав свой код заставил всётаки работать curl_exec, curl_error и curl_getinfo.
P.S.: зачем столько заморочек с этими константами, не проще ли было сделать получение ошибок как в обычном курле?
JustUserR
Отправлено: 27 Мая, 2010 - 14:10:21
Активный участник
Покинул форум
Сообщений всего: 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/
Все гости форума могут просматривать этот раздел. Только зарегистрированные пользователи могут создавать новые темы в этом разделе. Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.