画廊加载缓慢

时间:2012-07-08 15:30:04

标签: php

  

可能重复:
  Thumbnails in php generated gallery loading slow

代码链接可以在页面底部找到。

该网站从基于Linux的1and1.co.uk系统运行,足以以比目前更快的速度加载图库。

php生成的缩略图加载有点慢,你能告诉我为什么吗?

http://site-perf.com/cgi-bin/show.cgi?id=vz5le19Fp5E

代码: http://satinaweb.com/tmp/functions.txt

以下是crop.php

$sourceimage = $_GET['a'];

function crop($sourceimage) {
    // Draw & resize
    header('Content-Type: $imsz[\'mime\']');

    list($width, $height) = getimagesize($sourceimage);

    if($width > $height){
        $new_width = 100;
        $new_height = 75;
    } else {
        $new_width = 75;
        $new_height = 100;
    }

    $image = imagecreatefromjpeg($sourceimage);
    $image_p = imagecreatetruecolor($new_width, $new_height);

    imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);
    imagejpeg($image_p);
    imagedestroy($image_p);
    imagedestroy($image);
} 

crop($sourceimage);

如果您有任何疑问,请询问!

2 个答案:

答案 0 :(得分:3)

你应该从你的site-perf图中注意到的是,

我不会查看您的所有代码,但您有一个名为crop.php的文件。这将是缓慢的,因为它(可能)在每个页面加载时裁剪图像,这需要相对长的时间(从site-perf数据显而易见);对于每个请求,浏览器花费大部分时间等待服务器响应。

您应该考虑使用缓存文件夹存储裁剪后的图像并按原样提供,以减少加载时间。

crop.php中,您可以执行以下操作(伪代码):

IF original image newer than cropped OR cropped doesn't exist
    Load original image
    Crop original image
    Save cropped image to cache folder
ELSE
    Serve already-cropped image from cache
ENDIF

每次拨打crop()时,您都会阅读图片,修改图像并将其吐出到客户端。这非常浪费,因为您需要为每个请求重新处理图像。你甚至会在之后破坏图像(并不是说这会产生很大的不同)。而是将is_file()与缓存目录一起使用,并将映像保存到磁盘并将其发送到客户端。

现在,您的脚本可能如下所示:

$sourceimage = $_GET['a'];

$cache_dir = dirname(__FILE__) . "/cache";        // Cache directory
$cache_file = $cache_dir . '/' . $source_image; // Path to cached image

function crop($sourceimage) {
    header('Content-Type: $imsz[\'mime\']');

    // If cached version of cropped image doesn't exist, create it
    if(!is_file($cache_file)) {     
        list($width, $height) = getimagesize($sourceimage);

        if($width > $height) {
            $new_width = 100;
            $new_height = 75;
        } else {
            $new_width = 75;
            $new_height = 100;
        }

        $image = imagecreatefromjpeg($sourceimage);
        $image_p = imagecreatetruecolor($new_width, $new_height);

        imagecopyresampled($image_p, $image, 0, 0, 0, 0, $new_width, $new_height, $width, $height);

        imagejpeg($image_p, $cache_file);   // Save image file to disk
    } else {    // If cached file exists, output to browser without processing
        echo file_get_contents($cache_file);
    }
} 

crop($sourceimage);

这是未经测试的,但应该可以使用。请不要只复制并粘贴上面的代码;仔细阅读并确保你理解它是如何以及为什么做它的作用。

答案 1 :(得分:0)

由于HTTP请求已排队,您的页面加载速度很慢。

尽管每张图片都很小,但是请求的大部分时间都在排队,等待其他请求在开始之前完成,在最糟糕的情况下,他们等待一秒半才开始下载

第二个延迟是由创建图像所需的时间引起的。

等待这些其他过程后,实际下载几乎是即时的。

  1. 排队1600毫秒
  2. 等待986毫秒
  3. 下载0ms
  4. 不是每次都生成正确大小的图像,为什么不存储要在后续访问中使用的结果 - 这意味着页面将缓慢一次,然后在其他时间更快。

    如果您的脚本裁剪图像的时间缩短了,那么排队也会缩短。这是一个例子......

    1. 检入文件夹中的裁剪图像
    2. 如果存在,请提供服务(无需计算)
    3. 如果它不存在,则生成它
    4. 将结果保存在文件夹中以进行缓存