我的博客图片一直是放新浪微博图床的,微博图床不但全国访问很快,还不用走自己网站的流量。真是最理想的图床。为了方便使用我曾经做过一键裁图加水印并上传至新浪微博的自动化图床工具。
最近经大佬提醒,说新浪图床由于免费,且主动权掌握在新浪手中,随时会有翻车的可能。所以说以对抱着自己负责的态度,还是决定要防患于未然,将全站的外链图片进行统一备份!
由于之前从未进行过图片备份,所以外链图片都散落于各个文章之中,一张张找出来备份显示不现实。于是就计划用PHP实现读取WordPress数据库,用正则获取所有外链图片并且将图片保存至本地。
实现代码如下:
安装数据库读写插件
由于要读写数据库,为了代码简化,且防止SQL注入,选择了第三方类库Medoo进行数据库读写操作。
1.通过composser安装
#安装Medoo composer require catfan/Medoo #引用Medoo require 'vendor/autoload.php';
2.下载medoo.php并引用
下载地址:https://github.com/catfan/Medoo/archive/master.zip
#引用Medoo require 'Medoo.php';
初始化数据库
由于是直接读取WordPress数据库,所以直接引入WordPress的配置文件
require 'wp-config.php'; // Using Medoo namespace use Medoo\Medoo; $database = new Medoo([ 'database_type' => 'mysql', 'database_name' => DB_NAME, 'server' => DB_HOST, 'username' => DB_USER, 'password' => DB_PASSWORD, 'charset' => DB_CHARSET ]);
PHP下载文件
function dlfile($file_url) { //引用全局变量,文件夹保存位置,须有777权限 global $savePath; //根据要下载文件路径整合存放路径 //如https://img.yantuz.cn/2018/yantuz.png将存放于/img.yantuz.cn/2018/yantuz.png $save_to = $savePath.preg_replace('/http(s?):\/\//','',$file_url); $save_to_arr = explode("/",$save_to); $save_to_path = str_replace(end($save_to_arr),'',$save_to); //如果文件夹不存在则创建 if(!file_exists($save_to_path)){ mkdir($save_to_path,0777,true); } //如果文件不存在则下载并保存 if(is_dir($save_to_path) && !file_exists($save_to)){ $content = file_get_contents($file_url); file_put_contents($save_to, $content); } }
外链图片正则
我的正则是/(http(s?)+:\/\/((?!yanzuz)\w|\.|\/|-|_)+?(jpg|jpeg|gif|png))"/i
http(s?)
表示是http或https开头((?!yanzuz)\w|\.|\/|-|_)+?
表示构成图片URL的所有元素,包括大小写字母 . / – _(jpg|jpeg|gif|png)
表示以所有图片格式结尾- 最后的
i
表示该正则是不区分大小写的
查询数据库并下载匹配到的图片
//查询wp_posts表的post_content字段,筛选条件为post_status=publish $contents = $database->select($tbPosts, [ "post_content" ],[ 'post_status'=>'publish' ]); //遍历图片并下载 foreach($contents as $con){ preg_match_all($imgRegex, $con['post_content'], $matches); foreach($matches[1] as $key=>$img){ if($key >0){ dlfile($img);//调用下载方法 } } }
完整代码下载
https://github.com/yhf7952/myCode/blob/master/WP_Db/scanSinaImg.php
添加定时任务
#编辑定时任务
crontab -e
#添加一行,如每天23:00执行
00 23 * * * /usr/local/php/bin/php /wwwroot/yantuz.cn/scanSinaImg.php
注意:定时任务中必须要用绝对路径,如php的绝对路径为/usr/local/php/bin/php
如果php文件中有引用相对路径如:
require '../wp-config.php';
应改为require dirname(__FILE__).'/../wp-config.php';