我有以下代码:
$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做同样的事情来检查它的标题,并希望完全看出错误。 (如果你愿意,你可以指出你自己的错误。)
答案 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
。