如何标题stream_context_create?

时间:2015-12-03 18:07:38

标签: php http curl

我有以下代码:

$options = array(
    'http' => array(
        'header' => "Content-type: text/html\r\n",
        'method' => 'POST'
    ),
);

$context = stream_context_create($options);
$response = file_get_contents($url, false, $context);

这没有给出适当的结果(根本没有结果),因为等效的卷曲是:

function curl($url) {
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, true);
    curl_setopt($ch, CURLOPT_POST, 1);
    $data = curl_exec($ch);
    curl_close($ch);

    $httpcode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
    echo $httpcode;

    return $data;
}

curl($url);

实际上给出了实际结果。

由于我想避免生产服务器中的卷曲,我真的希望file_get_contents能够正常工作。为了调试这个,我决定检查curl和file_get_contents的标题。在上面的卷曲代码中,您可以注意到echo,它打印标题:

  

HTTP / 1.0 411长度必需内容类型:text / html;字符集= UTF-8   内容长度:1564日期:星期四,03十二月2015 18:00:25 GMT服务器:   GFE / 2.0

我想对file_get_contents做同样的事情来检查它的标题,并希望完全看出错误。 (如果你愿意,你可以指出你自己的错误。)

1 个答案:

答案 0 :(得分:0)

这样的事情应该有效:

<?php

$url = 'http://example.com/';
$data = ''; // empty post

$options = array(
    'http' => array(
    'header' => "Content-type: text/html\r\nContent-Length: " . strlen($data) . "\r\n",
    'method' => 'POST'
    ),
);

$context = stream_context_create($options);
$fp      = fopen($url, 'r', false, $context);
$meta    = stream_get_meta_data($fp);

if (!$fp) {
    echo "Failed!";
} else {
    echo "Success";
    $response = stream_get_contents($fp);
}

fclose($fp);
var_dump($meta);

要获取流元数据,您需要从file_get_contents切换到fopen。它没有任何区别,因为PHP会以相同的方式连接并发出响应(使用http://包装器)。

如果将php.ini设置为禁用allow_url_fopen,则file_get_contents和fopen都会受到影响,并且无法打开远程URL。只要不是这种情况,URL的fopen将以与file_get_contents相同的方式工作;使用fopen只允许您访问流,然后可以调用stream_get_meta_data