我已经建立了一个带有相册的 CMS。很简单,大部分都是静态的、静态的 HTML 页面,没有数据库,只是(尽可能少)包含一些 JSON 内容的文本文件。管理面板的 Web 界面全部使用 jQuery,并带有基于 PHP(Zend 框架)的后端。尽可能多地在浏览器中完成,因此后端非常裸露。现在相册目前的工作方式是这样的:
- 点击链接“媒体”
- 从后端获取一个 JSON 字符串,该字符串包含一个包含所有相册的对象以及每个相册的所有照片
- 渲染包含所有专辑的无序列表
- 在每个相册列表项中使用所有图片呈现无序列表
上传:
- 将一个或多个 jpeg/png 文件拖放到浏览器中以创建新相册
- 将一个或多个 jpeg/png 文件拖放到相册中,以将这些文件附加到光标下的相册中
- 将所有拖放的文件(使用这个jQuery 拖放上传插件)发送到后端
- 后端接收所有文件(同时显示一个漂亮的进度条)
- 后端循环所有上传的文件,而网络界面显示一个漂亮的微调器
- 每个文件都调整为指定的最大尺寸,并以最大 133x133 像素呈现缩略图
- 每个文件都附加到具有服务器端文件名和缩略图名称的数组
- [尚未实现:为专辑概览和每张图片呈现(更新的)静态 html 页面]
- 包含所有新上传文件的数组被转换为 JSON 并发送到客户端
- Web 界面将所有新文件附加为列表项(显示缩略图)
- 上传完成
这一切进展顺利,最多 +- 600 张图像或 +- 900MB。这对我来说很好,如果用户想一次上传更多文件,那么分两个阶段进行。问题是,后端处理是个婊子。将 100 多张大小合适的图像(每张 1.5MB)转换为最大尺寸并生成缩略图需要很长时间。我正在用 PHP GD 做这个。没有花费我太多时间(或根本没有时间)来发现问题所在。我的猜测是我无法在 PHP 中加快速度。
所以这里有几个问题:
- ImageMagick 会更快吗?我不是粉丝,所以请不要,我也不想把它安装在我的服务器上那么糟糕..
- 是否有一个非常非常轻量级的命令行程序,只需要几个命令(我知道我不是在暗示 ImageMagick)?
- 如果上一个问题的答案是否定的:最好的方法是什么?不要说Java,我也不是Java的忠实粉丝。一些C(-方言)?最好具有用于最近邻、双线性和双三次插值算法的强大而轻量级的图像库。
- 我的架构可以改变吗?此时,一旦插入缩略图,图像就开始出现在浏览器中,因此在接收到整个 JSON 数组之后,导致整个动作必须完成并生成所有图像数据,然后才能在浏览器中接收到任何类型的反馈。这意味着微调器(没有任何指示该过程将花费多长时间或已完成多少图像)将显示很长时间。使用 Javascripts FileReader 从用户系统预加载图像,在浏览器中生成缩略图并在上传完成后立即显示它们是一个想法吗?而在后端:只是接收文件,将它们写入磁盘,执行命令行命令,立即向浏览器发送响应并在后台转换?
- 如何防止 AJAX 请求的客户端中止事件?上传和转换时,当用户想要关闭页面或尝试更改#hash 时,应显示警告。
谢谢。希望你们能帮助我。正如你所知道的:客户端非常复杂,有很多代码。我宁愿改变后端。