Сайт Joomla на сервере LAMP за прокси-сервером не может получить доступ к потоку ресурсов HTTP

Установка: 1. Сайт Joomla 1.5 на сервере LAMP (CentOS 5.2/Apache 2.2/PHP 5.2.9/mysql 5) 2. Добавлен модуль Joomla для конвертации валюты. Модуль использует Google Finance для конвертации валюты. 3. Стек LAMP находится во внутренней сети за прокси-сервером. Переменные среды сервера для http_proxy, прокси-сервера yum.conf настроены, ядро ​​успешно обновлено. 4. phpinfo() ясно показывает, что curl установлен 5. модуль, упомянутый в «2.» позволяет 3 метода подключения к финансам Google: fread(), file_get_contents() и использование библиотек cURL. Поскольку ящик находится за прокси, должен работать только метод cURL-библиотек.

Проблема: в стеке WAMP метод библиотеки curl работает нормально. Однако в стеке ламп модуль не может связаться с Google Finance и выдает ошибку с указанием времени ожидания подключения. Вот код, чтобы было понятнее.

if (isset($_GET['process'])) {        
$url = "http://finance.google.com/finance/converter?a={
$_GET['a']}&from={$_GET['from']}&to={$_GET['to']}";
$app->get_page($url);
$data = $app->process();
}  

function get_page($url) {
if ($url!='') {
echo $url;
$ch = curl_init ();
                    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
                    curl_setopt($ch, CURLOPT_URL, $url);
                    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
                    curl_setopt($ch, CURLOPT_BINARYTRANSFER, $this->binary);
                    $this->html = curl_exec($ch);
                    curl_close($ch);
            }
    }

Я даже пытался добавить curl_setopt($ch, CURLOPT_PROXY,'10.x.xx.xx:8080'); после curl_init() безрезультатно. Я скомпилировал apache с включенными libcurl и php, и мне нужно знать следующее: 1. Как указать php направлять исходящие запросы (потоки) через прокси? 2. Нужно ли настраивать cURL (libcurl) с именем прокси и портом? 3. Я отключил iptables, поэтому брандмауэр linux больше не фигурирует. Что еще нужно сделать, чтобы разрешить исходящие запросы? 4. Я настроил прокси так, чтобы мой стек LAMP был разблокирован для всего контента, cURL работает из командной строки, но не из php/apache. Что мне не хватает? Любые переменные среды? Какие-нибудь переключатели?

Спасибо заранее за ваше время.

Шринивас


person Shrinivas    schedule 25.09.2009    source источник
comment
если вы запрашиваете какую-либо другую страницу, скажем, yahoo.com из php, действует ли это так же?   -  person Sabeen Malik    schedule 26.09.2009
comment
curl из командной строки работает для любого сайта (нет блокировки на прокси), но curl через php/apache не работает, curl сообщает об ошибке "Не удалось подключиться к прокси" errno7 и не возвращает запрос. Netstat o/p показывает статус SYN_SENT для исходящего tcp-запроса из моего стека LAMP на внешний сервер (yahoo/google/etc).   -  person Shrinivas    schedule 26.09.2009
comment
Я решил проблему с cURL, просто поместив конвертер валют Google Finance в iframe на своей веб-странице. Это не позволяет мне стилизовать конвертер с помощью любого CSS, но, по крайней мере, это работает.   -  person Shrinivas    schedule 20.10.2009


Ответы (1)


Вот пример использования локального прокси-сервера SOCKS5 на порту 1090:

<?php
$url = 'www.whatismyip.com/automation/<your unique whatismyip hash>';

function get_page($url, $proxy=true) {
    if ($url!='') {
        $ch = curl_init ();
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        curl_setopt($ch, CURLOPT_URL, $url);
        curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
        if ($proxy) {
            curl_setopt($ch, CURLOPT_PROXY, 'localhost');
            curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_SOCKS5);
            curl_setopt($ch, CURLOPT_PROXYPORT, 1090);
        }
        $html = curl_exec($ch);
        curl_close($ch);
        return $html;
    }
}


var_dump(get_page($url));
var_dump(get_page($url, false));

Вместо этого вы, вероятно, захотите использовать curl_setopt($ch, CURLOPT_PROXYTYPE, CURLPROXY_HTTP); и curl_setopt($ch, CURLOPT_PROXYPORT, 8080);.

person TML    schedule 25.09.2009
comment
Я попробовал этот php-скрипт теста curl, добавил if(curl_exec($ch) === false){ echo 'Ошибка Curl: ' . curl_error($ch);} Запустите скрипт через браузер и получите сообщение «Не удалось подключиться к 10.x.xx.x: разрешение отклонено», указывающее, что curl не удалось связаться с моим прокси-сервером, в netstat отображается статус SYN_SENT. /p для исходящих TCP-запросов. Я не знаю, что мне нужно сделать, чтобы получить curl и прокси для сопряжения, нужны ли мне curlwrappers? - person Shrinivas; 26.09.2009
comment
Пробовали ли вы использовать 10.x.xx.x:8080 в качестве прокси-сервера для вашего веб-браузера, чтобы убедиться, что он работает? - person TML; 27.09.2009
comment
ну, так как это установка LAMP box с CentOS, без графического интерфейса, мне нужны были только yum и wget для загрузки обновлений и установки apache, php и mysql. Я установил переменную среды «http_proxy», которая помогает wget проходить через прокси, и обновил yum.conf с IP-адресом и портом прокси, и он тоже работает нормально. Curl из командной строки правильно подбирает прокси и может получить google.com, но curl используется в php-скрипт, размещенный на apache, не может этого сделать. Phpinfo() показывает, что модуль Curl загружен. - person Shrinivas; 28.09.2009