php foreach is very slow


php foreach is very slow

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

     $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()的依赖。如果你不能摆脱它,也许你可以把它包装在某种本地缓存中,这样你的程序就可以先检查那里,看看它之前是否加载了那个文件;那至少可以使你不必通过网络打重复的电话。

希望有帮助。

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

  1. 您呼叫$tag->getAttribute('src')两次。这个调用不会造成很大的性能问题,但是由于要将其保存到一个变量($op7)中,因此不妨先这样做,然后在get_headers()调用中使用$op7。这将使您的程序不必进行重复的方法调用。真的很小,但是即使是很小的东西在循环中也会累积起来,修复它不会对你的功能产生任何影响。

  2. $op7的SQL注入问题。当将其用作SQL字符串的一部分时,需要对其进行转义。从代码中不清楚HTML是否来自受信任的源。如果不是这样,那么就有可能有人知道您在做什么,从而在他们的页面中编写图像文件名,使其包含可以攻击您的站点的SQL代码。即使您信任该页面,您的代码也不允许文件名包含引号。

  3. 已弃用mysql_xxx()函数。建议使用PDO库。

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

试着找出真正减慢速度的部分。我猜是file_get_contents(),也许是服务器的网页所在有坏的上游