Как заставить PHP использовать настройки прокси для подключения к интернету? - PullRequest
23 голосов
/ 08 октября 2010

Я за прокси-сервером, который не разрешает прямое подключение к интернету.Все мои PHP-приложения не могут подключиться к Интернету для проверки обновлений и т. Д.

Как мне сообщить PHP мои настройки прокси?

Я не хочу вводить настройки прокси в кодЯ хочу, чтобы сам PHP использовал его через глобальные настройки конфигурации или что-то подобное.

Ответы [ 8 ]

14 голосов
/ 16 сентября 2014

если почти всем вам для доступа в интернет нужен прокси, я бы предпочел сделать так.

//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

вот официальный документ.

8 голосов
/ 23 марта 2011

Это зависит от того, как ваше 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

6 голосов
/ 13 июля 2012

Пример кода:

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");
1 голос
/ 23 ноября 2016

Да, это возможно!

Вы можете настроить stream_context_set_default в файле и включить этот файл во все свои программы Php, используя свойство auto_prepend_file php.ini.

Iнаписал небольшую суть о:

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

Эта техника "крутая", потому что,это позволяет вашему системному администратору настраивать хост, поэтому разработчику не нужно ничего менять в коде.

1 голос
/ 24 марта 2011

Я использую модуль 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();
0 голосов
/ 31 августа 2017

Я искал в Интернете и не смог найти ничего о stream_context_set_default () с защищенным паролем прокси-сервером.

Тогда я подумал, что пароль при базовой авторизации отправляется в заголовках. Поэтому я изменил заголовки с паролем, извлеченным из запроса CURL, и он работал отлично !!!

Вот как вы это делаете:

Сначала отправьте этот запрос на любой домен (example.com), как показано ниже:

curl -v -U user:pass -x your_proxy_ip:port --url https://example.com

Посмотрите заголовки, отправленные curl, и я получил эти строки прокси для использования позже:

>   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 своего прокси-сервера в ответ!

0 голосов
/ 30 июля 2015

Для некоторых сценариев все, что вам нужно сделать, это установить переменную окружения HTTP_PROXY.Это имело место как для сценариев обслуживания composer.phar, так и для media-wiki / update.php.

Например:

setenv HTTP_PROXY http://1.2.3.4:3934

Если ваш прокси находится на 1.2.3.4 и прослушивает порт 3934.Работал на меня.

0 голосов
/ 19 июня 2013

Для Drupal вы можете установить конфигурацию прокси в вашем файле settings.php.

$conf['proxy_server'] и т. Д.

Подробнее здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...