我有这个代码完全按照我想要的方式完成工作,它会告诉我任何网页上的所有图像,但我花了一分多钟,服务器上的负载也因为这段代码而增加。 如果有人知道更好的方式(更快,更少负载在服务器上),请给你的建议
$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匹配,但又认为这不是一个好方法。
答案 0 :(得分:0)
尝试找出真正放慢速度的部分。我想这是file_get_contents(),也许网页所在的服务器上游有坏。
答案 1 :(得分:0)
您的性能问题可能归因于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
属性。例如,它可能只是/image5.png
,没有域名。这会使get_headers()
混淆,并可能使您的程序更慢。
简而言之,您应该尝试摆脱对get_headers()
的依赖。如果你无法摆脱它,也许你可以把它包装在某种本地缓存中,这样你的程序可以先检查那里是否先前加载了该文件;这至少可以避免你不得不通过网络重复进行重复呼叫。
希望有所帮助。
偏离主题,但我觉得我应该在你的循环中指出其他一些潜在的问题:
您正在拨打$tag->getAttribute('src')
两次。此调用不会成为一个重大的性能问题,但由于您将其保存到变量($op7
),因此您可以先执行此操作,然后在$op7
中使用get_headers()
{1}}致电。这将使您的程序不必进行重复的方法调用。实际上是小豆子,但即使很小的东西也可以在循环中加起来,修复它对你的功能没有任何影响。
$op7
的SQL注入问题。将它作为SQL字符串的一部分使用时,需要将其转义。从代码中不清楚HTML是否来自可靠来源。如果不是,那么有可能找到你正在做的事情来编写他们的页面,使他们的图像文件名包含可能破坏你网站的SQL代码。即使您确实信任该页面,您的代码也不允许文件名包含引号。
不推荐使用mysql_xxx()
个函数。建议使用PDO库。
请注意,在某些服务器上,可能会禁用file_get_contents()
功能以用于外部链接。