file_get_contents + stream_context_create在1台服务器上运行,在另一台

时间:2016-05-26 01:09:56

标签: php file-get-contents

我们有2台服务器,dev和live。他们都使用LAMP(Debian),但开发服务器是常规http,实时服务器是https。此代码在我们的开发服务器上完美运行:

$all_data = array(...);
$eol = "\r\n";

$headers = array(
    'Content-Type: application/json',
    'Content-Length: ' . strlen(json_encode($all_data)),
    'connection: close'
);
$headers = implode($eol, $headers);

$opts = array(
    'http'=>array(
        'method' => 'POST',
        'header' => $headers,
        'content' => json_encode($all_data)
    )
);
$context = stream_context_create($opts);


$update_data = file_get_contents($_SERVER['REQUEST_SCHEME'] . '://' . $_SERVER['HTTP_HOST'] . $system_file, null, $context);

在实时服务器上,file_get_contents会出现此错误:

Warning: file_get_contents(https://...): failed to open stream: Connection timed out in ....php on line 1086

我已经查看了apache日志,了解导致它在实时服务器上失败的原因,但我只看到上面的错误。它没有说出阻止通话的内容。我在实时服务器上将allow_url_include和allow_url_fopen设置为On。

我不知道它是Apache配置或SSL配置中的某些东西,还是其他什么东西,而且我不知道在哪里看。我今天花了几个小时来研究这个问题,并尝试在头部数组(User-Agent,Accept-Language,Accept-Encoding,Cookie等)中添加不同的标题,但没有任何效果。我基本上试图复制dev上的内容,但是生活并不喜欢它。

我还验证了如果我直接在浏览器中复制并粘贴正在创建的URL,那么我知道文件名是正确的。

 dev server:
 php: 5.6.14-0+deb8u1
 apache: Apache/2.4.10
 debian: 8.2

 live server:
 php: 5.5.12
 apache: Apache/2.4.10
 debian: 7.9

1 个答案:

答案 0 :(得分:0)

请您使用代理并尝试



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