2021-09-10 - PHP - 功能代码片段/代码弹药库 - 收集

1.应用场景

主要用于快速实现功能,提高工作效率。

2.学习/操作

查看源图像 

1.文档阅读

PHP 生成UUID_william_n的博客-CSDN博客_php 生成uuid  // PHP中生成UUID

2.整理输出

1. 获取访问者IP

public static function get_ip()
{
    $ip = '';
    if (!empty($_SERVER['HTTP_CLIENT_IP'])) {
        $ip = $_SERVER['HTTP_CLIENT_IP'];
    }
//        elseif (!empty($_SERVER['HTTP_X_REAL_IP'])) {
//            $ip = $_SERVER['HTTP_X_REAL_IP'];
//        }
    elseif (!empty($_SERVER['HTTP_X_FORWARDED_FOR'])) {
        $ip = $_SERVER['HTTP_X_FORWARDED_FOR'];
    } else {
        if(!empty($_SERVER['REMOTE_ADDR'])){
            $ip = $_SERVER['REMOTE_ADDR'];
        }else{
            if(php_sapi_name() == 'cli'){
                $ip = "cli";
            }
        }
    }

    //HTTP_X_FORWARDED_FOR 可能有多个ip,逗号隔开
    $pos = strpos($ip, ',');
    if ($pos > 0) {
        $ip = substr($ip, 0, $pos);
    }
    return $ip;
}

2. 生成GUID

public static function create_guid()
{
    if (function_exists('com_create_guid')) {
        $guid = trim(com_create_guid(), '{}');
        return str_replace('-', '', $guid);
    } else {
        mt_srand((double)microtime() * 10000);//optional for php 4.2.0 and up.
        $charid = strtoupper(md5(uniqid(rand(), true)));
        $hyphen = chr(45);// "-"
        $hyphen = '';// "-"
        //chr(123)// "{"
        $uuid = substr($charid, 0, 8) . $hyphen
            . substr($charid, 8, 4) . $hyphen
            . substr($charid, 12, 4) . $hyphen
            . substr($charid, 16, 4) . $hyphen
            . substr($charid, 20, 12);
        //.chr(125);// "}"
        return $uuid;
    }
}

3. 获取优先级比重

public static function ExploreWeightByTier($tier){
    $tierList = [
        'Bronze' => 3,
        'Silver' => 6,
        'Gold' => 9,
        'Platinum' => 12
    ];
    return isset($tierList[$tier])? $tierList[$tier]: 1;
}

// 青铜 白银 黄金 铂金

4. 关注与被关注的实现

关注关系,还是要存储到数据库,如,follow表中,user_id 与 follow_id. 

只是,在高并发下,还是要借助Redis来实现来实现某些功能逻辑~

同时可以看到使用了队列,具体过程TBD

components/FollowQueue.php

// 判断是否加入了黑名单

if (UserRedis::blockScore($user_id, $influencer_id)) return self::error("You have blocked this user.");
if (UserRedis::blockScore($influencer_id, $user_id)) return self::error("This user has blocked you.");

components/redis/UserRedis.php

...

public static function blockScore($user_id, $check_user_id) {
    return self::_getInstance()->zscore("block.id:" . $user_id, $check_user_id);
}

5. PHP内置的日期类,输出日期时间

/**
 * print current time and message
 */

public static function log_time($message)
{
    $now = \DateTime::createFromFormat('U.u', number_format(microtime(true), 6, '.', ''));
    echo  $now->format("Y-m-d H:i:s.u") . "\t";
    print_r($message);
    echo "\r\n";
}

截图

6. 重新数据库  // Yii 

/**
 * 判断数据库是否正常连接,如果断线则重连
 * reconnect database when database connection drops
 */
public static function activateDb() {
    // yii内置方法 Yii::$app->db->getIsActive(); not works  没用 无法判断
    try{
        Yii::$app->db->createCommand('SELECT version()')->execute();
    } catch (\Exception $e) {
        //echo $e->getMessage();
        Yii::$app->db->close();
        Yii::$app->db->open();
    }
}

需要在执行过程中适时调用检测,然后抛出异常处理

// reconnect database when database connection drops

Service::activateDb();

Note:

commands 长时间运行遇到问题,mysql server has gone away

需要捕获,重连。就是上面的解决办法。

原因:

mysql的配置参数决定的,默认就是8小时。

MySQL 的默认设置下,当一个连接的空闲时间超过8小时后,MySQL 就会断开该连接,而 c3p0 连接池则以为该被断开的连接依然有效。在这种情况下,如果客户端代码向 c3p0 连接池请求连接的话,连接池就会把已经失效的连接返回给客户端,客户端在使用该失效连接的时候即抛出异常。

将这2个参数设置为24小时(60*60*24=604800)即可。
set interactive_timeout=604800;
set wait_timeout=604800;

https://www.jb51.net/article/32284.htm

mysql - What is the difference between wait_timeout and interactive_timeout? - Server Fault

截图:

SHOW PROCESSLIST;
show variables like '%timeout%';

Variable_name    Value

connect_timeout    10
delayed_insert_timeout    300
have_statement_timeout    YES
innodb_flush_log_at_timeout    1
innodb_lock_wait_timeout    50
innodb_rollback_on_timeout    OFF
interactive_timeout    28800
lock_wait_timeout    31536000
mysqlx_connect_timeout    30
mysqlx_idle_worker_thread_timeout    60
mysqlx_interactive_timeout    28800
mysqlx_port_open_timeout    0
mysqlx_read_timeout    30
mysqlx_wait_timeout    28800
mysqlx_write_timeout    60
net_read_timeout    30
net_write_timeout    60
replica_net_timeout    60
rpl_stop_replica_timeout    31536000
rpl_stop_slave_timeout    31536000
slave_net_timeout    60
wait_timeout    28800

回到的截图

Note:

从上面可知,如果一直执行查询,操作,每次都没有超过wait_timeout 或者 interact_timeout 就不会

造成mysql关闭连接。

后续补充

...

3.问题/补充

TBD

4.参考

PHP 生成UUID_william_n的博客-CSDN博客_php 生成uuid

https://www.jb51.net/article/32284.htm

mysql - What is the difference between wait_timeout and interactive_timeout? - Server Fault

后续补充

...

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值