php foreach很慢

时间:2013-06-16 12:18:21

标签: php foreach html-parsing domdocument

我有这个代码完全按照我想要的方式完成工作,它会告诉我任何网页上的所有图像,但我花了一分多钟,服务器上的负载也因为这段代码而增加。 如果有人知道更好的方式(更快,更少负载在服务器上),请给你的建议

     $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匹配,但又认为这不是一个好方法。

2 个答案:

答案 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()的依赖。如果你无法摆脱它,也许你可以把它包装在某种本地缓存中,这样你的程序可以先检查那里是否先前加载了该文件;这至少可以避免你不得不通过网络重复进行重复呼叫。

希望有所帮助。

偏离主题,但我觉得我应该在你的循环中指出其他一些潜在的问题:

  1. 您正在拨打$tag->getAttribute('src')两次。此调用不会成为一个重大的性能问题,但由于您将其保存到变量($op7),因此您可以先执行此操作,然后在$op7中使用get_headers() {1}}致电。这将使您的程序不必进行重复的方法调用。实际上是小豆子,但即使很小的东西也可以在循环中加起来,修复它对你的功能没有任何影响。

  2. $op7的SQL注入问题。将它作为SQL字符串的一部分使用时,需要将其转义。从代码中不清楚HTML是否来自可靠来源。如果不是,那么有可能找到你正在做的事情来编写他们的页面,使他们的图像文件名包含可能破坏你网站的SQL代码。即使您确实信任该页面,您的代码也不允许文件名包含引号。

  3. 不推荐使用mysql_xxx()个函数。建议使用PDO库。

  4. 请注意,在某些服务器上,可能会禁用file_get_contents()功能以用于外部链接。