2010-10-08 7 views
19

Jestem za serwerem proxy, który nie pozwala na bezpośrednie połączenie z Internetem. Wszystkie moje aplikacje PHP nie łączą się z Internetem w celu sprawdzania aktualizacji i tak dalej.Jak ustawić PHP, aby używało ustawień proxy do łączenia się z Internetem?

Jak mogę określić ustawienia PHP Proxy?

Nie chcę wprowadzać ustawień proxy do kodu, chcę, aby sam PHP używał go poprzez globalne ustawienie config lub coś podobnego.

Odpowiedz

7

To zależy od tego, jak aplikacja PHP łączy się z Internetem.

Podjęcie najbardziej prawdopodobnej sytuacji przy użyciu PHP cUrl. W takim przypadku następujące opcje pomoże Ci:

curl_setopt($handle, CURLOPT_PROXY, $proxy_url); 
curl_setopt($handle, CURLOPT_PROXYUSERPWD, "[username]:[password]"); 

Zobacz także: http://www.php.net/manual/en/function.curl-setopt.php

+0

dzięki za odpowiedź. ale zastanówcie się, czy to może być zastosowane tylko dla moich własnych kodów. a co z innymi aplikacjami PHP, takimi jak Drupal? Potrzebuję samego PHP, aby połączyć się z Proxy, nie za pomocą kodu. – Alexar

1

używam gruszki moduł HTTP_Request2.

Oto uproszczona wersja funkcji mojego urlopen(): Kod

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(); 
4

Próbka:

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"); 
0

Dla Drupal można ustawić konfigurację serwera proxy w pliku settings.php.

$conf['proxy_server'] i tak dalej.

Więcej szczegółów here

11

jeśli prawie wszyscy z was potrzebuje dostępu do Internetu z serwera proxy, wolałbym zrobić w ten sposób.

//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']]); 

pełnomocnik będzie pracować dla obu file_get_contents i curl_exec

here is a official document.

+1

To zadziałało dla mnie świetnie. –

+1

To nie działa dla CURL –

+1

Przepraszam za mój błąd, api strumienia nie ma wpływu na curl, jeśli używasz curl, lepiej ustaw go za pomocą 'curl_setopt ($ handle, CURLOPT_PROXY, $ proxy_url);', a jeśli używasz obu, możesz dodać oba. –

0

Dla niektórych skryptach, wszystko co musisz zrobić, to ustawić zmienną środowiskową HTTP_PROXY. Tak było w przypadku skryptów composer.phar i media-wiki/maintenance/update.php.

Np .:

setenv HTTP_PROXY http://1.2.3.4:3934 

Jeśli proxy jest 1.2.3.4 nasłuchuje na porcie 3934. Pracował dla mnie.

0

Tak, to możliwe!

Można skonfigurować stream_context_set_default w pliku i dołączyć ten plik do wszystkich programów Php za pomocą właściwości php.ini: auto_prepend_file.

napisałem małą GIST about:

https://gist.github.com/ebuildy/381f116e9cd18216a69188ce0230708d

oraz artykuł w języku francuskim:

https://medium.com/@thomasdecaux/param%C3%A9trer-par-d%C3%A9faut-un-proxy-pour-php-file-get-content-3e9a32416979#.6zbg605cx

Ta technika jest "cool", ponieważ pozwala to na swój sys-admin skonfiguruj host, więc programista nie musi zmieniać niczego w kodzie.

0

Szukałem w internecie i nie mogłem znaleźć nic o stream_context_set_default() z chronione hasłem serwera proxy.

Wtedy pomyślałem, że hasło w podstawowej autoryzacji jest wysyłane w nagłówkach. Więc zmodyfikowałem nagłówki hasłem wyodrębnionym z żądania CURL i działało idealnie !!!

Oto jak to zrobić:

Pierwszy wysłać zapytanie do dowolnej domeny (example.com), jak poniżej:

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

Zobacz curl wysłane nagłówki i mam te linie proxy do późniejszego użycia:

> 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 

OK teraz nadszedł czas, aby zbudować nasz własny nagłówek:

$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)); 

I działa idealnie, otrzymasz adres IP swojego serwera proxy w odpowiedzi!