file_get_contents无法打开流:同一服务器上的文件的连接超时错误

时间:2016-12-12 21:04:24

标签: php timeout file-get-contents

我正在尝试在我的服务器上发送一个文件发送帖子数据,好像从一个表单(“calling_file.php”)发送到同一服务器上的另一个文件(“processing_file.php”)。这是代码:

$url = 'https://www.example.com/path/to/processing_file.php';
$method = 'POST';

$eol = "\r\n";

// Create a stream
$opts = array(
    'http' => array(
        'timeout' => 30,
        'method' => $method,
        'header' => 'Content-Type: application/x-www-form-urlencoded' . $eol,
        'content' => http_build_query($xmit)
    )
);

$context = stream_context_create($opts);

// Open the file using the HTTP headers set above
$result = file_get_contents($url, false, $context); //filename, use_include_path, context

//echo($result);
$result_decode = json_decode($result,true);

$ xmit看起来像这样:

array(
    'dx' => json_encode('[{"business_date":"2015-09-29","check_avg":10.749122993789,"guests":"422"},{"business_date":"2015-09-30","check_avg":36.735215894737,"guests":"461"},{"business_date":"2015-10-01","check_avg":12.2527145,"guests":"288"},{"business_date":"2015-10-02","check_avg":18.405998957055,"guests":"263"},{"business_date":"2015-10-03","check_avg":20.385927936508,"guests":"289"}]'),
    'period' => 5,
    'phase_code' => 3,
    'site_id' => 155
)

当我回应$ opts时,一切看起来都正确。 http_build_query($ xmit)正在创建看起来有效的帖子数据。我在processing_file.php和calling_file.php中设置了这个:

ini_set('allow_url_include', '1');
ini_set('allow_url_fopen', '1');

粘贴时:     http://www.example.com/path/to/processing_file.php

直接在我的浏览器中,文件以200状态打开,一切都很好。

我尝试将processing_file的所有者设置为apache用户,并将chmod设置为775。

但是,当calling_file.php试图用上面的代码调用processing_file.php时,我得到了这个:

Warning: file_get_contents(https://www.example.com/path/to/processing_file.php): failed to open stream: Connection timed out in /var/www/example.com/functions/path/to/other/file/calling_file.php on line 219 

第219行是:

$result = file_get_contents($url, false, $context); //filename, use_include_path, context

我无法弄清楚为什么它看不到文件。

1 个答案:

答案 0 :(得分:1)

我在周末遇到了这个问题,发现它在ArchLinux和新安装的Fedora 25上影响了我。

对于更多上下文,我发现在<{1}}上进行任何网络调用超时,在使用cURL进行等效网络调用时正在进行。此外,file_get_contents()遇到了同样的问题。

ping内部使用的一些低级系统范围的实用程序是通过执行IPv6查找并随后超时来解析DNS。奇怪的是,我所有的其他应用程序(cURL,Web浏览器等)都在使用IPv4并正常工作。

我通过禁用IPv6系统来解决此问题。

为了文档起见,这些是我的file_get_contents()来证明这个问题:

Ping,使用默认调用:

ping

Ping,使用IPv4标志:

[hpierce@localhost ~]$ ping www.google.com
PING www.google.com(ord38s04-in-x04.1e100.net (2607:f8b0:4009:813::2004)) 56 data bytes
^C
--- www.google.com ping statistics ---
147 packets transmitted, 0 received, 100% packet loss, time 149492ms