如何让PHP使用代理设置连接到互联网?

时间:2010-10-08 16:48:55

标签: php proxy

我支持不允许直接连接到互联网的代理服务器。我的所有PHP应用程序都无法连接到Internet进行更新检查等。

如何告诉PHP我的代理设置?

我不想在代码中输入代理设置,我希望PHP本身通过全局配置设置或类似的方式使用它。

8 个答案:

答案 0 :(得分:14)

如果几乎​​所有的互联网访问都需要代理,我更喜欢这样做。

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

here is a official document.

答案 1 :(得分:8)

这取决于您的PHP应用程序如何连接到Internet。

如果使用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

答案 2 :(得分:6)

示例代码:

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

答案 3 :(得分:1)

我使用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();

答案 4 :(得分:1)

是的,这是可能的!

您可以在文件中配置stream_context_set_default,并使用auto_prepend_file php.ini属性在所有Php程序中包含此文件。

我写了一个小小的要点:

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配置主机,因此开发人员不必更改代码中的任何内容。

答案 5 :(得分:0)

对于Drupal,您可以在settings.php文件中设置代理配置。

$conf['proxy_server']等等。

更多详情here

答案 6 :(得分:0)

对于某些脚本,您只需设置环境变量HTTP_PROXY即可。 composer.phar和media-wiki的维护/ update.php脚本都属于这种情况。

E.g:

setenv HTTP_PROXY http://1.2.3.4:3934

如果您的代理是在1.2.3.4上侦听端口3934.为我工作。

答案 7 :(得分:0)

我通过互联网搜索了一下 密码保护 代理服务器无法找到关于 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作为回应!