ecshop远程商品详情图片本地化保存到本地的方法
凯芭比童装产品都是凯芭比童装淘宝店导出来的,这就导致了很多图片是淘宝CDN那边的图片。
为了seo着想,我想把淘宝的图片转移到本地。
于是我缕了一下思路。
1,从数据库获取产品详情描述
2,正则找出所有https的图片
3,将图片保存到本地
4,替换https图片为本地图片
5,更新数据库
6,循环上面的操作直到找不到https图片
7,完成
下面我们来看看代码:
< ?php
// 载入配置文件
set_time_limit(0);
include("data/config.php");
// 数据库连接
$link=mysql_connect($db_host,$db_user,$db_pass)or die("connect error");
mysql_select_db($db_name,$link)or die(mysql_error());
mysql_query("set names utf8");
header("Content-type:text/html;charset=utf-8");
// 获取参数
$id=intval($_GET['id']);
// 获取全部产品图片
if($id==0){
$sql="select `goods_id`,`goods_name`,`goods_desc` from `kbb_goods` order by goods_id desc ";
$res=mysql_query($sql);
while($row=mysql_fetch_array($res))
{
$aa="无远程图片";
if(preg_match('/(https:\/\/)/i', $row['goods_desc'])){
$aa="Go Get It";
}
echo "".$row['goods_id']." ".$row['goods_name']." ".$aa."
";
}
exit();
}
// 睡眠一秒
sleep(1);
// 获取单个产品
$sql="select `goods_desc` from `kbb_goods` where `goods_id`='$id' limit 1";
$res=mysql_fetch_array(mysql_query($sql));
// 匹配图片
preg_match_all('/src=[\'|"]([^"|^\']+)[\'|"]/i', $res[0], $picurl);
$urlArr=$picurl[1];
$num= isset($_GET['num']) ? $_GET['num'] : 1;
$all=count($urlArr);
// 获取远程图片链接
$url=$urlArr[$num-1];
// 匹配远程图片
if(!preg_match('/(https:\/\/)/i', $url)){
if($num >= $all) {
exit('
all done!');
}
echo $url."
已处理";
echo "";
exit();
}
// 获取远程图片信息
$array=@get_headers($url,1);
echo "old image:".$url."
";
if(preg_match('/200/',$array[0])){
// 写入缓冲区
ob_start();
readfile($url);
$img = ob_get_contents();
ob_end_clean();
// 创建目录
$dir="images/desc/".$id;
!file_exists($dir)&&mkdir($dir, 0777,true);
// 写入文件
$filename=$dir."/".mt_rand(100000,999999).time().".jpg";
$f=fopen($filename,'a');
$fres=fwrite($f,$img);
fclose($f);
echo "new image:".$filename."
";
// 更新数据库
if($fres!=false){
$goods_desc=str_replace($url,"/".$filename,$res[0]);
$sql="update `kbb_goods` set `goods_desc` = '$goods_desc' where `goods_id`='$id' limit 1 ";
mysql_query($sql);
}
}
// 输出处理张数
echo $num."/".$all;
// 结束处理
if($num >= $all) {
exit('
all done!');
}
else{
echo "";
}
?>
上面的代码在我的商城里面运行很好,我额外加了所有的产品列表来查看是否要替换图片,这样子就比较清楚了。
现在来看一下列表的效果图

然后看一下运行的效果

最后我放弃了这种方法,还是用了淘宝cdn的图片,因为后面产品越来越多,没必要浪费磁盘的空间。
Ecshop解决jQuery和toJSONString()的冲突的办法 php中的匿名函数和闭包函数以及use的用法