远程服务器定期通过HTTP HEAD查询我的PHP页面(仅检查KeepAlive - 这有效)。如果远程服务器注册了一个触发器,则向我发送带有数据的 XML 格式(采用 POST 原始格式)。我找不到错误在哪里或有关如何读取输入数据的信息。
我尝试了这个(没有错误显示),但结果是空的。
ini_set('always_populate_raw_post_data', 'On');
$data1 = file_get_contents('php://input');
//var_dump($data1); //NULL
fwrite($fp, 'php://input: ' . serialize($data1) . "n");
$data2 = $GLOBALS['HTTP_RAW_POST_DATA'];
//var_dump($data2); //NULL
fwrite($fp, 'GLOBALS HTTP_RAW_POST_DATA: ' . serialize($data2) . "n");
$data3 = $HTTP_RAW_POST_DATA;
//var_dump($data3); //NULL
fwrite($fp, 'HTTP_RAW_POST_DATA: ' . serialize($data3) . "n");
//print_r($_POST); //NULL
fwrite($fp, 'POST: ' . serialize($_POST) . "n");
$dataPOST = trim(file_get_contents('php://input'));
$xmlData = simplexml_load_string($dataPOST);
fwrite($fp, 'BETA: ' . $xmlData . "n");
日志文件中的结果:
HeadRequest at 2015-01-21 23:35:47
======================================================
php://input: s:0:"";
GLOBALS HTTP_RAW_POST_DATA: N;
HTTP_RAW_POST_DATA: N;
POST: a:0:{}
BETA:
关于服务器:PHP版本为5.5.9,服务器运行在Linux上(Apache/2.4.7(Ubuntu)
我明白了并给出了更复杂的解决方案。
结果(工作代码):
<?php
// Validate read-only stream for read raw data from the request body
if(file_get_contents('php://input')=='')
{
// Throw exception
}
else
{
// Get read-only stream for read raw data from the request body
$strRequest = file_get_contents('php://input');
// Import request to XML structure
$DOMDocumentRequest = new DOMDocument;
$DOMDocumentRequest->loadXML($strRequest);
}
?>
关于问题:
- 如果我在 LAMP(Ubuntu 14.04 LTS(Trusty Tahr))上运行代码,它不起作用
- 如果我在 LAMP(Ubuntu 14.04 LTS)上运行代码并使用 Pcap 安装 Wireshark,服务器崩溃了 - 我必须重新安装 Apache 2
- 如果我在WAMP(Windows Server 2008 R2 x64 with XAMPP)上运行代码,一切都正确