Php 文件\u获取\u代理背后的内容?

Php 文件\u获取\u代理背后的内容?,php,proxy,Php,Proxy,在工作中,我们必须使用代理基本上访问端口80。例如,我们为每个用户提供了自己的自定义登录 我的临时解决方法是使用curl通过代理以我自己的身份登录,并访问我需要的外部数据 我是否可以设置某种高级php设置,以便在内部,每当它试图调用类似file\u get\u contents()之类的内容时,总是通过代理?我使用的是Windows ATM,所以如果这是唯一的方法,重新编译会很痛苦 我的解决方案之所以是临时性的,是因为我需要一个通用的解决方案,该解决方案适用于多个用户,而不是使用一个用户的凭据(

在工作中,我们必须使用代理基本上访问端口80。例如,我们为每个用户提供了自己的自定义登录

我的临时解决方法是使用curl通过代理以我自己的身份登录,并访问我需要的外部数据

我是否可以设置某种高级php设置,以便在内部,每当它试图调用类似
file\u get\u contents()
之类的内容时,总是通过代理?我使用的是Windows ATM,所以如果这是唯一的方法,重新编译会很痛苦


我的解决方案之所以是临时性的,是因为我需要一个通用的解决方案,该解决方案适用于多个用户,而不是使用一个用户的凭据(我曾考虑单独请求一个用户帐户来完成这项工作,但密码经常更改,需要在十几个或更多的站点中部署该技术)。我不想硬编码凭据来使用curl解决方案。

这取决于代理登录的工作方式,可能会对您有所帮助

$context  = stream_context_set_default(
  array(
    'http'=>array(
      'header'=>'Authorization: Basic ' . base64_encode('username'.':'.'userpass')
    )
  )
);
$result = file_get_contents('http://..../...');
要通过/通过不需要身份验证的代理使用,应执行以下操作:

(我无法测试此代理:我的代理需要身份验证)

当然,用适合您的IP和端口替换我的代理;-)

如果您遇到这种错误:

Warning: file_get_contents(http://www.google.com) [function.file-get-contents]: failed to open stream: HTTP request failed! HTTP/1.0 407 Proxy Authentication Required
这意味着您的代理需要身份验证

如果代理需要身份验证,则必须添加几行,如下所示:

$auth = base64_encode('LOGIN:PASSWORD');

$aContext = array(
    'http' => array(
        'proxy'           => 'tcp://192.168.0.2:3128',
        'request_fulluri' => true,
        'header'          => "Proxy-Authorization: Basic $auth",
    ),
);
$cxContext = stream_context_create($aContext);

$sFile = file_get_contents("http://www.google.com", False, $cxContext);

echo $sFile;
关于IP和端口,这一次还有登录名和密码;-)检查所有有效的

现在,您将向代理传递一个头部,其中包含您的登录名和密码


而且。。。应显示该页面;-)

这里有一个类似的帖子:它解释了如何做

function file_get_contents_proxy($url,$proxy){

    // Create context stream
    $context_array = array('http'=>array('proxy'=>$proxy,'request_fulluri'=>true));
    $context = stream_context_create($context_array);

    // Use context stream with file_get_contents
    $data = file_get_contents($url,false,$context);

    // Return data via proxy
    return $data;

}

使用
stream\u context\u set\u default
函数。它更易于使用,因为您可以直接使用file_get_contents或类似函数,而无需传递任何附加参数

这说明了如何使用它。这是该页面的代码

<?php
// Edit the four values below
$PROXY_HOST = "proxy.example.com"; // Proxy server address
$PROXY_PORT = "1234";    // Proxy server port
$PROXY_USER = "LOGIN";    // Username
$PROXY_PASS = "PASSWORD";   // Password
// Username and Password are required only if your proxy server needs basic authentication

$auth = base64_encode("$PROXY_USER:$PROXY_PASS");
stream_context_set_default(
 array(
  'http' => array(
   'proxy' => "tcp://$PROXY_HOST:$PROXY_PORT",
   'request_fulluri' => true,
   'header' => "Proxy-Authorization: Basic $auth"
   // Remove the 'header' option if proxy authentication is not required
  )
 )
);

$url = "http://www.pirob.com/";

print_r( get_headers($url) );

echo file_get_contents($url);
?>


Martin,我有一个代理自动配置(pac)文件,而不是单一的代理服务器。它还需要NTLM身份验证。你能帮我一下吗?我遇到了以下错误:无法打开流:找不到套接字传输“http”-你在配置PHP时忘记启用它了吗?我正在使用PHP5.5/Apache2.4,并启用了curl。非常感谢。通常,cURL满足了我的要求,但我正在试验Appengine PHP,并且没有cURL laode,因此带有流上下文的文件\u get\u内容救了我:D@codeomnitrix,可能有点晚,但我也遇到了同样的问题,我将pac文件的url粘贴到浏览器中,在该文件中我可以找到代理IP地址。对于任何人来说:在我的情况下,使用
tcp
作为协议也是必要的。在我使用
http
之前,是什么给了我错误:无法打开流:找不到套接字传输“http”-您在配置PHP时忘记启用它了吗?
<?php
// Edit the four values below
$PROXY_HOST = "proxy.example.com"; // Proxy server address
$PROXY_PORT = "1234";    // Proxy server port
$PROXY_USER = "LOGIN";    // Username
$PROXY_PASS = "PASSWORD";   // Password
// Username and Password are required only if your proxy server needs basic authentication

$auth = base64_encode("$PROXY_USER:$PROXY_PASS");
stream_context_set_default(
 array(
  'http' => array(
   'proxy' => "tcp://$PROXY_HOST:$PROXY_PORT",
   'request_fulluri' => true,
   'header' => "Proxy-Authorization: Basic $auth"
   // Remove the 'header' option if proxy authentication is not required
  )
 )
);

$url = "http://www.pirob.com/";

print_r( get_headers($url) );

echo file_get_contents($url);
?>