摘要: 网络连接建立与分发 前面分析了worker线程的初始化,以及主线程创建socket并监听的过程。本节会分析连接如何建立与分发。 初始状态 A,可以摸清楚master线程的大致逻辑: 1)初始化各个worker线程 2)执行socket,bind,listen...主线程进行监听 3)一旦有新的连接建 阅读全文
posted @ 2016-09-18 16:40 driftcloudy 阅读(412) 评论(0) 推荐(0) 编辑
摘要: memcached是一个典型的单进程系统。虽然是单进程,但是memcached内部通过多线程实现了master-worker模型,这也是服务端最常见的一种并发模型。实际上,除了master线程和worker线程之外,memcached还有一些其他的辅助线程(比如logger线程),但是与本文主题无关 阅读全文
posted @ 2016-09-18 16:39 driftcloudy 阅读(476) 评论(0) 推荐(0) 编辑
摘要: 本章开始研究php中函数的调用和执行,先来看函数调用语句是如何被编译的。 我们前面的章节弄明白了函数体会被编译生成哪些zend_op指令,本章会研究函数调用语句会生成哪些zend_op指,等后面的章节再根据这些op指令,来剖析php运行时的细节。 源码依然取自php5.3.29。 函数调用 回顾之前 阅读全文
posted @ 2016-06-15 23:09 driftcloudy 阅读(2494) 评论(0) 推荐(0) 编辑
摘要: 本文只探讨纯粹的函数,并不包含方法。对于方法,会放到类、对象中一起研究。 想讲清楚在zend vm中,函数如何被正确的编译成op指令、如何发生参数传递、如何模拟调用栈、如何切换作用域等等,的确是一个很大范畴的话题。但为了弄明白php的原理,必须要攻克它。 对函数的研究,大致可以分成两块。第一块是函数 阅读全文
posted @ 2016-04-22 14:26 driftcloudy 阅读(2330) 评论(1) 推荐(0) 编辑
摘要: 在做php开发的时候,经常会设置max_input_time、max_execution_time,用来控制脚本的超时时间。但却从来没有思考过背后的原理。 趁着这两天有空,研究一下这个问题。文中源码取自php5.4.44版本。 超时配置 php的ini配置如何起作用,这是一个老生常谈的话题了。 首先 阅读全文
posted @ 2016-02-17 00:34 driftcloudy 阅读(2772) 评论(1) 推荐(2) 编辑
摘要: 最近写的一段代码,总是出core,精简了一下,稳定复现。 编译并执行,就会报Segmentation fault (core dumped)。 看下core的栈: 问题应该是出在strerror(errno)上了。 反编译一下代码, 差不多到这里问题就追踪出来了。由于是在64位系统上执行,因此eax 阅读全文
posted @ 2015-11-17 14:31 driftcloudy 阅读(1849) 评论(0) 推荐(1) 编辑
摘要: 继续接着上一篇写。 运行时改变配置 在前一篇中曾经谈到,ini_set函数可以在php执行的过程中,动态修改php的部分配置。注意,仅仅是部分,并非所有的配置都可以动态修改。关于ini配置的可修改性,参见:http://php.net/manual/zh/configuration.changes. 阅读全文
posted @ 2014-10-13 18:30 driftcloudy 阅读(1241) 评论(0) 推荐(2) 编辑
摘要: 这篇文章不会详细叙述某个ini配置项的用途,这些在手册上已经讲解的面面俱到。我只是想从某个特定的角度去挖掘php的实现机制,会涉及到一些php内核方面的知识:-) 使用php的同学都知道php.ini配置的生效会贯穿整个SAPI的生命周期。在一段php脚本的执行过程中,如果手动修改ini配置,是不会 阅读全文
posted @ 2014-10-12 21:24 driftcloudy 阅读(4490) 评论(1) 推荐(5) 编辑
摘要: 项目中有个功能是比较会员是否过期,review同事的代码,发现其写法比较奇葩,但线上竟也未出现bug。 实现大致如下: 如果两个时间需要进行比较,通常是转换成unix时间戳,用两个int型的数字进行比较。该实现却特意将时间表示成string,然后对两个string进行比较运算。 撇开写法不谈,我很好 阅读全文
posted @ 2014-04-17 23:19 driftcloudy 阅读(1891) 评论(4) 推荐(3) 编辑
摘要: 原文:https://bugs.php.net/bugs-getting-valgrind-log.php 前提 1,编译php的时候,必须要带上--enable-debug选项。 2,禁用php的内存管理。 禁用Zend MM Zend虚拟机使用了自己的程序来优化内存管理,因此,valgrind无 阅读全文
posted @ 2013-09-10 20:26 driftcloudy 阅读(3808) 评论(1) 推荐(0) 编辑