PHP脚本需要大约15秒才能加载

时间:2011-11-12 15:24:17

标签: php performance image

我编写了一个PHP脚本,它遍历给定的文件夹,从那里提取所有图像并将它们显示在HTML页面上(作为标记)。页面大小约为14 KB,但页面大约需要15秒。

以下是代码:

function displayGallery( $gallery, $rel, $first_image ) {
    $prefix = "http://www.example.com/";
    $path_to_gallery = "gallery_albums/" . $gallery . "/";
    $handler = opendir( $path_to_gallery ); //opens directory
    while ( ( $file = readdir( $handler ) ) !== false ) { 
        if ( strcmp( $file, "." ) != 0 && strcmp( $file, ".." ) !=0 ) { 
            //check for "." and ".." files
            if ( isImage( $prefix . $path_to_gallery . $file ) ) {
                echo '<a href="' . $path_to_gallery . $file . '"></a>';
            } 
        }
    }
    closedir( $handler ); //closes directory
}

function isImage($image_file) {
  if (getimagesize($image_file)!==false) {
    return true;
  } else {
    return false;
  }
}

我查看了其他帖子,但大多数都处理SQL查询,而这不是我的情况。

有关如何优化此建议的任何建议吗?

5 个答案:

答案 0 :(得分:1)

您可以使用像http://xdebug.org/docs/profiler这样的PHP分析器来查找脚本的哪些部分永远运行。对于这个问题可能有些过分,但长期来看,你可能很高兴你现在花时间来设置它。

答案 1 :(得分:1)

我想这是因为你在isImage invokation中添加了$前缀。这样,此功能实际上直接从您的网络服务器下载所有图像,而不是在本地查找它们。

你可以使用getimagesize(),当文件不是已知的图像类型时,它会发出E_NOTICE并返回FALSE。

答案 2 :(得分:1)

这里有一个左边的字段建议。您没有说明如何计算执行时间。如果您在浏览器中计时,就像在15秒内从链接加载页面一样,问题可能与您的脚本没有任何关系。我曾经看到过去人们创建类似的页面试图将图像用作标签,并且它们需要永远加载,因为即使它们以缩略图大小或更小的尺寸显示图像,图像本身仍然是800 x 600或其他东西。我知道这听起来很愚蠢,但请确保您不仅仅是以小尺寸显示大图像。脚本需要15秒才能加载并显示76 800 x 600 jpeg,这是完全合理的。

答案 3 :(得分:0)

我的假设是isImage是问题所在。我以前从未见过它。为什么不检查特定的文件扩展名?这很快。
更新:您也可以尝试切换使用exif_imagetype(),这可能比getimagesize()更快。将检查放入顶部功能也会更快。这些功能都不是通过网络连接完成的 - 完全避免这种情况。最好坚持使用文件扩展名。

您是否已直接访问这些文件?每次通过网络查看内容时,都需要一段时间 - 您需要等待整个文件下载。直接在系统上查找文件。

使用scandir将所有文件名一次性放入数组中并浏览它们。这可能会加快速度,因为我认为不会有来回单独的事情。

而不是为strcmp. ..$file != '.' && $file != '..'

此外,速度将取决于返回的文件数量,如果有很多,它将会很慢。操作系统也会因目录中的文件太多而变慢。你循环遍历所有文件和目录,而不仅仅是图像,这是重要的数字,而不仅仅是图像。

答案 4 :(得分:0)

  

getimagesize是问题所在,占用了99.1%的脚本时间。

版本#1 - Orignal案例 enter image description here

版本#2 - 如果你真的需要使用getimagesize和URL(http://)。然后是http://www.php.net/manual/en/function.getimagesize.php#88793中找到的更快的替代方案。它只读取图像的X个第一个字节。 XHProf显示它快x10。另一个想法也可能是使用curl multi进行并行下载https://stackoverflow.com/search?q=getimagesize+alternative

enter image description here

版本#3 - 我认为这是最适合你的情况是打开文件作为普通文件系统而不用(http://)。每Xhprof甚至更快x100 enter image description here