最新

Phper 学 C 兴趣入门 -为什么有时候字符串可以截取有时候又不行

周梦康 发表于 2019-09-09 92 次浏览

需求

假如有这样的一个需求,有个日期,想要截取获得其年份。我们用 php 可以使用explode,也可以使用strtok

$a = "2019-09-10 00:00:00";
echo strtok($a,"-"); // 2019

可能大家对strtok不太熟悉,它的作用是用-来分割$a获取子串,循环调用可以达到和explode差不多的效果。具体可以看下官方手册里面的 demo https://www.php.net/manual/zh/function.strtok.php

实验

实验1

我之所以用strtok呢,是因为C 语言里也有这个函数,这个函数比较“怪”,每一次调用,是将字符串中找到的-替换为\0,然后返回标记字符串的首地址。

Phper 学 C 兴趣入门 - 为什么 php 手册里经常说某个字符串函数是二进制安全的

周梦康 发表于 2019-09-05 89 次浏览 标签 : C php

引子

为什么 php 手册里经常说某个函数是二级制安全的?我们平常使用函数的时候也没发现有什么区别呀,那么二进制安全到底是什么意思呢?

Php 实验

<?php
echo strlen("abc"); // 3
echo strlen("abc\0"); // 4
echo strlen("abc\0d"); // 5
echo strlen("abc\0def"); // 7

受邀参加阿里云某业务线 2019 篮球赛

周梦康 发表于 2019-08-09 350 次浏览

临时收到某部门的盛情邀请作为他们部门篮球赛的强力外援,不用说,肯定是我得分能力吸引了他们。最后才知道原来是本不能邀请外援,但才6人,少一个,正好他们组妹子也有一套球服,其他人也穿不了,所以邀请了我。
IMG_1471.JPG

PHP 异常任重而道远

周梦康 发表于 2019-06-18 1809 次浏览 标签 : php 原创

作为一名深度 phper,我如果要黑咱们 php,就像说自己母校差一样,大家不要见外。

故事的开始

这几天观察错误日志发现有一个数据反序列化的notice错误,实际情况我是从缓存中读取数据然后反序列化,因为反序列化失败,所以实际每次都是去数据库取的值。背后性能影响还是挺大的。

一次 group by + order by 性能优化分析

周梦康 发表于 2019-03-18 3853 次浏览 标签 : Mysql 原创

最近通过一个日志表做排行的时候发现特别卡,最后问题得到了解决,梳理一些索引和MySQL执行过程的经验,但是最后还是有5个谜题没解开,希望大家帮忙解答下

主要包含如下知识点

  • 用数据说话证明慢日志的扫描行数到底是如何统计出来的
  • 从 group by 执行原理找出优化方案
  • 排序的实现细节
  • gdb 源码调试

如何成为一名优秀的工程师(语义篇)

周梦康 发表于 2019-03-03 3687 次浏览 标签 : 原创

好的语义表达是团队协作中高效迭代的润滑剂,好的语义表达是线上未知代码问题排查的指南针。

不要让其他人读不懂你的代码,其他人可能就是一周后的你。时刻以“如果你写的这段代码出现故障,一个陌生人接手你的代码需要多久能处理完这个bug”来监督自己。

日常中应该多多刻意提升自己语义表达,百利而无一害。那么我们应该从哪些细节去做好语义表达呢?

Mysql 使用 optimizer_trace 查看执行流程,分析、验证优化思路

周梦康 发表于 2019-01-22 1608 次浏览 标签 : Mysql 原创

使用 optimizer_trace 可以更加详细的看到 mysql 的整个执行流程,作为分析优化思路,验证优化思路非常有帮助。

需求:现在需要统最近一个月阅读量最大的10篇文章
Mysql 版本 :5.7

mysql> show create table article_rank\G;
*************************** 1. row ***************************
       Table: article_rank
Create Table: CREATE TABLE `article_rank` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `aid` int(10) unsigned NOT NULL,
  `pv` int(11) unsigned NOT NULL DEFAULT '1',
  `day` int(8) NOT NULL COMMENT '日期 例如 20171016',
  PRIMARY KEY (`id`),
  KEY `idx_day` (`day`),
  KEY `idx_day_aid_pv` (`day`,`aid`,`pv`),
  KEY `idx_aid_day_pv` (`aid`,`day`,`pv`)
) ENGINE=InnoDB AUTO_INCREMENT=240776593 DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

一个案例彻底弄懂如何正确使用 mysql inndb 联合索引

周梦康 发表于 2018-11-18 6784 次浏览 标签 : Mysql 原创

有一个业务是查询最新审核的5条数据

SELECT `id`, `title`
FROM `th_content`
WHERE `audit_time` < '1541984478'
    AND `status` = 'ONLINE'
ORDER BY `audit_time` DESC, `id` DESC
LIMIT 5;

查看当时的监控情况 cpu 使用率是超过了100%,show processlist看到很多类似的查询都是create sort index
查看该表的索引有一个audit_time在左边的联合索引。

分析上面的sql执行的逻辑:

  • 从联合索引里找到所有小于该审核时间的主键id(因为该sql查询的是最新审核的,假如之前已经审核了100万条数据,则会在联合索引里取出对应的100条数据的主键id)
  • 回表,查出100万行记录,然后逐个扫描,筛选出status='ONLINE'的行记录
  • 最后对查询的结果进行排序(假如有50万行都是ONLINE,则继续对这50万行进行排序)

最后因为数据量很大,虽然只取5行,但是按照我们刚刚举的极端例子,实际查询了100行数据,而且最后还在进行了50行的内存排序。

所以是非常低效的。

PHP 源码探秘 - 在解析外部变量时的一个 BUG

周梦康 发表于 2018-11-17 1863 次浏览 标签 : php 原创

在接收外部变量时,多个相同的外部变量,在nodejs中会被放在一个数组里面,而php中则是后者覆盖前者,如果需要传递数组变量,则在变量名后面添加上[]这个不兼容,ok,是语言的特性能接受

但是在php中在解析id[]_text的数据的时候都转换成id[]了,这点就有点坑了。

Mysql 大表分页查询优化(二)

周梦康 发表于 2018-11-14 2315 次浏览 标签 : Mysql

开发同学按照传达的精神使用了上次说的大表翻页优化的方式在做翻页查询了。执行时间97秒。

select a2.id,a2.keyword,a2.url from (select id from table_name order by id asc limit 73575000, 5000) a1, table_name a2 where a1.id=a2.id
select count(*) from table_name;

执行查看表总数都执行了70292.60ms,总行数是118345950行。

对于这种表,做大表翻页优化,也已经无效了。那应该怎么弄呢?

我们先不去纠结历史原因,为什么没有分表。着眼解决当前的问题。
问下具体开发的同学,是在全表扫描这个表是否命中一些违禁词。这样就好办了。我们只需要“分段扫描就行了呀

Mysql 大表分页查询优化(一)

周梦康 发表于 2018-11-09 2327 次浏览 标签 : Mysql

看到数据库报警,查看慢 sql 日志看到

select id, content from table_name where status = 1 order by id asc limit 1328000, 1000

执行了 90 秒,扫描了 1329172 行。

改写成

select a2.id, a2.content from (select id from table_name where status = 1 order by id asc limit 1328000, 1000) a1, table_name a2 where a1.id=a2.id;

总结

这种数据量很大的表,应该是先做一个子查询查出 id(只会在索引里面扫描),然后关联查询,这样扫描的行数是限定的。而不会扫描表前面所有的行。

一次 java.io.IOException: Connection reset by peer 故障排查

周梦康 发表于 2017-12-19 10766 次浏览 标签 : Java

我的弹幕服务,代码换了个环境运行,虽然服务可用,但是发现出现了如下情况,基本1秒输出来一次:

java.io.IOException: Connection reset by peer
  at sun.nio.ch.FileDispatcherImpl.read0(Native Method)
  at sun.nio.ch.SocketDispatcher.read(SocketDispatcher.java:39)
...

因为我有两个网卡,请求是从 eth0 进,从 eth1 出,我尝试使用tcpdump -i any 发现第三次握手输出的 askno 数据不对。(为什么会这样呢,还不知道,谁知道请告知下