TPImageWater 是ThinkPHP扩展的用来自动化为已经上传部分图片加水印的应用

之前结合ThinkPHP的图片处理类,写了TPImageWater,用来为已经上传的图片自动增加响应式水印,更多可以了解一下我之前写的三篇文章,分别是:

1、ThinkPHP为已经上传的图片添加水印的插件【原始版本】

2、ThinkPHP自动化为已经上传的图片添加「 响应式」水印(文件遍历部分)

3、ThinkPHP自动化为已经上传的图片添加「 响应式」水印(数据库字段部分)

源代码在git@osc以及github都有,可以自行去查看。

这里主要说一下实际使用过程中遇到的问题以及解决办法。

主要问题

我处理的图片数量为5000张,其中是通过日期创建文件夹的方式进行存放的,因为客户仅仅需要将产品的图片进行加水印,因此我后面想了利用数据库字段读取图片存取的位置,来进行图片的水印的操作,具体的实现这里就不在重复了,其中遇到的问题我在之前也提到过,http请求时间是有一定限制的,因此我在线处理的时候很明显发生了响应时间过长的问题,中断响应,这就导致图片的水印是不能完全加上去的,而再次刷新就会造成重复添加水印的后果。(还好我备份了图片,万能的备份是无敌的)

我第二篇文章已经提到过,需要设置php最大运行时间为0,也就是无限制,但是这是在本地的解决策略,http请求服务器是一定会处理超时问题的,除非进行服务器的配置。

因为条件限制,我无法对服务器本身进行相关配置的更改,但是我对于数据库是有操作权限的,当然我肯定有ftp权限。

根据实际情况,我想出了两种比较好的解决措施。

解决措施

一、将所有的图片文件通过ftp拖到本地(我拖7000张图片用了不到20分钟),然后在本地离线解决该问题,离线解决完成后,将图片重新传回服务器(时间也是20分钟),这样做的好处就是能够保证图片在本地处理不会中断,另外备份问题也能得到很好地解决,不会因为意外情况造成图片丢失或水印出问题。

二、当然在本地的处理也可能发生意外,保留一个备份文件是不错的选择。不过我后面想到既然要对数据库进行操作,那我在需要处理的表的后面加了一个字段,[ waterFlag , 默认为0 不能为空 ],这个字段只有两个取值,0,或者1,为了保证图片是进行过水印处理的,从数据库读出图片,处理结束后就将该字段置1即可,这样子每次判断只有是0才进行图片的水印处理。而代码实际上不需要做很大的改动。

因为我之前刻意留出自己可以自定义操作的部分,因此在进行图片sql读出并处理的过程中,是不需要进行很大的代码改动的(当然,你可以重新来根据情况编写)。

waterimagesql

这样子处理即使是在线的水印添加, 也能避免因为重复添加水印而使得水印的透明效果消失。

目前我能想到的处理就是这样比较好的,如果图片实在很多比如W张级别的,还是建议能够通过ftp工具将图片拖到本地,进行本地的处理,这样子对于防止出现问题是比较好的策略。

如果有人能够解决php的并发或者是提高处理速度的问题,欢迎联系我,不胜感激!