ThinkPHP使用CDN加速不显示图片

2016-12-14 写技术

如果你在用thinkPHP做东西,并且又用到了七牛之类的CDN加速方案,那么你应该会碰到这种情况:

当你在一个文章上传了一张图片,图片能正常显示到前端页面,当你在另一个文章又上传了同一张图片,这个时候当前文章的图片能正常显示,可是之前的那文章的图片却不见了。这是怎么加速呢?

其实是因为thinkPHP对图片有指纹验证功能,同样的图片不会二次上传,这其中的指纹识别是记录到数据库中的。当系统通过这种技术检测到图片已经存在的时候,会进一步判断图片实际文件是否真实存在,如果不存在就把数据库里面当前图片记录删除。

那么问题来了,当你上传图片是存到CDN服务器上的,本地图片其实是不存在的,或者等着你到CDN上同步过来,于是在这种情况下你再上传一张同样的图片,就会把之前的图片记录删除,这导致了之前图片的丢失。

这一切发生在如下文件:

ThinkPHP/Library/Think/Upload.class.php

            /* 调用回调函数检测文件是否存在 */
            $data = call_user_func($this->callback, $file);
            if( $this->callback && $data ){
                if ( file_exists('.'.$data['path'])  ) {
                    $info[$key] = $data;
                    continue;
                }elseif($this->removeTrash){
                    call_user_func($this->removeTrash,$data);//删除垃圾据
                }
            }

解决也很简单:

            /* 调用回调函数检测文件是否存在 */
            $data = call_user_func($this->callback, $file);
            if( $this->callback && $data ){
				/* Net file url have no file in local path */
                if ( file_exists('.'.$data['path']) || file_get_contents($data['url'], 0, null, 0, 1)  ) {
                    $info[$key] = $data;
                    continue;
                }elseif($this->removeTrash){
                    call_user_func($this->removeTrash,$data);//删除垃圾据
                }
            }

就这样,不会因为本地没有实际图片而被删除记录了。

标签: php

发表评论:

Powered by anycle 湘ICP备15001973号-1