range

If there were you, the world would be just right

<?php

$db = new ran_pdo("qx_yisdk_user",true); 

$tables = [
    "yisdk_user",
];

foreach ($tables as $tab) {
    $count_sql = 'select count(*) c from yisdk_user where last_login_time>=1602518400 and uuid!=MD5(concat("new_",CONCAT_WS("_",channel,pf_game_id,user_id)))'; 

    $row = $db->get_one($count_sql);
    // 需要执行的条数
    $count = !empty($row["c"]) ? $row["c"] : 0;

    // 每次执行的条数 1000
    $do_num = 100;

    // 需要执行的次数
    $dc = ceil($count/$do_num);

    if($dc) for ($i=0; $i < $dc; $i++) { 
        $p = $i * $do_num;
        $sql = "select uuid,MD5(concat('new_',CONCAT_WS('_',channel,pf_game_id,user_id))) as new_uuid from yisdk_user where last_login_time>=1602518400 and uuid!=MD5(concat('new_',CONCAT_WS('_',channel,pf_game_id,user_id))) limit {$p},{$do_num}";

        $data = $db->get_all($sql);

        $update_sql = "UPDATE {$tab} a JOIN  (";
        $k = 0;
        foreach ($data as $key => $val) {

                $k = 1;
                $update_sql .= " SELECT '{$val['uuid']}' as uuid,'{$val['new_uuid']}' AS new_uuid UNION";

        }

        $sql = rtrim($update_sql,"UNION"); 
        $sql .= ") b USING(uuid) SET a.uuid=b.new_uuid";
        echo $sql;die;
        if($k){
            $db->query($sql);
        }
        sleep(1);
    }
}

可生成泛域名ssl网站

https://freessl.cn/
1 选择多域名通配符
2 选择浏览器方式生成

证书过期时间检查demo

<?php
$g = stream_context_create ([
    "ssl" => ["capture_peer_cert" => true],
    'http' => [
          'method' => 'GET',
        'user_agent' => 'shouwang.io ssl detector',
        'timeout'=>10
    ]
]);
$r = fopen("https://range8.cn/", "rb", false, $g);
$cont = stream_context_get_params($r);
$cert = openssl_x509_parse($cont["options"]["ssl"]["peer_certificate"]);

if(empty($cert['validTo_time_t'])) {
    throw new \Exception("Can't get cert expire time");
}

$fortyEightHours = strtotime("+48 hours");
if($cert['validTo_time_t'] <= $fortyEightHours) {
    throw new \Exception("Cert will expire in 48 hours");
} else {
    echo "证书过期时间:", date("Y-m-d H:i:s", $cert['validTo_time_t']);
}

分布式架构的演变过程

1.单机负载
2.单机负载越来越高,数据库服务器和应用服务器分离
3.利用缓存改善网站性能
4.利用集群改善应用服务器性能
5.数据库压力变大,数据库读写分离
6.使用Nosql和搜索引擎缓解读库压力
7.使用cdn和反向代理提高网站性能
8.将应用服务器进行业务拆分
9.数据库水平、垂直拆分
10.服务拆分

什么是分布式

对项目进行分层分割拆分,最终分布在不同服务器上

分布式和集群的区别

分布式:一个业务分布成多个子系统,部署在不同的服务器上
集群: 同一个业务,部署在多个服务器上。做的都是同样的事

分布式和微服务的区别

微服务是分布式的一种实现方式
微服务关注的是分布式中的服务环节,而分布式是关注整个系统闭环

阅读剩余部分...


记录一个代码文件加密算法

function RandAbc($length = "")
{ // 返回随机字符串
    $str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
    return str_shuffle($str);
}

$filename = 'getuser.php'; //要加密的文件
$T_k1 = RandAbc(); //随机密匙1
$T_k2 = RandAbc(); //随机密匙2
$vstr = file_get_contents($filename);
$v1 = base64_encode($vstr);
$c = strtr($v1, $T_k1, $T_k2); //根据密匙替换对应字符。
$c = $T_k1 . $T_k2 . $c;
$q1 = "O00O0O";
$q2 = "O0O000";
$q3 = "O0OO00";
$q4 = "OO0O00";
$q5 = "OO0000";
$q6 = "O00OO0";
$s = '$' . $q6 . '=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");$' . $q1 . '=$' . $q6 . '{3}.$' . $q6 . '{6}.$' . $q6 . '{33}.$' . $q6 . '{30};$' . $q3 . '=$' . $q6 . '{33}.$' . $q6 . '{10}.$' . $q6 . '{24}.$' . $q6 . '{10}.$' . $q6 . '{24};$' . $q4 . '=$' . $q3 . '{0}.$' . $q6 . '{18}.$' . $q6 . '{3}.$' . $q3 . '{0}.$' . $q3 . '{1}.$' . $q6 . '{24};$' . $q5 . '=$' . $q6 . '{7}.$' . $q6 . '{13};$' . $q1 . '.=$' . $q6 . '{22}.$' . $q6 . '{36}.$' . $q6 . '{29}.$' . $q6 . '{26}.$' . $q6 . '{30}.$' . $q6 . '{32}.$' . $q6 . '{35}.$' . $q6 . '{26}.$' . $q6 . '{30};eval($' . $q1 . '("' . base64_encode('$' . $q2 . '="' . $c . '";eval(\'?>\'.$' . $q1 . '($' . $q3 . '($' . $q4 . '($' . $q2 . ',$' . $q5 . '*2),$' . $q4 . '($' . $q2 . ',$' . $q5 . ',$' . $q5 . '),$' . $q4 . '($' . $q2 . ',0,$' . $q5 . '))));') . '"));';

$s = '<?php ' . "\n" . $s . "\n" . ' ?>';

// 生成 加密后的PHP文件
$fpp1 = fopen('temp_' . $filename, 'w');
fwrite($fpp1, $s) or die('写文件错误');

创建一个新的索引库

PUT /leyou
{
  "settings": {
    "number_of_shards": 1,
    "number_of_replicas": 0
  }
}

查看索引信息

GET /leyou

删除索引库

DELETE /leyou

添加映射(mappings),ps:等同数据库建表

# 参数说明
PUT /索引库名/_mapping    #(自7.0起取消了Type,不需要加索引类型名,统一为_doc)
{
  "properties": {
    "字段名": {
      "type": "类型",        # 类型:可以是text、long、short、date、integer、object等
      "index": true,        # 是否索引,默认为true
      "store": true,        # 是否存储,默认为false
      "analyzer": "分词器"   # 分词器 使用ik分词器: ik_max_word 会将文本做最细粒度的拆分,ik_smart 会做最粗粒度的拆分
    }
  }
}

# 常用类型
1 String类型,分两种:
  text: 可分词,不可参与聚合
  keyword: 不可分词,数据会作为完整字段进行匹配,可以参与聚合
    
2 Numerical数值类型,分两种:
  基本数据类型:long、interger、short、byte、double、float、half_float
  浮点数的高精度类型:scaled_float 需要指定一个精度因子,比如10或100。elasticsearch会把真实值乘以这个因子后存储,取出时再还原。

3 日期类型: 
  Date elasticsearch可以对日期格式化为字符串存储,但是建议我们存储为毫秒值,存储为long,节省空间。

# 使用示例
PUT /leyou/_mapping
{
  "properties":{
    "title":{
      "type": "text",
      "analyzer": "ik_max_word"
    },
    "images":{
      "type": "keyword",
      "index": "false"
    },
    "price":{
      "type":"float"
    }
  }
}

查看索引库的索引类型

GET /leyou/_mapping

阅读剩余部分...