本文目录一览:
- 1、怎么去分析php程序源代码?
- 2、拿到一个php源码怎么分析它用的是什么框架??
- 3、服务器程序源代码分析之二:php-fpm
- 4、PHP FPM源代码反刍品味之四:事件处理
- 5、怎么分析别人写的的PHP源代码?
怎么去分析php程序源代码?
新手呀,建议你先自己写程序,然后就知道别人一般都会怎么写,分析就顺手了。万一想分析,就找点质量好的程序来分析,许多垃圾程序你看了会学坏的。
直接对大一些的程序进行分析,一般需要用纸笔记录程序流,画模块图。从程序入口处开始,一段一段的找出程序的功能,遇到有函数调用的时候,在另外一张纸上对每个函数进行画图,写出入口参数含义、内部实现流程。
拿到一个php源码怎么分析它用的是什么框架??
一。先把源代码安装起来,结合它的文档和手册,熟悉其功能和它的应用方式。
二。浏览源代码的目录结构,了解各个目录的功能。
三。经过以上两步后相信你对这个开源的产品有了一个初步的了解了,那现在就开始分析它的源码吧。这一步我们开始分析源代码框架。例如入口方式是单入口还是多入口,页面之间的调用规则,能根据规则找出某个功能用到的页面。
四。熟悉源代码的代码写作风格,例如缩进方式,排版格式等。
五。熟悉一下源代码用到的数据库和表,可以参考它的技术支持文档。
六。经过以上几步相信大家已经对这份源代码有了更深刻的了解,不过这种了解还只是表面的,下来我们从6个方面具体的去分析它吧:
1.入口构造以及页面调用方式的具体实现,如果阅读时看到工具类和工具函数,尽量去熟悉一下。这一步的分析可以学习到源代码的系统架构方式。
2.分析源代码用到的工具类和工具函数,这样可以学到很多程序编写技巧。可以提升自己编程功力。
3.结合一些安全规则,研究这个源代码是怎样实现安全方面的设计的。这样可以提高自己在安全方面的意识和功力。
4.如果有模板引擎的话,研究一下源代码的模板引擎。大致从实现方式,效率,易用性等几个方面去考虑。
5.研究系统的各个功能模块,这样既能学习编程技巧还能打开自己的编程思路,下次遇到类似的东东就心里有谱了。
6.研究系统所用到设计模式,一样的功能实现,用到的设计模式可能相差很多,对比我们之前所作的东东分析设计模式,是提升我们驾驭代码的不二法门。
7.研究源代码对访问压力,执行效率,系统效率,数据库查询的优化。
服务器程序源代码分析之二:php-fpm
php作为排名top2 互联网开发工具,非常流行,可以参考:中国最大的25个网站采用技术选型方案
php这个名称实际上有两层含义
直接定义:
php-fpm从php5.3.3开始已经进入到php源代码包,之前是作为patch存在的
很少人会去读php本身源代码,我6年前解决php内存泄露问题的时候做了些研究,最近再查看了一番,发现php的开发者很有诚意,这是一款非常出色的服务器软件,支持如下
在linux服务器上,如果不设置 events.mechanism ,那么默认就是采用epoll,所以
php-fpm的IO模型并发处理能力和nginx是完全一致
nginx以性能卓越闻名,大部分程序员都认为php效率低下,看了源代码,才知道这是传奇啊
在高性能部署的时候,大家往往会针对性的优化nginx 。我自己之前部署php程序也犯了错误,8G内存的server,php-fpm的max children都会设置128+,现在看来太多了,参考nginx的部署:
php-fpm配置为 3倍 cpu core number就可以了
php-fpm稳定性比nginx稍差 这是因为php-fpm内置了一个php解析器,php-fpm进程就和php程序捆绑了,如果php脚本写得不好,有死循环或者阻塞在某个远端资源上,会拖累加载它的php-fpm进程
而nginx和后端应用服务器之间通过网络连接,可以设置timeout,不容易堵死的
php-fpm的fastcgi是短连接 我原以为是长连接的,看了代码才知道也是短连接,处理一个request就关闭掉
php-fpm接口采用fastcgi 非常遗憾,php-fpm和fastcgi完全绑定了,无法独立使用 。只能部署在支持http-fcgi协议转换程序背后(nginx)。其实可以考虑在php-fpm代码包里面引入http协议支持,这样php-fpm可以独立运行,让nodejs无话可说
php-fpm等同于OpenResty OpenResty是一个国人开发的nginx模块,就是在nginx引入lua解释器. 实际上,它和php-fpm的唯一差别就是一个采用php语法,一个用lua,所以OpenResty要作为nginx增强包使用还可以,要选择它作为一个主要编程工具,没有任何必要
从架构上来说,php-fpm已经做到最好,超过大多数 python部署工具,我再也不黑它了
PHP FPM源代码反刍品味之四:事件处理
FPM master 进程启动后,会进入函数fpm_event_loop,无限循环.
处理事件.
master 进程所做的的事,总的来说就是两类:
简称timer事件,需按时运行,主要有3个:
简称fd事件,需从文件句柄(file descriptor)读取到指令后,依指令运行.
重复一下,unix 下一切IO, 皆文件,socket ,socketpair,pipe 都返回文件句柄(fd) 用于通信.
主要的fd有:
对于timer事件,多个事件在事件轴上是依次排列的,只需反复检查,到时运行.
对于fd事件,需监听多个fd,需用到我们第二篇讲的IO多路复用技术.
如果满足事件条件,则处理事件内容.
FPM设计上,两类事件使用同一个结构,并且事件触发条件和事件处理逻辑放到同一个事件对象里(C语言对象就是结构体).
举个例子, 打铃下课,打铃是触发条件,下课是事件内容,两个同时放到一个事件对象 ,这是一个很好的设计.
fd值: -1
flags值: FPM_EV_PERSIST
which值: FPM_EV_TIMEOUT
fd值: 获取触发指令的文件fd
flags值: FPM_EV_EDGE(fd事件底层的边缘触发标志,需系统支持)
which值: FPM_EV_READ
两类事件分别放在两个事件队列
static struct fpm_event_queue_s *fpm_event_queue_timer = NULL;
static struct fpm_event_queue_s *fpm_event_queue_fd = NULL;
事件队列的结构很常见,双向队列:
typedef struct fpm_event_queue_s {
struct fpm_event_queue_s *prev;
struct fpm_event_queue_s *next;
struct fpm_event_s *ev;
} fpm_event_queue;
4移除事件 (fpm_event_del - fpm_event_queue_del)
简单的出列操作:
static int fpm_event_queue_del(struct fpm_event_queue_s **queue, struct fpm_event_s *ev)
对于fd事件,需在底层事件轮询机制里移除(如:epoll)
5,运行事件回调函数:
6, 底层事件轮询模块结构
不同的操作系统,支持不同的IO事件机制,linux 支持epoll,
windows支持select, freebsd 支持kqueue,这个结构统一操作接口
在函数fpm_event_init_main里 调用module-init初始化
fpm 里对应的配置
master进程在fpm_event_loop函数里无限循环,处理定时任务和fd事件.
期间会在module-wait阻塞片刻,对于epoll机制,就是epoll_wait.
怎么分析别人写的的PHP源代码?
可以使用真酷游戏浏览器 打开需要查看的页面鼠标右键查看页面源码就可以看到下面的网站源码了