php - 如何在 PHP 中读取 HTTP 原始 POST 数据

标签 php raw-post

远程服务器通过 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) 上运行代码并安装 Wireshark使用 Pcap,服务器崩溃了——我必须重新安装 Apache 2
  • 如果我在 WAMP 上运行代码( Windows Server 2008 R2 x64 和 XAMPP ), 一切正常

关于php - 如何在 PHP 中读取 HTTP 原始 POST 数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28078996/

相关文章:

PHP/MySQL 循环帮助

PHP 准备语句 while

php - 如何从英国邮政编码获取地理位置

PHP/MySQL 查询中的查询

php - 将人们在 Flash 游戏上的进度保存到网站上

python - 使用 Django 将 raw_post_data 保存到 FileField