Kilig - 学习
type: channel
link: https://moranblog.cn/category/learning.html
items: PHP实现微信推送
items: PHP实现AES-128-ECB加密,Java解密！
items: elasticsearch利用logstash用id增量同步数据库数据
items: Elasticsearch-php学习笔记
items: Elasticsearch的学习笔记（三）
items: Elasticsearch的学习笔记（二）
items: php报think\response\finfo_open()错误解决
items: Elasticsearch的学习笔记（一）
items: PHP之PhpSpreadsheet 的使用
items: 宝塔安装git，实现实时更新服务器代码

PHP实现微信推送
type: item
date: 2022-12-04T23:03:00+08:00
description: 前段时间我大学的辅导员过生日，实在不知道送她什么了，然后看到在网上看到最近很火的微信推送，就想着送这个给她把，他最喜欢明星就周杰伦、李健、玄彬等，每天都会随机推送一张图片给她，还有每天随机一首个的名称，最终效果是这样的：点击详情就可以看到那几个明星中的随机一张图片。下面分享的则是去掉了这些功能的：PHP代码为：index.php文件为：<?php /* * @Descripttion: 微信推送 * @version: 1.0 * @Author: 默然 * @Date: 2022-10-04 01:35:27 * @LastEditors: 默然 * @LastEditTime: 2022-10-05 08:00:33 */ include_once "function.php"; /** 微信公众号信息配置 */ $WXconfig = array( 'app_id' => '1', //公众号appId 'app_secret' => '1', //公众号appSecret 'touser' => '1', //公众号appSecret 'template_id' => '1', //公众号appSecret ); //获取access_token $url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=" . $WXconfig['app_id'] . "&secret=" . $WXconfig['app_secret']; $returnJson = json_decode(curl_http($url), true); $token = $returnJson["access_token"]; if (!$token) { $return = array( "code" => $returnJson['errcode'], "msg" => "获取access_token失败，请检查app_id和app_secret是否正确", ); exit(json_encode($returnJson)); } //获取天气预报的所有信息 $weatherinfo = getweather(0); //发送消息 $url = "https://api.weixin.qq.com/cgi-bin/message/template/send?access_token=" . $token; $posts = array( "touser" => $WXconfig['touser'], "template_id" => $WXconfig['template_id'], "url" => "", "topcolor" => getcolor(), "data" => array( "date" => array( "value" => "今天是" . date("Y年m月d日", time()) . $weatherinfo["week"], "color" => getcolor(), ), "region" => array( "value" => "昆明市", "color" => getcolor(), ), "weather" => array( "value" => $weatherinfo["weather"], "color" => getcolor(), ), "high" => array( "value" => $weatherinfo["high"], "color" => getcolor(), ), "low" => array( "value" => $weatherinfo["low"], "color" => getcolor(), ), "fortoday" => array( "value" => $weatherinfo["notice"], "color" => getcolor(), ), "vhanzh" => array( "value" => getian()[0]["mingrenmingyan"], "color" => getcolor(), ), "zhufu" => array( "value" => $zhufu, "color" => getcolor(), ), ), ); $rs = curl_http($url, 1, $posts); echo $rs; function.php文件为：<?php /* * @Descripttion: 公共方法合集 * @version: 1.0 * @Author: 默然 * @Date: 2022-10-04…

PHP实现AES-128-ECB加密,Java解密！
type: item
date: 2022-12-03T15:23:59+08:00
description: 前段时间做云后台管理系统的时候，群友一直说需要接口加密，所以就看了一下相关方面的代码，话不多说，直接上代码：PHP加密解密方法： /** * 加密字符串 * * @param [type] $input 加密字符串 * @param [type] $securityKey 密钥 */ public static function WeDoctorEncrypt($input, $securityKey) { //进行Aes加密 $data = openssl_encrypt($input, 'AES-128-ECB', $securityKey); return urlencode($data); } /** * 解密字符串 * * @param [type] $input 解密字符串 * @param [type] $securityKey 密钥 */ public static function WeDecrypt($input, $securityKey) { $input = urldecode($input); $input = openssl_decrypt($input, 'AES-128-ECB', $securityKey); if (!$input) { return self::returnjson(400, "服务器错误"); } return $input; } /** * 密钥生成方法 * * @return string */ function getRandChar() { $str = null; $strPol = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789abcdefghijklmnopqrstuvwxyz"; $max = strlen($strPol) - 1; for ($i = 0; $i < 16; $i++) { $str .= $strPol[rand(0, $max)]; } return $str; }接下来我们写个方法测试一下： public function test() { //需加密的字符串 $str = "www.moranblog.cn"; echo "原始字符串：".$str; echo " "; //进行加密 $en_str = Common::WeDoctorEncrypt($str,"LwbPsFsjYyWorEdD"); echo "加密后：". $en_str; echo " "; //进行解密 echo "解密后：". Common::WeDecrypt($en_str,"LwbPsFsjYyWorEdD"); }最终结果：接下来说一下java 的加解密方法：import java.util.Base64; import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; public class AES { /** * 加密算法 * * @param sSrc 加密字符串 * @param sKey 密钥 * @return * @throws Exception */ public static String Encrypt(String sSrc, String sKey) throws Exception { if (sKey == null) { System.out.print("Key为空null"); return null; } // 判断Key是否为16位 if (sKey.length() != 16) { System.out.print("Key长度不是16位"); return null; } byte[] raw = sKey.getBytes("utf-8"); SecretKeySpec skeySpec = new SecretKeySpec(raw, "AES"); Cipher cipher = Cipher.getInstance("AES/ECB/PKCS5Padding"); // "算法/模式/补码方式" cipher.init(Cipher.ENCRYPT_MODE, skeySpec); byte[] encrypted = cipher.doFinal(sSrc.getBytes("utf-8")); String result = Base64.getEncoder().encodeToString(encrypted); return java.net.URLEncoder.encode(result, "UTF-8"); // 此处使用BASE64做转码功能，同时能起到2次加密的作用。 …

elasticsearch利用logstash用id增量同步数据库数据
type: item
date: 2022-06-06T11:18:00+08:00
description: 安装好后在bin目录下新建mysql.conf，配置一下内容：input { jdbc { # mysql数据库连接 jdbc_connection_string => "jdbc:mysql://127.0.0.1:3306/esdemo?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai" # mysqly用户名和密码 jdbc_user => "root" jdbc_password => "123456" # 驱动配置 jdbc_driver_library => "D:\elasticsearch\logstash-8.2.0\mysql-connector-java-5.1.7-bin.jar" # 驱动类名 jdbc_driver_class => "com.mysql.jdbc.Driver" # 数据库重连尝试次数 connection_retry_attempts => "3" # 判断数据库连接是否可用，默认false不开启 jdbc_validate_connection => "true" # 数据库连接可用校验超时时间，默认3600S jdbc_validation_timeout => "3600" # 开启分页查询（默认false不开启）； jdbc_paging_enabled => "true" # 单次分页查询条数（默认100000,若字段较多且更新频率较高，建议调低此值）； jdbc_page_size => "50000" # statement为查询数据sql，如果sql较复杂，建议配通过statement_filepath配置sql文件的存放路径； # sql_last_value为内置的变量，存放上次查询结果中最后一条数据tracking_column的值，此处即为ModifyTime； # 执行指定的sql文件 #statement_filepath => "D:\service\logstash-7.7.0\mysql\sql\fa_search.sql" #执行的sql语句 statement => "SELECT * FROM syshl1 where id > :sql_last_value order by id asc" # 是否将字段名转换为小写，默认true（如果有数据序列化、反序列化需求，建议改为false）； lowercase_column_names => false # Value can be any of: fatal,error,warn,info,debug，默认info； sql_log_level => warn # 是否记录上次执行结果，true表示会将上次执行结果的tracking_column字段的值保存到last_run_metadata_path指定的文件中； record_last_run => true # 需要记录查询结果某字段的值时，此字段为true，否则默认tracking_column为timestamp的值； use_column_value => true # 需要记录的字段，用于增量同步，需是数据库字段 tracking_column => "id" #追踪字段的类型，目前只有数字(numeric)和时间类型(timestamp)，默认是数字类型() tracking_column_type => "numeric" # record_last_run上次数据存放位置； last_run_metadata_path => "D:\elasticsearch\logstash-8.2.0\last_id.txt" # 是否清除last_run_metadata_path的记录，需要增量同步时此字段必须为false； clean_run => false # 设置监听 各字段含义 分 时 天 月 年 ，默认全部为*代表含义：每分钟都更新 schedule => "* * * * *" # 索引类型 #type => "blog" } } filter { json { source => "message" remove_field => ["message"] } } output { elasticsearch { #es服务器 hosts => ["localhost:9200"] #ES索引名称 index => "syshl" #自增ID document_id => "%{id}" } stdout { codec => json_lines } }然后通过 logstash -f bin/mysql.conf 去启动；成…

Elasticsearch-php学习笔记
type: item
date: 2022-05-12T17:30:00+08:00
description: 连接Elasticsearch这里采用集群的方式，所以需要启动多个Elasticsearch实例。$parms = [ "localhost:1001", "localhost:1002", "localhost:1003", ]; //连接elasticsearch $this->client = \Elasticsearch\ClientBuilder::create()->setHosts($parms)->build;创建索引$params = [ 'index' => 'user', 'body' => [ 'settings' => [ 'number_of_shards' => 3, 'number_of_replicas' => 2 ] ] ] echo json_encode($this->client->indices()->create($params));返回结果：{ "acknowledged": true, //索引是否创建成功 "shards_acknowledged": true, //分片是否创建成功 "index": "user" //索引名称 }删除索引$params = [ 'index' => 'user', ]; echo json_encode($this->client->delete($params));返回结果：{ "acknowledged": true //确认是否删除成功 }获取文档$params = [ 'index' => 'user', //索引名称 'type' => 'user', //类型名称 'id' => '1', ]; echo json_encode($this->client->get($params));返回结果：{ "_index": "user", //索引名称 "_type": "user", //类型名称 "_id": "1", //文档id "_version": 2, //版本号 "_seq_no": 30, //序列号 "_primary_term": 1, //主键 "found": true, //是否找到 "_source": { //文档内容 "uid": 1, "username": "test", "signature": "test", "phone": "13276535811", "money": "100", "address": "天津 天津市 东丽区", "create_time": 1652340350 } }修改文档$params = [ 'index' => 'user', //索引名称 'type' => 'user', //类型名称 'id' => '1', //文档id 'body' => [ //文档内容 'uid' => 1, 'username' => 'test', 'signature' => 'test', 'phone' => '13276535811', 'money' => '100', 'address' => '天津 天津市 东丽区', 'create_time' => time(), ], ]; echo json_encode($this->client->index($params));返回结果：{ "_index": "user", //索引名称 "_type": "user", //类型名称 "_id": "1", //文档id "_version": 2, //版本号 "result": "updated", //操作结果 "_shards": { "total": 3, //分片总数 "successful": 3, //成功数 "failed": 0 //失败数 }, "_seq_no": 30, //操作序列号 "_primary_term": 1 //主分片的term }搜索文档Match 查询$params = [ 'index' => 'user', //索引名称 'type' => 'user', //类型名称 'body' => [ 'query' => [ 'match' => [ 'username' => 'test', ], ], ], ]; echo json_encode($this->client->search($params));返回结果：{ "took": 23, //查询耗时 "timed_out": false, //是否超时 "_shards": { //分片信息 "total": 3, //分片总数 "successful": 3, //成功数 "skipped": 0, //跳过数 "failed": 0 //失败数 …

Elasticsearch的学习笔记（三）
type: item
date: 2022-04-27T11:44:04+08:00
description: 条件查询查询指定字段GET http://localhost:9200/shopping/_search查询所有数据，只显示字段title和price请求体：{ "query":{ "match_all":{} }, "_source":["title","price"] }返回结果：{ "took": 3, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 9, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "shopping", "_type": "_doc", "_id": "kq3nZIAB6CX3m_v3APT6", "_score": 1, "_source": { "price": 3999, "title": "小米手机" } }, { "_index": "shopping", "_type": "_doc", "_id": "k63tZIAB6CX3m_v3vfQI", "_score": 1, "_source": { "price": 3999, "title": "小米手机" } }, { "_index": "shopping", "_type": "_doc", "_id": "l636ZIAB6CX3m_v3q_R5", "_score": 1, "_source": { "price": 1999, "title": "华为手机" } }, { "_index": "shopping", "_type": "_doc", "_id": "ma37ZIAB6CX3m_v3BvQc", "_score": 1, "_source": { "price": 1999, "title": "华为手机" } }, { "_index": "shopping", "_type": "_doc", "_id": "n60KZYAB6CX3m_v3q_Tc", "_score": 1, "_source": { "price": 3999, "title": "小米手机" } }, { "_index": "shopping", "_type": "_doc", "_id": "oK0KZYAB6CX3m_v3rfQs", "_score": 1, "_source": { "price": 3999, "title": "小米手机" } }, { "_index": "shopping", "_type": "_doc", "_id": "oa0KZYAB6CX3m_v3rvS_", "_score": 1, "_source": { "price": 3999, "title": "小米手机" } }, { "_index": "shopping", "_type": "_doc", "_id": "oq0KZYAB6CX3m_v3sPQR", "_score": 1, "_source": { "price": 3999, "title": "小米手机" } }, { "_index": "shopping", "_type": "_doc", "_id": "o60KZYAB6CX3m_v3sfT8", "_score": 1, "_source": { "price": 3999, "title": "小米手机" } } ] } }分页查询GET http://localhost:9200/shopping/_search请求体：{ "query":{ "match_all":{} }, "from":0, "size":2 }返回结果：{ "took": 2, "timed_out": false, "_shards": { "total": 1, "successful": 1, "skipped": 0, "failed": 0 }, "hits": { "total": { "value": 9, "relation": "eq" }, "max_score": 1, "hits": [ { "_index": "shopping", "_type": "_doc", "_id": "kq3nZIAB6CX3m_v3APT6", "_score": 1, "_source": { "title": "小米手机", "category": "小米", "images": "http://www.gulixueyuan.com/xm.jp…

Elasticsearch的学习笔记（二）
type: item
date: 2022-04-26T17:26:00+08:00
description: 数据格式Elasticsearch是面向文档型数据库，一条数据在这里就是一个文档。 为了方便大家理解，我们将 Elasticsearch 里存储文档数据和关系型数据库 MySQL 存储数据的概念进行一个类比ES 里的 Index 可以看做一个库，而 Types 相当于表， Documents 则相当于表的行。这里 Types 的概念已经被逐渐弱化， Elasticsearch 6.X 中，一个 index 下已经只能包含一个type， Elasticsearch 7.X 中, Type 的概念已经被删除了。创建索引PUT http://localhost:9200/shopping{ "acknowledged": true, "shards_acknowledged": true, "index": "shopping" }查看当前索引GET http://localhost:9200/shopping{ "shopping": {//索引名 "aliases": {},//别名 "mappings": {},//映射 "settings": {//设置 "index": {//设置 - 索引 "creation_date": "1650959730840",//设置 - 索引 - 创建时间 "number_of_shards": "1",//设置 - 索引 - 主分片数量 "number_of_replicas": "1",//设置 - 索引 - 主分片数量 "uuid": "Y2GAupofQFiHc5nsAlDe1w",//设置 - 索引 - 主分片数量 "version": {//设置 - 索引 - 主分片数量 "created": "7080099" }, "provided_name": "shopping"//设置 - 索引 - 主分片数量 } } } }查看当前ES中所有的索引GET http://localhost:9200/_cat/indices?vhealth status index uuid pri rep docs.count docs.deleted store.size pri.store.size yellow open shopping Y2GAupofQFiHc5nsAlDe1w 1 1 0 0 208b 208b表头含义health当前服务器健康状态： green(集群完整) yellow(单点正常、集群不完整) red(单点不正常)status索引打开、关闭状态index索引名uuid索引统一编号pri主分片数量rep副本数量docs.count可用文档数量docs.deleted文档删除状态（逻辑删除）store.size主分片和副分片整体占空间大小pri.store.size主分片占空间大小删除索引DELETE http://localhost:9200/shopping{ "acknowledged": true }增加文档POST http://localhost:9200/shopping/_doc请求体JSON内容为：{ "title":"小米手机", "category":"小米", "images":"http://www.gulixueyuan.com/xm.jpg", "price":3999.00 }注意，此处发送请求的方式必须为 POST，不能是 PUT，否则会发生错误 。返回结果：{ "_index": "shopping", "_type": "_doc", "_id": "k63tZIAB6CX3m_v3vfQI", "_version": 1, "result": "created", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 3, "_primary_term": 1 }上面的数据创建后，由于没有指定数据唯一性标识（ID），默认情况下， ES 服务器会随机生成一个。如果想要自定义唯一性标识，需要在创建时指定： http://127.0.0.1:9200/shopping/_doc/1001，这样就可以指定 ID 为 1001 。{ "_index": "shopping", "_type": "_doc", "_id": "1001", //自定义唯一ID标识 "_version": 3, "result": "updated", "_shards": { "total": 2, "successful": 1, "failed": 0 }, "_seq_no": 4, "_primary_term": 1 }此处需要注意：如果增加数据时明确数据主键，那么…

php报think\response\finfo_open()错误解决
type: item
date: 2022-04-21T13:41:00+08:00
description: 今天弄自己项目的时候，本地全部正常，当我部署到服务器上的时候就报了这样的错误，致命错误: Call to undefined function think\response\finfo_open()后面排查了一下，原来是服务的php扩展没安装，我用的宝塔，所以就说下宝塔怎么安装！我们先看一下项目的php版本，然后去软件商店找到相对应的php版本点开设置，安装这个fileinfo这个扩展然后项目就正常了！！

Elasticsearch的学习笔记（一）
type: item
date: 2022-04-13T11:46:00+08:00
description: 今天早上来公司，就开始了学习elasticsearch，结果万万没想到，直接是一波三折呀，才把这个启动起来。先从官网下载压缩包解压后得到这几个文件夹详解：目录名称介绍bin二进制脚本，包含启动命令和安装插件命令等config配置文件目录lib依赖包目录logs日志文件目录modules模块库plugins插件目录data数据储存目录然后点击启动bin目录下的elasticsearch.bat启动，然后我的就变成了这样就一直再解决，最后修改了elasticsearch.yml才得以成功访问修改配置注意：9300端口为Elasticsearch集群间组件的通信端口，9200端口为浏览器访问的http协议RESTful端口。把有几个的true改为false就OK了最后来安装个插件试试安装插件我们先来看看有无插件（本机）执行命令 elasticsearch-plugin list然后安装个analysis-icu插件试试执行 elasticsearch-plugin install analysis-icu这样就安装成功了再来用哪个list命令浏览器查看（http://127.0.0.1:9200/_cat/plugins）好了 完了 继续学习！！！

PHP之PhpSpreadsheet 的使用
type: item
date: 2022-04-07T15:58:00+08:00
description: 今天看了下PhpSpreadsheet 的使用，以前只看过phpExcel相关的，这里的数据全是随机生成的，生成代码在下方,不必要看代码，就一个思路，哈哈哈，大佬绕过！连接数据库(conn.php)<?php $servername = "localhost"; $username = "root"; $password = "123456"; $database = "hotel"; // 创建连接 $conn = mysqli_connect($servername, $username, $password, $database); // 检测连接 if ($conn->connect_error) { die("连接失败: " . $conn->connect_error); } //echo "连接成功"; 首页(index.php)<?php require_once "./conn.php"; ?> 首页 导出 导入 序号 账号 姓名 年龄 性别 创建时间 <?php $sql = "select * from test"; $result = mysqli_query($conn,$sql); while ($rows = mysqli_fetch_array($result)) { echo " $rows[0] "; echo " $rows[1] "; echo " $rows[2] "; echo " $rows[3] "; echo " $rows[4] "; echo " $rows[5] "; } ?> 生成名字(name.php)用了某个大老的 翻不到谁的了 等我再找找 找到补上连接<?php class rndChinaName { private $arrXing, $numbXing; private $arrMing, $numbMing; function rndChinaName() { $this->getXingList(); $this->getMingList(); } /* 获取姓列表 */ private function getXingList() { $this->arrXing = array( '赵', '钱', '孙', '李', '周', '吴', '郑', '王', '冯', '陈', '褚', '卫', '蒋', '沈', '韩', '杨', '朱', '秦', '尤', '许', '何', '吕', '施', '张', '孔', '曹', '严', '华', '金', '魏', '陶', '姜', '戚', '谢', '邹', '喻', '柏', '水', '窦', '章', '云', '苏', '潘', '葛', '奚', '范', '彭', '郎', '鲁', '韦', '昌', '马', '苗', '凤', '花', '方', '任', '袁', '柳', '鲍', '史', '唐', '费', '薛', '雷', '贺', '倪', '汤', '滕', '殷', '罗', '毕', '郝', '安', '常', '傅', '卞', '齐', '元', '顾', '孟', '平', '黄', '穆', '萧', '尹', '姚', '邵', '湛', '汪', '祁', '毛', '狄', '米', '伏', '成', '戴', '谈', '宋', '茅', '庞', '熊', '纪', '舒', '屈', '项', '祝', '董', '梁', '杜', '阮', '蓝', '闵', '季', '贾', '路', '娄', '江', '童', '颜', '郭', '梅', '盛', '林', '钟', '徐', '邱', '骆', '高', '夏', '蔡', '田', '樊', '胡', '凌', '霍', '虞', '万', '支', '柯', '管', '卢', '莫', '柯', '房', '裘', '缪', '解', '应', '宗', '丁', '宣', '邓', '单', '杭', '洪', '包', '诸', '左', '石', '崔', '吉', '龚', '程', '嵇', '邢', '裴', '陆', '荣', '翁', '荀', '于', '惠', '甄', '曲', '封', '储', '仲', '伊', '宁', '仇', '甘', '武', '符', '刘', '景', '詹', '龙', '叶', '幸', '司', '黎', '溥', '印', '怀', '蒲', '邰', '从', '索', '赖', '卓', '屠', '池', '乔', '胥', '闻', '莘', '党', '翟', '谭', '贡', …

宝塔安装git，实现实时更新服务器代码
type: item
date: 2022-03-31T21:54:00+08:00
description: 这几天一直在更新默然iapp后台管理系统，群友们都说弄个在线更新，一直没有思路，后面想到我就是利用git上传的呀，服务端也可以用git呀，然后就有了这篇文章。一、服务端安装gityum install -y git接下来，我们来验证下安装成功没，直接输入git就可以了出现上面这个就是安装成功了这样查看版本号git version配置git信息接下来配置自己的git信息git config --global user.name "your name" git config --global user.email "you email"我们必须创建公钥才能拉去里面的代码ssh-keygen -C "your email" -t rsa一直回车就可以了然后这样查看公钥cat /root/.ssh/id_rsa.pub把公钥复制，配置到gitee上gitee位置：配置完后可以用这个命令测试下：ssh -T git@gitee.com这样就配置完成了，是不是很简单呢，那下面我们来拉代码！git clone https://gitee.com/morannb/moranht.git然后把刚才下载的源码所有文件移动到你的站点目录下，liunx服务器切换目录到站点目录下输入git pull如果gitee端没有任何更新，则向先下面这样有更新的话，则是下图：好了 大功完成了 记住一定不能删除.git文件夹以后直接输入git pull 就完成更新了 记得一定要在有.git那个目录下，但是也有弊端，要重新输入账号密码