@fulltext

PHP 5.4.45 Почему curl_multi не работает через прокси SOCKS5?

Здравствуйте,
Debian 6 (squeeze)
PHP 5.4.45
libcurl 7.21.0

Как заставить curl_multi работать через прокси SOCKS5?

Вот обычный curl: (он работает - возвращает заголовок)
$url = "https://yandex.ru";
	$ch = curl_init();	
    curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($ch, CURLOPT_HEADER, 1); // читать заголовок
    curl_setopt($ch, CURLOPT_NOBODY, 1); // читать ТОЛЬКО заголовок без тела
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);

curl_setopt($ch, CURLOPT_PROXY, "164.132.72.41:1080"); 	
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);

$return = curl_exec($ch); 
curl_close($ch);

 
echo "<pre>";
print_r($return);
echo "</pre>";


А вот тот же код но в мультикурле:
$urls = array(
    'https://yandex.ru',
    'https://google.ru',
);
 
$multi = curl_multi_init();
$channels = array();
 
foreach ($urls as $url) {
    
	
	$ch = curl_init();	
    curl_setopt($ch, CURLOPT_URL, $url);
	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, FALSE); 
    curl_setopt($ch, CURLOPT_HEADER, 1); // читать заголовок
    curl_setopt($ch, CURLOPT_NOBODY, 1); // читать ТОЛЬКО заголовок без тела
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
	curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
	


curl_setopt($ch, CURLOPT_PROXY, "164.132.72.41:1080"); 
curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);

    curl_multi_add_handle($multi, $ch);
 
    $channels[$url] = $ch;
}
 
$active = null;
do {
    $mrc = curl_multi_exec($multi, $active);
} while ($mrc == CURLM_CALL_MULTI_PERFORM);
 
while ($active && $mrc == CURLM_OK) {
    if (curl_multi_select($multi) == -1) {
        continue;
    }
 
    do {
        $mrc = curl_multi_exec($multi, $active);
    } while ($mrc == CURLM_CALL_MULTI_PERFORM);
}
 
foreach ($channels as $channel) {
	$info = curl_getinfo($channel); 
    echo curl_multi_getcontent($channel);
    curl_multi_remove_handle($multi, $channel);
}
curl_multi_close($multi);

echo "<pre>";
print_r($info);
echo "</pre>";


Если использовать HTTP прокси, то все работает.
Мне нужно SOCKS5 с авторизацией.

Предполагаю что дело в libcurl 7.21.0, т.к., на локальном ПК Win7 Xampp это работает, но там libcurl 7.32.0.
Тогда как обновить libcurl ?

Большое уже спасибо.
  • Вопрос задан
  • 458 просмотров
Решения вопроса 1
@fulltext Автор вопроса
Кажется вопрос решился :)
Отвечу сам себе, может кому будет полезно, или смешно )

Как я и предполагал, дело было в libcurl 7.21.0
Чтобы её обновить сделал следующее:

Cам curl я обновлял ранее до версии 7.53.1, думал эти действия приведут к обновлению и библиотеки в php. Говорю об этом, потому что, возможно без неё что-то не получится.
1. В \etc\apt\sources.list добавим deb ftp.de.debian.org/debian jessie main
2. aptitude update
3. aptitude install libcurl3
В процессе установки/обновления будут удаления/обновления некоторых пакетов. Два раза соглашаемся буквой "Y". При выводе текста с обновлениями версий жмем "q". Ждем.
4. service apache2 restart

Поправьте пожалуйста, кто знает, может что-то сделал не так. Но кажется всё работает.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы