首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >通过PHP获取远程XML文件的一部分的最有效方法是什么?

通过PHP获取远程XML文件的一部分的最有效方法是什么?
EN

Stack Overflow用户
提问于 2014-07-12 00:58:23
回答 2查看 144关注 0票数 4

我正在尝试获取远程XML文件的一部分,在本例中,通过Google Maps获取邮政编码的经度和纬度。这是我目前正在使用的函数:

代码语言:javascript
运行
AI代码解释
复制
function slug_get_coordinates( $zip ) {
    $url = "http://maps.googleapis.com/maps/api/geocode/xml?address={$zip}&sensor=false";
    $result = simplexml_load_file( $url );
    $coordinates = $result->result->geometry->location;
    return $coordinates;
}

这有时会在长时间页面加载后起作用,但通常会超时。有没有一种方法可以直接到达我需要的XML文件部分,而不需要加载整个文件,或者其他一些优化方法?

EN

回答 2

Stack Overflow用户

发布于 2014-07-12 02:58:23

除非服务提供此功能,否则您不能基于选择器(例如XPath / CSS)请求部分响应。

关于效率,我建议尽可能详细地分解请求时间,以找出为什么某个请求需要一段时间。cURL对此有很好的支持,例如:

代码语言:javascript
运行
AI代码解释
复制
$zip = urlencode('1 infinite loop');
$ch = curl_init("http://maps.googleapis.com/maps/api/geocode/xml?address={$zip}&sensor=false");
curl_exec($ch);
print_r(curl_getinfo($ch));

这将产生一个包含请求的所有元数据的数组:

代码语言:javascript
运行
AI代码解释
复制
Array
(
    ...
    [total_time] => 0.11955
    [namelookup_time] => 0.02996
    [connect_time] => 0.035803
    [pretransfer_time] => 0.035874
    ...
    [size_upload] => 0
    [size_download] => 1737
    [speed_download] => 14529
    [speed_upload] => 0
    [download_content_length] => -1
    [upload_content_length] => 0
    [starttransfer_time] => 0.119444
    [redirect_time] => 0
    ...
)

有了这些数据,您就可以制定适当的方法来处理这个问题。缓存响应可能会减少经常重复搜索的请求时间,但它可能不适用于您的特定情况。

票数 2
EN

Stack Overflow用户

发布于 2014-07-12 09:14:25

通过

获取远程XML文件的一部分最有效的方法是什么?

这个问题不能具体回答,因为这有很多影响。

实际上,您在这里处理的是一个远程服务。我通常建议总是包装/代理这些(比较:)。这是因为它们总是带有许多含义。通过将数据检索封装到一个函数中,您已经部分地做到了这一点:

代码语言:javascript
运行
AI代码解释
复制
function slug_get_coordinates( $zip ) {
    $url = "http://maps.googleapis.com/maps/api/geocode/xml?address={$zip}&sensor=false";
    $result = simplexml_load_file( $url );
    $coordinates = $result->result->geometry->location;
    return $coordinates;
}

然而,这个单一的功能不足以处理这样的服务可能带来的所有问题。例如,远程位置可能只是关闭了-这样的响应超时可能是合格的-或者正如你所经历的那样,它只是花费了太长的时间。

所以你基本上对服务的质量不满意。

由于远程服务通常不能完全控制它们,并且对服务质量的影响很小,因此包装它的好处是可以在包装器中处理此类问题,从而保护应用程序逻辑的其余部分不受所有这些影响的影响。

您还需要有错误处理,这是您的函数中所缺少的。这里的另一个提示是为失败而设计。例如,让您的应用程序仍然工作,甚至您试图检索(添加)的信息丢失。

这样的代理的另一个好处是,您可以在其中实现调试功能。例如,使用您提供的代码,我完全可以快速检索数据:

代码语言:javascript
运行
AI代码解释
复制
$zip = '55416';

$start = microtime(true);

slug_get_coordinates($zip)->asXML('php://output');

printf("\n----\nTook %.5f seconds\n", microtime(true) - $start);

输出:

代码语言:javascript
运行
AI代码解释
复制
<location>
    <lat>44.9465193</lat>
    <lng>-93.3439291</lng>
   </location>
----
Took 0.11873 seconds

如果需要更深入地研究远程请求,可以挂钩PHP的流通知。我已经编译了一个,它可以完成这方面的工作,并且可以很容易地注册:

代码语言:javascript
运行
AI代码解释
复制
$zip = '55416';

$notifier = new StreamNotifyPrinter();
libxml_set_streams_context($notifier->registerOnContext());

$start = microtime(true);

slug_get_coordinates($zip)->asXML('php://output');

printf("\n----\nTook %.5f seconds\n", microtime(true) - $start);

输出:

代码语言:javascript
运行
AI代码解释
复制
2014-07-12T09:07:40.146422+0000 [0.00000] Connected...
2014-07-12T09:07:40.228122+0000 [0.08170] Found the mime-type: application/xml; charset=UTF-8
2014-07-12T09:07:40.228251+0000 [0.08183] Made some progress, downloaded 0 so far
2014-07-12T09:07:40.228341+0000 [0.08192] Made some progress, downloaded 757 so far
<location>
    <lat>44.9465193</lat>
    <lng>-93.3439291</lng>
   </location>
----
Took 0.11873 seconds

最后一种方法:如果您不能通过故障排除来解决问题,那么正确地包装它可能会使用更好的工作数据库替换远程服务变得更容易。但也许可以检查一下地理坐标是否与邮政编码一起工作得很好:Where can I obtain an up-to-date list of US ZIP Codes with Latitude and Longitude Geocodes?

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24708591

复制
相关文章
PHP中获取远程文件的三种方法
1.使用file_get_contents和fopen必须空间开启allow_url_fopen。
ITer.996
2019/08/28
9210
PHP 获取远程文件大小的3种解决方法
1、使用file_get_contents() 复制代码 代码如下: <?php $file = file_get_contents($url); echo strlen(
双面人
2020/01/13
1.8K0
最简单的php导出excel文件方法
网上有很多php操作excel或其他文件的类库,也做的很完善。比如无比风骚的PHPExcel,官方网站:http://www.codeplex.com/PHPExcel ,pear的Spreadsheet_Excel_Writer类等。然而我们只是用到其中一部分功能,这就会让程序显的有些臃肿。在你调用这些类库的时候,不管你是多简单的操作,他都会消耗巨大的内存,这对我们来说是很不可取的。     比如我需要一个做php导出 excel的的程序,只需要把相关的数据导出到excel表就可以了,这么简单的操作就不需
joshua317
2018/04/10
5.3K0
php获取xml数据
作者:matrix 被围观: 1,329 次 发布时间:2013-10-27 分类:零零星星 | 6 条评论 »
HHTjim 部落格
2022/09/26
2.3K0
【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 )
创建 XmlParser 解析器 , 传入 Xml 文件对应的 File 对象 ;
韩曙亮
2023/03/30
7.3K0
【Groovy】Xml 反序列化 ( 使用 XmlParser 解析 Xml 文件 | 获取 Xml 文件中的节点和属性 | 获取 Xml 文件中的节点属性 )
springMVC通过getBean()获取context.xml文件中定义的service接口类
将springMVC框架搭建好后,在web工程下建一个test测试包,再建一个junit测试类
全栈程序员站长
2021/07/19
7660
PHP 中获取文件扩展名的正确方法
在 PHP 中,如何获取文件扩展名名呢,我们可能会用字符串操作函数进行处理,比如:
Denis
2023/04/15
1.3K0
java根据xml模板生成xml文件的方法
本文实例讲述了java生成xml格式文件的方法。分享菜鸟站长之家给大家供大家参考,具体如下:
菜鸟站长之家
2021/02/04
2.9K0
有效的xml文档--DTD
DTD(document type define,简称DTD)是有效的xml文档基础,是一套关于标记符的语法规则,后缀名为 .dtd。 DTD可以在xml文档中直接写入,称为内部DTD;也可以单独形成文件,称为外部DTD.外部dtd文件可以被多个xml文件共享。
热心的社会主义接班人
2018/04/27
1.6K0
有效的xml文档--DTD
获取基因有效长度的N种方法
最近有粉丝自告奋勇希望可以把他自己在简书等平台的生物信息学笔记分享在我们生信技能树公众号,在专业的舞台上跟大家切磋!
生信技能树
2022/06/27
4.9K0
获取基因有效长度的N种方法
php处理pathinfo()方法获取中文文件名错误的方法
首先这是这个方法本身的一个bug。 简单粗暴的解决办法就是直接在文件名前加上一个英文字符,再截取。 即: substr(pathinfo("_{$file['name']}", PATHINFO_FILENAME), 1);
槽痞
2020/06/23
1.8K0
PHP获取文件扩展名的4种方法
return array_pop(explode('.', $file_name));
超级小可爱
2023/02/17
7150
PHP获取文件扩展名的4种方法
return array_pop(explode('.', $file_name));
超级小可爱
2023/02/20
6120
最安全的PHP密码加密方法
常用的MD5、SHA1、SHA256哈希算法,是面向快速、高效进行哈希处理而设计的。随着技术进步和计算机硬件的提升,如今强大的计算机很容易破解这种算法。也就是说,不要用MD5、SHA1、SHA256这种哈希方法加密密码了,不太安全。 还好,PHP内置了密码哈希函数password_hash,使用这个方法,PHP会升级底层的算法,达到如今的安全标准水平。
骤雨重山
2022/01/17
4K0
php获取文件后缀6种方法
php获取文件后缀的6中方法: <?php $filename = 'mypicname.jpg'; // 1. The "explode/end" approach $ext = end(ex
IT工作者
2022/04/16
8940
点击加载更多

相似问题

通过PHP远程url发送XML文件

12

php5读取远程文件的有效方法

20

通过PHP检索网页内容最简单的方法是什么?

30

使用PHP获取CSV文件一部分的有效方法

50

使用nodejs从XML读取元素的最简单、最有效的方法是什么?

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
社区富文本编辑器全新改版!诚邀体验~
全新交互,全新视觉,新增快捷键、悬浮工具栏、高亮块等功能并同时优化现有功能,全面提升创作效率和体验
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文