PHP如何读取HTTP Raw Post数据

时间:2015-01-21 23:45:43

标签: php raw-post

远程服务器定期通过HTTP HEAD查询我的php页面(只检查KeepAlive,这有效)。如果远程服务器注册了一个触发器,请向我发送带有数据的xml格式(采用后期原始格式)。我无法找到错误或信息的位置如何读取输入数据。

我试试这个(没有错误显示),但结果是空的。

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)

谢谢你,最诚挚的问候,  彼得

1 个答案:

答案 0 :(得分:4)

得到它并提供更复杂的解决方案。

结果(工作代码):

<?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)上运行代码,则无效
  • 如果我在LAMP(Ubuntu 14.04 LTS)上运行代码并使用Pcap安装WireShark,服务器崩溃 - 我必须重新安装Apache2
  • 如果我在WAMP上运行代码(使用XAMPP的MS Windows Server 2008R2 x64),alll是对的

祝你好运,  彼得