? 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关闭连接。
后续补充 ... |