PHP file_get_contents($url) 的性能较慢

6
我的网页使用Google图表生成五个图形。如果这些图形没有被缓存,我有以下代码行来检索图像。 $image = file_get_contents("http://chart.apis.google.com/chart?".$query);
当该代码在循环中执行时,获取每个图像需要10秒钟。但是,如果我更改代码以使用Google的IP地址之一而不是URL: $image = file_get_contents("http://74.125.93.100/chart?".$query);
获取图像只需要不到一秒钟。因此,我的初步想法是DNS没有解析URL,延迟来自于循环遍历分配的DNS服务器?所以我试图从服务器上ping chart.apis.google.com,它立即返回一个合理的响应。
因此,我的问题是:是否有任何PHP(或Apache2)配置设置可能会导致此延迟,或者这听起来像是服务器配置问题?

如果您使用另一种检索图像的方法,例如cURL,会怎样呢? - Matt
哪个版本的PHP?有没有可能升级到最新版本看看是否可以解决问题? - Nick Presta
我会进行一些测试,以确定 DNS 是否真的是问题所在。您可以将 API 调用包装在计时块中。 - Travis Leleu
感谢所有回复的人。问题肯定与DNS有关,我正在努力找出它是否与PHP或Apache有关。我已经尝试使用不同的DNS服务器测试了服务器,但没有任何效果。如果我发现更多信息,我会进行更新。 - Kevin
请查看此处: https://dev59.com/bHA65IYBdhLWcg3wyh57 - user2392662
4个回答

7
你的DNS解析速度很慢(你的服务器使用的DNS可能有问题,导致大多数其他域名也很慢),或者你的服务器在使用DNS缓存时出现了问题。
无论如何,如果你没有特殊的原因需要操作从Google Charts接收到的图像,为什么不直接将其作为img标签打印出来呢?如果你想要叠加文本或透明的png图片,可以使用CSS。

4

我这里也遇到了同样的问题。可能是DNS问题...也许是Apache服务器使用的DNS服务器太慢了。

我尝试了不同的方法:CURL,WGET(shell exec)...但仍然存在相同的性能问题。

在我的生产服务器上需要大约15秒才能完成。但在我的本地服务器上(使用IP地址),使用我的脚本只需要不到1.5秒。

尝试查看/etc/resolv.conf或/etc/named.conf?也许可以。我正在寻找解决方案。


5
我似乎和你遇到了完全相同的问题。我的解决方案是编辑我的/etc/resolv.conf文件,使用谷歌的域名服务器(例如nameserver 8.8.8.8)。 - Steven Oxley
@Steven Oxley 非常感谢!!!我花了2个小时来寻找这个问题的解决方案,只有你的建议是有用的。 - OZ_

2

这个问题与你的主机提供商放置在/etc/resolv.conf中的IP有关。你无法修复它,这是你的主机提供商的问题。

但你可以使用谷歌公共DNS:8.8.8.8。打开/etc/resolv.conf,然后删除所有数据并写入:

nameserver 8.8.8.8

然后保存。重新启动dns和apache。然后再试一次。

1

为什么不在开始加载图像之前解析IP地址呢?

$ip = gethostbyname($name);
$image = file_get_contents($ip."/chart?".$query);

是的,那样做可以解决问题,但仍然需要大约10秒钟的时间,这是无法接受的。我相信这是一个配置问题,只是不确定它是否听起来像是PHP、Apache还是服务器配置问题。 - Kevin
只有当该服务器仅托管一个站点时,它才能工作。在多站点环境中,服务器无法知道您正在调用哪个站点。 - Alekc

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接