0

可能重复:
php 生成的画廊中的缩略图加载缓慢

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

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

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);

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

4

2 回答 2

3

您应该从您的网站性能图表中注意到的最多的是,

我不会查看您的所有代码,但您有一个名为crop.php. 这会很慢,因为它(可能)在每次页面加载时裁剪图像,这需要相对较长的时间(从站点性能数据中可以明显看出);对于每个请求,浏览器花费大部分时间等待服务器响应。

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

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);

这是未经测试的,但应该可以工作。请不要只是复制粘贴上面的代码;通读它并确保您了解它是如何以及为什么这样做的。

于 2012-07-08T15:32:30.147 回答
0

由于 HTTP 请求正在排队,您的页面加载缓慢。

尽管每个图像都很小,但请求花费了很大一部分时间排队,等待其他请求完成后再开始,在最坏的情况下,它们甚至在开始下载之前等待一秒半。

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

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

  1. 排队 1600 毫秒
  2. 等待 986 毫秒
  3. 下载 0ms

与其每次都生成正确大小的图像,不如将结果存储起来以供后续访问使用——这意味着页面会慢一次,然后在所有其他时间都快得多。

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

  1. 检入裁剪图像的文件夹
  2. 如果存在,则提供它(无需计算)
  3. 如果它不存在,则生成它
  4. 将结果保存在文件夹中以缓存它
于 2012-07-08T15:38:31.420 回答