在一个代理的file_get_contents?(file_get_contents behind

2019-06-21 03:34发布

在工作中,我们必须使用一个代理来访问基本的80端口为例,我们有我们为每一个用户自定义登录。

我的临时解决方法是使用curl通过代理基本上登录为自己和访问我所需要的外部数据。

是否有某种高级PHP设置我能设置使得内部时,它试图调用类似file_get_contents()它总是通过代理? 我在Windows ATM所以它会是一个痛苦的重新编译如果这是唯一的办法。

究其原因我的解决方法是暂时的,因为我需要一个解决方案是通用的,适用于多用户,而不是使用一个用户的凭据(IVE考虑请求单独的用户帐户只是为了做到这一点,但口令经常改变这种技术需要在整个被部署十几个或更多网站)。 我不想硬编码的凭据基本上使用curl解决办法。

Answer 1:

要通过不需要身份验证的代理使用file_get_content过/,这样的事情应该做的:

(我不能对此进行测试之一:我的代理服务器需要身份验证)

$aContext = array(
    'http' => array(
        'proxy' => 'tcp://192.168.0.2:3128',
        'request_fulluri' => true,
    ),
);
$cxContext = stream_context_create($aContext);

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

echo $sFile;

当然,通过那些对你OK我更换代理服务器的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和端口,并且,这个时候,还登录名和密码相同的事情;-)

现在,你是传递一个代理授权标头的代理,包括您的登录名和密码。

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



Answer 2:

使用stream_context_set_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);
?>


Answer 3:

根据代理登录如何工作stream_context_set_default可以帮助你。

$context  = stream_context_set_default(
  array(
    'http'=>array(
      'header'=>'Authorization: Basic ' . base64_encode('username'.':'.'userpass')
    )
  )
);
$result = file_get_contents('http://..../...');


Answer 4:

这里有一个类似的帖子: http://techpad.co.uk/content.php?sid=137这也解释了如何做到这一点。

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;

}


文章来源: file_get_contents behind a proxy?
标签: php proxy