-1

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

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

4

2 回答 2

0

您的性能问题可能是由于get_headers(). 此函数向指定的 URL 发出 HTTP 请求。

您可以通过编写一个测试程序来证明这一点,该程序简单地对有get_headers()问题的 URL 执行一系列操作,而无需循环。例如:

<?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),您不妨先这样做,然后$op7get_headers()调用中使用。这将使您的程序不必进行重复的方法调用。确实是小豆子,但即使是小东西在循环中也会累加起来,修复它不会对您的功能产生任何影响。

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

  3. 这些mysql_xxx()功能已弃用。建议改用 PDO 库。

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

于 2013-06-16T13:20:49.240 回答
0

试着找出真正减速的部分是什么。我猜是file_get_contents(),可能网页所在的服务器上游有问题。

于 2013-06-16T12:27:56.453 回答