Подтвердить что ты не робот

Как заставить PHP использовать настройку прокси для подключения к Интернету?

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

Как я могу указать PHP мои настройки прокси-сервера?

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

4b9b3361

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