2016-08-02 58 views
1

考虑这个功能:如何获取标题与流?

function use_fopen($url, $make_post_field, $headers = '') { 

    $context = array(
         'http' => array(
         'method' => 'POST', 
         'timeout' => '60', 
         'content' => $make_post_field) 
    ); 
    $header = "Content-type: application/x-www-form-urlencoded\r\n"; 
    if (!empty($headers)) { 
     foreach ($headers as $head) { 
       $header.="$head\r\n"; 
     } 
    } 

    $context['http']['header'] = $header; 
    $context = stream_context_create($context); 

    //$contents = @file_get_contents($url, null, $context); 
    $fp = fopen($url, 'r', false, $context); 

    $stream_meta_data = @stream_get_meta_data($fp); 
    print_r($stream_meta_data); 
    fclose($fp); 
} 

我使用的功能是这样的:

$headers = array ('baz: bar'); 
$data = array ('foo' => 'bar', 'bar' => 'baz'); 
$data = http_build_query($data); 
print(use_fopen("http://www.example.com/phpinfo.php", $data, $headers)); 

由于目标URL是的phpinfo,我可以验证$_POST['foo']被设置为禁止和

CONTENT_TYPE = application/x-www-form-urlencoded

HTTP_FOO = baz

如此看来情况下工作正常,但是当我使用

$stream_meta_data = @stream_get_meta_data($fp); 
print_r($stream_meta_data); 

我得到

Array 
(
[timed_out] => 
[blocked] => 1 
[eof] => 
[wrapper_data] => Array 
    (
     [0] => HTTP/1.1 200 OK 
     [1] => Date: Tue, 02 Aug 2016 11:46:36 GMT 
     [2] => Server: Apache 
     [3] => Connection: close 
     [4] => Content-Type: text/html; charset=UTF-8 
    ) 

[wrapper_type] => http 
[stream_type] => tcp_socket/ssl 
[mode] => r 
[unread_bytes] => 8061 
[seekable] => 
[uri] => http://wwwexample.com/phpinfo.php 
) 

为什么内容类型是错误的,HTTP_FOO,实际上是一个头被这里没有显示?下面的改变也没有帮助。我该怎么办?获取自定义标题和正确的内容类型?

$contents = @file_get_contents($url, null, $context); 
print_r(get_headers($url)); 

我搜索SO,发现这个How to get HTTP response headers after POST request in PHP?但正如我说,我都尝试stream_get_meta_data($fp)get_headers($url),但我没有得到我的自定义页眉。我还应该做什么?

回答

1

找到你的线程从谷歌,因为我有你一样的问题。我用函数stream_context_set_default解决了它。以为我会把它发布到下一个从谷歌陷入困境,或者如果你仍然需要一个解决方案。