PHP接收XML数据需从php://input读取原始请求体,用file_get_contents获取并校验内容,禁用已废弃的$HTTP_RAW_POST_DATA。
如果您的PHP脚本需要处理客户端通过HTTP请求发送的XML格式数据,则需正确读取
原始输入流并解析其内容。以下是实现PHP接收XML数据的具体步骤:
PHP无法直接通过$_POST获取原始XML数据,因为XML不是标准的application/x-www-form-urlencoded或multipart/form-data编码格式。必须从php://input流中读取原始请求体。
1、在PHP脚本开头添加header设置,确保响应头支持UTF-8编码(可选但推荐):
header('Content-Type: text/html; charset=utf-8');
2、调用file_get_contents函数读取php://input:
$xmlRaw = file_get_contents('php://input');
3、检查是否成功读取:
if (empty($xmlRaw)) {
die('未接收到任何XML数据,请确认客户端已发送有效请求体');
}
在旧版PHP中,若配置项always_populate_raw_post_data未设为-1,可通过超全局变量$HTTP_RAW_POST_DATA访问原始POST数据。该方式不推荐用于新项目,且PHP 7.0+已完全移除。
1、确认PHP版本低于7.0且配置允许:
if (version_compare(PHP_VERSION, '7.0.0', '
2、直接赋值使用:
$xmlRaw = $HTTP_RAW_POST_DATA;
3、若变量为空,则回退至php://input方式:
} else {
$xmlRaw = file_get_contents('php://input');
}
当file_get_contents不可用(如被禁用)或需逐块处理大体积XML时,可采用文件流方式读取php://input,提升内存控制能力。
1、以只读模式打开php://input:
$handle = fopen('php://input', 'r');
2、初始化空字符串用于拼接:
$xmlRaw = '';
3、循环读取每8192字节直至EOF:
while (!feof($handle)) {
$xmlRaw .= fread($handle, 8192);
}
4、关闭流句柄:
fclose($handle);
获取原始XML字符串后,需借助PHP内置扩展进行结构化解析。SimpleXML扩展提供最简洁的DOM式访问方式。
1、启用SimpleXML扩展(通常默认启用):
if (!extension_loaded('simplexml')) {
die('SimpleXML扩展未启用,请检查php.ini配置');
}
2、加载XML字符串:
$xmlObj = simplexml_load_string($xmlRaw, 'SimpleXMLElement', LIBXML_NOCDATA);
3、检测解析错误:
if ($xmlObj === false) {
$errors = libxml_get_errors();
foreach ($errors as $error) {
echo "XML解析错误:{$error->message}";
}
exit;
}
客户端可能在请求头中声明Content-Type为application/xml或text/xml,PHP应验证该头部以增强健壮性;同时需确保XML声明中的编码与实际传输一致,避免乱码。
1、获取请求头中的Content-Type:
$contentType = $_SERVER['CONTENT_TYPE'] ?? '';
2、校验是否为XML类型:
if (!preg_match('/application\/xml|text\/xml/i', $contentType)) {
http_response_code(400);
die('请求Content-Type不匹配XML格式,请使用application/xml或text/xml');
}
3、检查XML字符串是否以UTF-8 BOM或XML声明开头,并执行编码标准化:
if (substr($xmlRaw, 0, 3) === "\xEF\xBB\xBF") {
$xmlRaw = substr($xmlRaw, 3);
}
if (preg_match('/]+encoding=[\'"]([^\'"]+)[\'"]/i', $xmlRaw, $matches)) {
$declaredEncoding = strtoupper($matches[1]);
if ($declaredEncoding !== 'UTF-8') {
$xmlRaw = mb_convert_encoding($xmlRaw, 'UTF-8', $declaredEncoding);
}
}
# php
# html
# 编码
# app
# php脚本
# if
# die
# xml
# 全局变量
# input
# http
# 客户端
# 您的
# 句柄
# 设为
# 能在
# 请使用
# 可选
# 可通过
# 仅限
# 请确认
相关文章:
建站上传速度慢?如何优化加速网站加载效率?
宠物网站制作html代码,有没有专门介绍宠物如何养的网站啊?
教学网站制作软件,学习*后期制作的网站有哪些?
建站OpenVZ教程与优化策略:配置指南与性能提升
建设网站制作价格,怎样建立自己的公司网站?
Swift中swift中的switch 语句
装修招标网站设计制作流程,装修招标流程?
宁波自助建站系统如何快速打造专业企业网站?
创业网站制作流程,创业网站可靠吗?
,sp开头的版面叫什么?
seo网站制作优化,网站SEO优化步骤有哪些?
在线流程图制作网站手机版,谁能推荐几个好的CG原画资源网站么?
建站之星导航如何优化提升用户体验?
Python多线程使用规范_线程安全解析【教程】
如何用低价快速搭建高质量网站?
公司网站建设制作费用,想建设一个属于自己的企业网站,该如何去做?
图片制作网站免费软件,有没有免费的网站或软件可以将图片批量转为A4大小的pdf?
陕西网站制作公司有哪些,陕西凌云电器有限公司官网?
电商网站制作多少钱一个,电子商务公司的网站制作费用计入什么科目?
建站主机选虚拟主机还是云服务器更好?
在线制作视频网站免费,都有哪些好的动漫网站?
建站之星如何配置系统实现高效建站?
如何选择高效响应式自助建站源码系统?
成都品牌网站制作公司,成都营业执照年报网上怎么办理?
如何选择美橙互联多站合一建站方案?
杭州银行网站设计制作流程,杭州银行怎么开通认证方式?
建站之星×万网:智能建站系统+自助建站平台一键生成
如何在企业微信快速生成手机电脑官网?
如何在局域网内绑定自建网站域名?
如何在宝塔面板中创建新站点?
如何用景安虚拟主机手机版绑定域名建站?
详解ASP.NET 生成二维码实例(采用ThoughtWorks.QRCode和QrCode.Net两种方式)
阿里云网站制作公司,阿里云快速搭建网站好用吗?
,石家庄四十八中学官网?
北京制作网站的公司,北京铁路集团官方网站?
jQuery 常见小例汇总
如何选择CMS系统实现快速建站与SEO优化?
网站制作哪家好,cc、.co、.cm哪个域名更适合做网站?
高防服务器租用如何选择配置与防御等级?
寿县云建站:智能SEO优化与多行业模板快速上线指南
实惠建站价格推荐:2025年高性价比自助建站套餐解析
浅谈Javascript中的Label语句
建站之星24小时客服电话如何获取?
大连企业网站制作公司,大连2025企业社保缴费网上缴费流程?
外贸公司网站制作哪家好,maersk船公司官网?
北京网页设计制作网站有哪些,继续教育自动播放怎么设置?
Avalonia如何实现跨窗口通信 Avalonia窗口间数据传递
常州自助建站:操作简便模板丰富,企业个人快速搭建网站
微网站制作教程,我微信里的网站怎么才能复制到浏览器里?
网站插件制作软件免费下载,网页视频怎么下到本地插件?
*请认真填写需求信息,我们会在24小时内与您取得联系。