背景
近期发现,网站上的部分图片无法显示, 分析发现,是因为引用的第三方网站图片(第三方服务器证书已过期) 想着以后显示的方便 直接抓取第三方服务器图片,转存到本地服务器 思路
1. 查询数据表,确认待转存的图片链接
2. 代码抓取图片,转存到本地服务器的一个指定目录中
3. 使用 redis 集合,存储已操作的图片链接,避免后续重复抓取
4. 更改数据表 存储记录,替换链接
代码参考
以链接:https://pic2.zhimg.com/gift/v2-8d3f288feae0e511dee5c3d6735ca999_r.jpg
为例
public function grabImages ( $url = '' ) {
$start_str = 'https://' ;
$file_name = explode ( '/gift/' , $url ) [ 1 ] ?? '' ;
if ( strpos ( $url , $start_str ) === 0 ) {
$redis_key = 'mz_uu_b1b_images' ;
$isMember = Redis :: sIsMember ( $redis_key , $file_name ) ;
if ( $isMember ) {
logger ( ) -> warning ( '已存在:' . $file_name ) ;
} else {
$_set = [ 'verify' => false , 'http_errors' => false ] ;
$client = new Client ( $_set ) ;
$response = $client -> get ( $url ) ;
$contents = $response -> getBody ( ) -> getContents ( ) ;
$localPath = "uub1b/{ $file_name } " ;
Storage :: put ( $localPath , $contents ) ;
Redis :: sAdd ( $redis_key , $file_name ) ;
logger ( ) -> warning ( '已抓取:' . $url ) ;
}
}
}
数据表,记录替换更新
UPDATE cms_igoods
SET img = CASE
WHEN INSTR( img, 'https://xx.mix.com/pointshopproduct/gift' ) > 0 THEN REPLACE ( img, 'https://xx.mix.com/pointshopproduct/gift' , 'uub1b_img' )
ELSE img
END
WHERE integralgoodid > 0 ;