摘要: innodb 的聚集索引 的叶子结点 存放的 是 索引值以及数据页的偏移量 那么在计算全表扫描的代价是怎么计算的呢? 我们知道代价 为 cpu代价+io代价 cpu代价 就是 每5条记录比对 计算一个代价 (这里的记录并不是我们数据记录,而是索引记录) 是数据记录个数 又是如何取出全表的总记录呢 ( 阅读全文
posted @ 2017-03-31 19:02 taek 阅读(1591) 评论(0) 推荐(0) 编辑
摘要: 简单分析下php中的分支背后的实现 1.语法分析 对于上面的php代码来说 if 匹配 T_IF $a == 1 匹配 parenthesis_expr , 同时语法分析器要执行 zend_do_if_cond op为zend_is_equal echo "a" 匹配 statement, 同时语法 阅读全文
posted @ 2016-11-20 23:13 taek 阅读(1463) 评论(0) 推荐(0) 编辑
摘要: 去年在安宁庄的时候, 有个同事阐述了一个观点:php中的if else 在执行时考虑到效率的原因,不会按我们的代码的顺序一条一条去试,而是随机找出一个分支,执行,如果不对,再随机找到一个分支 当时由于种种原因,也没过多去想这个问题,最近查了下资料,发现里面的学问还挺大的 php解释器是由c编写的, 阅读全文
posted @ 2016-11-19 22:05 taek 阅读(8101) 评论(0) 推荐(0) 编辑
摘要: php7的特点是规则上不从堆上分配内存,改为从栈上分配内存, 因为有些场景是从堆上分配内在后,还要手动释放内存,利用栈分配内在快的特点,在有需要的时候,再在堆上分配内在 但是栈上分配的内存,不能返回,因为当函数运行完后,就退栈了,但可以将该内在地址传给别的函数 php7的hashTable中的Buc 阅读全文
posted @ 2016-06-02 00:24 taek 阅读(2010) 评论(0) 推荐(0) 编辑
摘要: 在php5.3版本之前, php变量的回收机制只是简单的通过计数来处理(当refcount=0时,会回收内存),但这样会出现一个问题 $a=array("str"); $a[]=&$a; unset($a); 执行unset之前,$a的refcount 为2,执行unset之后,$a的refcout 阅读全文
posted @ 2016-05-09 07:28 taek 阅读(6106) 评论(1) 推荐(0) 编辑
摘要: protobuffer是google推出的一种数据传的方式,具体压缩,体积小的特点 protobuffer本身不支持php,若要把.proto文件转化为php支持的文件,需要使用第三方的程序 allegro/php-protobuf 或 drslump/Protobuf-PHP 参考 http:// 阅读全文
posted @ 2016-05-08 15:08 taek 阅读(13111) 评论(0) 推荐(0) 编辑
摘要: php变量的引用,如果使用的恰当,会带来效率的提升,相反,效率下降 count是个内置函数,参数只接收传值,但现在传入的参数$array是个引用,由于在php5中,某个值是不能引用变量和非引用变量之间使用, 针对这个例子来说,即在count内部,php引擎会copy一个$arrray指向的zval, 阅读全文
posted @ 2016-05-04 13:14 taek 阅读(278) 评论(0) 推荐(0) 编辑
摘要: 参考 http://www.cnblogs.com/justfortaste/p/3198406.html http://m.blog.csdn.net/blog/IT_PCode/17007833 http://blog.chinaunix.net/uid-28364803-id-3419777. 阅读全文
posted @ 2015-12-20 18:02 taek 阅读(1359) 评论(0) 推荐(0) 编辑
摘要: innodb分配内存有三种方法 1)使用OS的malloc 2)使用innodb自己实现的内存分配方法 3)使用goolge的Tmalloc innodb引擎分析之内存管理 在my.cn配置文件中可设置 #InnoDB是使用自带的内存分配程序, #还是使用当前部署的操作系统中现有的更高效的内存分配程 阅读全文
posted @ 2015-12-01 00:09 taek 阅读(270) 评论(0) 推荐(0) 编辑
摘要: innodb引擎中的锁分两种 1)针对数据结构, 如链表 互斥锁 读写锁 http://mysqllover.com/?p=425 http://www.cnblogs.com/justfortaste/p/3668935.html 2)针对数据表中记录 行锁 表锁 innodb中的互斥锁是依据操作 阅读全文
posted @ 2015-11-04 12:50 taek 阅读(953) 评论(0) 推荐(0) 编辑
摘要: 转自 http://www.iteye.com/topic/1128407 /usr/local/mysql/bin/mysqld --basedir=/usr/local/mysql --datadir=/usr/local/mysql/data --plugin-dir=/usr/local/m 阅读全文
posted @ 2015-05-26 16:03 taek 阅读(454) 评论(0) 推荐(0) 编辑
摘要: php内核中的内存分配 使用的函数有 emalloc(), erealloc() ,这两个函数分别是malloc(),realloc()函数的封装 关于内存分配有四个容器:cache,小块内存链表,大块内存(链表+树), 剩余rest内存链表 大块内存(链表+二叉排序树):链表中每个bucket除了 阅读全文
posted @ 2015-01-23 14:16 taek 阅读(2695) 评论(0) 推荐(0) 编辑
摘要: 1.语法分析unticked_statement:| T_ECHO echo_expr_list ';';echo_expr_list: echo_expr_list ',' expr { zend_do_echo(&$3 TSRMLS_CC); } | expr ... 阅读全文
posted @ 2014-11-24 16:00 taek 阅读(1603) 评论(0) 推荐(0) 编辑
摘要: php的语法分析的主要作用是验证词法分析的基础上将token组成的序列,在php这门语言中是否是一个有效的句子,也可以理解为这些token序列是否匹配设计php这门语言时的语法模型,在匹配的情况下构建具体的程序(组建opcode),以供编译后期使用。 比如:在设计php语言时,需要设计一套语法... 阅读全文
posted @ 2014-09-24 17:54 taek 阅读(2866) 评论(1) 推荐(1) 编辑
摘要: php中的内存分配有用类似emalloc这样的函数,emalloc实际上是C语言中的malloc的一层封装,php启动后,会向OS申请一块内存,可以理解为内存池,以后的php分配内存都是在这块内存池中进行的,以至于efree,也不会向OS退回内存,而只是设置标志位,标识efree这块内存不再使用... 阅读全文
posted @ 2014-09-11 15:15 taek 阅读(6060) 评论(2) 推荐(1) 编辑
摘要: 在php5.3之前,为某变量分配内存是用宏MAKE_STD_ZVAL;737 #define MAKE_STD_ZVAL(zv) \ # /Zend/zend.h738 ALLOC_ZVAL(zv); \739 INIT_PZVAL(zv);165 #define ALLOC_Z... 阅读全文
posted @ 2014-06-17 21:48 taek 阅读(367) 评论(0) 推荐(0) 编辑
摘要: $a=range(10000) refcount 1 $b=&$a ref (refcount=2) val(refcount=1) $a1=$a ref(refcount=2) val(refcount=2) unset($a) ref(refcount=1) val(refcount=2) un 阅读全文
posted @ 2019-03-22 11:15 taek 阅读(612) 评论(0) 推荐(0) 编辑
摘要: 将参数从左到在依次放到栈里 当调用函数时,将 阅读全文
posted @ 2019-03-22 11:14 taek 阅读(603) 评论(0) 推荐(0) 编辑
摘要: php重启 本质上是调用 execvp("/usr/local/php/sbin/php-fpm"); execvp就是用一个新的进程把自己替换掉,一个进程一旦调用exec类函数,它本身就"死亡"了,系统把代码段替换成新的程序的代码,废弃原有的数据段和堆栈段,并为新程序分配新的数据段与堆栈段,唯一留 阅读全文
posted @ 2019-03-22 11:14 taek 阅读(400) 评论(0) 推荐(0) 编辑
摘要: nginx和php-fpm是通过fastcgi协议进行通信的,php-fpm本身就是个socket服务端,nginx拿到url后,识别出.php结尾的地址后,会传给php-fpm,php-fpm通过预先启动的进程,调用php解释器 fastcgi消息有10种,其中有 fcgi_begin_reque 阅读全文
posted @ 2019-03-22 11:13 taek 阅读(428) 评论(0) 推荐(0) 编辑
摘要: php-fpm有三种定时器 1)主进程接收到用户的信号,例如sigusr,主进程执行kill(子进程号,sigquit),的同时,设置定时器,在一个无限循环里如果当前时间 大于或等于 该定时器的过期时间,则主进程执行kill(子进程号,sigterm); 2)对于在php-fpm里设置了reques 阅读全文
posted @ 2019-03-22 11:13 taek 阅读(396) 评论(0) 推荐(0) 编辑
摘要: 1.BNF范式 2.调用静态方法的编译 zend_do_begin_class_member_function_call 3.调用静态方法的编译 zend_do_end_function_call 阅读全文
posted @ 2019-03-22 11:12 taek 阅读(1759) 评论(0) 推荐(0) 编辑
摘要: 2. 针对extends 的函数 zend_do_fetch_class 3.ZEND_FETCH_CLASS_SPEC_CONST_HANDLER函数 4.zend_fetch_class_by_name函数 开始声明类 绑定父类 阅读全文
posted @ 2019-03-22 11:12 taek 阅读(672) 评论(0) 推荐(0) 编辑
摘要: php的词法分析 可以理解为 通过一定的规则,把输入的代码 区分出哪些是 是$开头的变量, 哪些是 以两个单引号括起来的字符串,哪些是以两个双引号括起来的字符串 等等, 这些区分出来的东西 称为token ,token 之间的联系 是由语法分析来完成的, 比如 赋值,加减乘除; 语法分析详见这里 语 阅读全文
posted @ 2019-03-22 11:12 taek 阅读(1540) 评论(0) 推荐(0) 编辑
摘要: http://ju.outofmemory.cn/entry/197064 http://www.fzb.me/2015-9-16-php7-implementation-hashtable.html http://ju.outofmemory.cn/entry/154095 http://www. 阅读全文
posted @ 2019-03-22 11:11 taek 阅读(2344) 评论(0) 推荐(0) 编辑
摘要: 1)词法分析 2)语法分析 unticked_statement: | T_UNSET '(' unset_variables ')' ';' //unset($a,$b) 还能这么用呢,第一次知道 unset_variables: unset_variable | unset_variables 阅读全文
posted @ 2019-03-22 11:11 taek 阅读(977) 评论(0) 推荐(0) 编辑