缓存通过PHP/AAJX/JSON/jQuery加载的动态图像


Caching dynamic images loaded via PHP/AJAX/JSON/jQuery

我会在这里尽可能彻底。

我正在使用的应用程序使管理员能够创建文件夹,然后将照片上传到该文件夹中。该显示器类似于Pinterest,它将所有照片拼贴在一个屏幕上。当你只有5-6张照片的时候,它非常完美,但很少会是这样。一旦你开始在那里获得更多的照片,它就会变得越来越慢。另一件事是,每当你删除一张图片或重新输入该文件夹时,整个显示器都必须重新加载。我需要一些缓存这些图像的方法。

以下是我的脚本的逻辑:

dashboard.php上,有两个javascript,包括:homepageActions.jsfileManager.jshomepageActions.js有一个document.ready()脚本,它调用一个javascript函数showFiles()

因此,基本上,为了更简洁一点,一旦加载文档,就会调用函数showFiles()。这个函数看起来像这样:

function showFiles(directoryName) {
  $.ajax({
    url: 'displayRecords.php',
    type: 'post',
    data: ({directoryName:directoryName}),
    dataType: 'json',
    success: function(data) {
        constructTable(data);
        $(document).find("a[rel*='lightbox']").lightBox();
    }
  });
}

这个函数有一个文件夹路径。从那里,AJAX脚本调用一个在该文件夹中查找的PHP脚本,并获得该文件夹中所有目录和图像的列表。然后,它构造一个JSON字符串,其中包含最初传入的文件夹中每个子文件夹和图像的详细信息。一旦该脚本成功返回,就会调用另一个函数constructTable(data),该函数会将JSON字符串传入该函数。

这就是事情开始变得有点棘手的地方。

constructTable()函数中有大约240行代码,我不会在这里包括这些代码,因为它很难理解。总之,这个函数解析JSON字符串,找出哪些条目是目录,哪些条目是文件。它从中创建了两个数组:一个是文件夹数组,另一个是文件数组。

首先,我处理所有的文件夹,并相应地显示它们。这部分很好,我不担心。

然而,在那之后,我开始浏览这些图像。对于每个图像,我基本上都围绕着它写了很多代码。每个图像周围都有div、链接和其他HTML标记。但长话短说,我有一个。。。下一个循环查看每个文件路径(从JSON中收集),我构建了一个长的HTML字符串,然后使用jQuery将其附加到DIV中。所以它最终看起来像这样:

for (var a = 0; a < numPhotos; a++) {
   photoCode += "<div id='outside-container-"+a+"'>";
   photoCode += "<a rel='lightbox' class='photo-link' href='"++"'>";
   photoCode += "<img src='http://" + rootURL + "/uploads/"+fileNameArray[a] + "' width='200' class='photo-thumb'/></a>";
   photoCode += "</div>";
   $("#column1").append(photoCode);
}

现在,正如我之前所说,当文件夹中只有几张照片时,这是没有问题的。然而,当我们开始进入更高的数字时,这就成了一个问题。那么,话虽如此,有没有什么方法可以将这些照片存储到浏览器缓存中,以便在初始加载后更快地加载?

所以。。这个问题不仅仅有一个原因,让我们对他们说:]

  1. JavaScript在函数运行时阻止页面:在函数运行期间,所有页面都会被阻止,直到停止运行。一般来说,这需要几毫秒的时间,人类无法感知,但当你在一个循环中有一个艰难的过程时,可能需要几秒钟的时间,然后它就会清晰可见
  2. 加载大图像可能需要很长时间:文件越大,加载时间越长;如果你有大约100张5MB大小的图片,加载所有图片需要很长时间(它们不是并行加载的)
  3. Parallel的文件加载:浏览器对每个主机(any.thing.com)上的请求数量有限制;因此,如果您试图在同一主机(www.yourhost.com/images/#{imgname})中加载100个映像,您将无法并行加载所有映像,浏览器将对一个主机执行可能的请求数量,然后对所有其他主机进行排队

好的,现在你知道了有很多请求的页面的一些HTTP问题,让我们来看看解决方案:D

  1. JavaScript块:这不是你的情况,但为了解决这个问题,你应该打破JavaScript同步性。怎样
    • 拆除环路
    • 用循环中的代码构建一个函数;该函数应该接收元素的列表和索引
    • 在新函数中,您将只处理接收到的索引的元素,然后再次调用该函数(如递归性),增加索引并使用setTimeout函数(这将破坏同步性
  2. 大型图像:解决它很容易;这个解决方案的关键是显示拇指而不是真实的图像。您可以使用@MichalPlško(phpThumb)建议的脚本。此外,您应该限制加载的图像数量,并根据需要加载更多图像,就像Pinterest所做的那样(使用自动加载进行分页)
  3. 并行文件加载:这应该是您真正的问题;这并不太容易,但也不难解决:D你只需要创建一些子域,并使它们指向正确的位置,比如img01.yourdomain.com指向你的图像文件夹或类似的东西

您可以通过使用名为phpThumb()的脚本来改进缓存行为。它可以动态生成缩略图,还可以处理服务器和浏览器上的图像缓存。来自项目网站:

可以缓存缩略图以减少服务器负载。任何源图像的多个大小都可以单独缓存。当(本地)源图像修改时,缩略图会自动更新

因此,如果你认为你的问题可能是由缩略图创建、图片缓存和类似的事情引起的,请尝试一下。我有很好的结果。