我编写了一个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查询,而这不是我的情况。
有关如何优化此建议的任何建议吗?
答案 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案例
版本#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
版本#3 - 我认为这是最适合你的情况是打开文件作为普通文件系统而不用(http://)。每Xhprof甚至更快x100