我有这个代码做的工作完全按照我想要的方式,它会告诉我在任何网页上可用的所有图像,但我需要超过一分钟,服务器上的负载也增加了,因为这段代码。如果有人知道更好的方法(更快,更少的服务器负载),请给你的建议
$html = file_get_contents($link);
$doc = new DOMDocument();
@$doc->loadHTML($html);
$tags = $doc->getElementsByTagName('img');
foreach ($tags as $tag) {
$data = get_headers($tag->getAttribute('src'),1);
$op7=''.$tag->getAttribute('src').'';
mysql_query ("INSERT INTO tablea (image) VALUES ('$op7')");
}
我曾想过使用preg match,但再次认为这将不是一个好方法。
您的性能问题可能是由于get_headers()
。此函数向指定的URL发出HTTP请求。
您可以通过编写一个测试程序来证明这一点,该程序简单地对所讨论的url执行get_headers()
序列,而不使用循环。如:
<?php
get_headers('http://example.com/image1.png');
get_headers('http://example.com/image2.png');
get_headers('http://example.com/image3.png');
get_headers('http://example.com/image4.png');
get_headers('http://example.com/image5.png');
?>
我的猜测是,这个简单的程序将花费几乎和您现有的循环一样长的时间来运行,这将证明这就是您的性能问题所在。
不清楚你为什么要做get_headers()
呼叫;您没有包含任何使用$data
的代码。如果你可以完全避免这样做,我建议你这样做,因为任何对外部URL的调用都会很慢;但是在循环中执行真的会很慢。
请记住,PHP不会像浏览器那样快速加载它们,因为PHP是顺序加载它们的——一个接一个,而浏览器会同时加载它们。您的PHP程序必须等待服务器发送完整的响应,然后PHP才能继续运行您的下一行代码。这意味着程序的性能完全取决于连接到远程服务器的速度。这种依赖性乘以图像的数量。不是伟大;怪不得你的程序这么慢。
此外,您不允许图像src
属性不是完整的URL。例如,它可能只是/image5.png
,没有域名。这将混淆get_headers()
,并可能使您的程序更慢。
简而言之,您应该尝试摆脱对get_headers()
的依赖。如果你不能摆脱它,也许你可以把它包装在某种本地缓存中,这样你的程序就可以先检查那里,看看它之前是否加载了那个文件;那至少可以使你不必通过网络打重复的电话。
希望有帮助。
跑题了,但我觉得我应该指出你的循环中其他一些潜在的问题:
您呼叫
$tag->getAttribute('src')
两次。这个调用不会造成很大的性能问题,但是由于要将其保存到一个变量($op7
)中,因此不妨先这样做,然后在get_headers()
调用中使用$op7
。这将使您的程序不必进行重复的方法调用。真的很小,但是即使是很小的东西在循环中也会累积起来,修复它不会对你的功能产生任何影响。$op7
的SQL注入问题。当将其用作SQL字符串的一部分时,需要对其进行转义。从代码中不清楚HTML是否来自受信任的源。如果不是这样,那么就有可能有人知道您在做什么,从而在他们的页面中编写图像文件名,使其包含可以攻击您的站点的SQL代码。即使您信任该页面,您的代码也不允许文件名包含引号。已弃用
mysql_xxx()
函数。建议使用PDO库。请注意,在某些服务器上,
file_get_contents()
功能可能被禁用用于外部链接。
试着找出真正减慢速度的部分。我猜是file_get_contents(),也许是服务器的网页所在有坏的上游