Как заставить PHP использовать настройку прокси для подключения к Интернету?
Я за прокси-сервером, который не позволяет прямое подключение к Интернету. Все мои PHP-приложения не могут подключиться к Интернету для проверки обновлений и т.д.
Как я могу указать PHP мои настройки прокси-сервера?
Я не хочу вводить прокси-настройки в код, я хочу, чтобы сам PHP использовал его через глобальную конфигурацию или что-то подобное.
Ответы
Ответ 1
если почти всем вам доступ в Интернет нужен прокси-сервер, я бы предпочел сделать это.
//add this as the first line of the entry file may it is the index.php or config.php
stream_context_set_default(['http'=>['proxy'=>'proxy-host:proxy-port']]);
прокси-сервер будет работать как для file_get_contents, так и для curl_exec
вот официальный документ.
Ответ 2
Это зависит от того, как ваше приложение PHP подключается к Интернету.
Если вы используете наиболее вероятную ситуацию, используя PHP cUrl. В этом случае вам помогут следующие варианты:
curl_setopt($handle, CURLOPT_PROXY, $proxy_url);
curl_setopt($handle, CURLOPT_PROXYUSERPWD, "[username]:[password]");
Смотрите также: http://www.php.net/manual/en/function.curl-setopt.php
Ответ 3
Пример кода:
function getUrl($url)
{
$ch = curl_init();
$timeout = 5; // set to zero for no timeout
curl_setopt ($ch, CURLOPT_CONNECTTIMEOUT, $timeout);
curl_setopt ($ch, CURLOPT_URL, $url);
curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_PROXY, "http://proxy.example.com"); //your proxy url
curl_setopt($ch, CURLOPT_PROXYPORT, "8080"); // your proxy port number
curl_setopt($ch, CURLOPT_PROXYUSERPWD, "username:pass"); //username:pass
$file_contents = curl_exec($ch);
curl_close($ch);
return $file_contents;
}
echo getUrl("http://www.google.com");
Ответ 4
Я использую модуль PEAR HTTP_Request2.
Вот упрощенная версия моей функции UrlOpen():
function UrlOpen($url)
{
$request = new HTTP_Request2($url);
$request->setConfig(array(
'proxy_host' => '192.168.1.6',
'proxy_port' => 8080,
'proxy_user' => 'MYUSER',
'proxy_password' => 'MYPASS',
'ssl_verify_peer' => False,
'connect_timeout' => 3,
);
return $request;
}
$req = UrlOpen($url);
$res = $req->send();
if ($res->getStatus() == '200')
$data = $request->getBody();
Ответ 5
Для Drupal вы можете настроить прокси-конфигурацию в файле settings.php.
$conf['proxy_server']
и т.д.
Подробнее здесь
Ответ 6
Для некоторых сценариев все, что вам нужно сделать, это установить переменную окружения HTTP_PROXY
. Это имело место и для сценариев composer.phar
, и для медиа-вики/update.php
.
например:.
setenv HTTP_PROXY http://1.2.3.4:3934
Если ваш прокси находится в 1.2.3.4, прослушивая порт 3934. Работал для меня.
Ответ 7
Да, возможно!
Вы можете настроить stream_context_set_default
в файле и включить этот файл во все ваши Php-программы, используя свойство auto_prepend_file
php.ini.
Я написал небольшую информацию о:
https://gist.github.com/ebuildy/381f116e9cd18216a69188ce0230708d
И статья на французском языке:
https://medium.com/@thomasdecaux/param%C3%A9trer-par-d%C3%A9faut-un-proxy-pour-php-file-get-content-3e9a32416979#.6zbg605cx
Этот метод "крут", потому что это позволяет вашему sys-admin настраивать хост, поэтому разработчику ничего не нужно менять в коде.
Ответ 8
Я искал через Интернет и не мог найти ничего о stream_context_set_default() с прокси-сервером с защитой паролем.
Затем я подумал, что пароль в базовой авторизации отправляется в заголовках.
Поэтому я изменил заголовки паролем, извлеченным из запроса CURL, и он отлично работал.
Вот как вы это делаете:
Сначала отправьте этот запрос в любой домен (example.com), как показано ниже:
curl -v -U user:pass -x your_proxy_ip:port --url https://example.com
См. заголовки, отправленные с помощью курсора, и я использовал эти прокси-строки:
> Trying XXX.XXX.XXX.XXX...
> Connected to XXX.XXX.XXX.XXX (XXX.XXX.XXX.XXX) port YYYY (#0)
> Establish HTTP proxy tunnel to example.com:443
> Proxy auth using Basic with user 'your_username_here'
> CONNECT example.com:443 HTTP/1.1
> Host: example.com:443
> Proxy-Authorization: Basic YW1hem9uOnXXXXXXXXXXXXXXX25SMg
> User-Agent: curl/7.47.0
> Proxy-Connection: Keep-Alive
>
< HTTP/1.1 200 Connection established
<
< Proxy replied OK to CONNECT request
Теперь пришло время создать наш пользовательский заголовок:
$default_opts = array(
'http'=>array(
'method'=>"GET",
'header'=>"Proxy-Authorization: Basic YW1hem9uOnXXXXXXXXXXXXXXX25SMg\r\n" .
"Proxy-Connection: Keep-Alive",
'proxy'=>"XXX.XXX.XXX.XXX:YYYY"
)
);
$default = stream_context_set_default($default_opts);
$result = file_get_contents("https://ipleak.net/json/");
print_r(json_decode($result));
И он отлично работает, вы получаете IP-адрес своего прокси-сервера в ответ!