内核
李景山-编程者
就是想简单的写代码.......................
展开
-
[李景山php] 深入理解PHP内核[读书笔记]--第五章:类和面向对象 --类的继承,多态及抽象类
类的继承,多态及抽象类PHP内核将类的继承实现放在了”编译阶段”,因此使用VLD生成中间代码时并没有关于继承的相关信息。整个继承的过程是以类结构为中心,当继承发生时,程序会先处理所有的接口。在继承过程中,除了常规的函数合并后,还有魔术方法的合并。多态顾名思义,多态即多种形态,相同方法调用实现不同的实现方式。PHP中关键点在于类型提示的实现。类型提示的实现:第一步:判断参数是否为对象,使用宏Z_TYP原创 2017-05-22 08:48:10 · 460 阅读 · 0 评论 -
[李景山php] swoole 进程间 通信
$workers = [];// 进程仓库$worker_num = 2;// 最大进程数// 循环创建子进程for($i = 0; $i < $worker_num; $i++){ $process = new swoole_process('callback_function', false, false); $process->useQueue();// 开启队列使用,类原创 2017-05-17 09:18:31 · 355 阅读 · 0 评论 -
[李景山php] swoole 进程间 事件
$workers = [];$worker_num = 3;//创建的进程数for($i=0;$i<$worker_num ; $i++){ $process = new swoole_process('process');// 创建子进程 启动函数为 process $pid = $process->start();// 子进程启动 $workers[$pid] = $原创 2017-05-17 09:17:53 · 230 阅读 · 0 评论 -
[李景山php] swoole 进程创建
$process = new swoole_process('callback_function', true);$pid = $process->start();function callback_function(swoole_process $worker){ $worker->exec('/usr/bin/php', array(__DIR__.'/write_file.php'原创 2017-05-17 09:16:52 · 233 阅读 · 0 评论 -
[李景山php] 异步tcp 客户端 swoole
$client = new swoole_client(SWOOLE_SOCK_TCP, SWOOLE_SOCK_ASYNC);//注册连接成功回调$client->on("connect", function($cli) { $cli->send("hello world\n");});//注册数据接收回调$client->on("receive", function($cli, $原创 2017-05-17 09:16:13 · 278 阅读 · 0 评论 -
[李景山php] swoole tcp 客户端
$client = new swoole_client(SWOOLE_SOCK_TCP);//连接到服务器if (!$client->connect('127.0.0.1', 9501, 0.5)){ die("connect failed.");}//向服务器发送数据if (!$client->send("hello world")){ die("send failed原创 2017-05-17 09:15:29 · 244 阅读 · 0 评论 -
[李景山php] swoole 异步 tcp服务器使用
$serv = new swoole_server("127.0.0.1", 9501);//设置异步任务的工作进程数量$serv->set(array('task_worker_num' => 4));$serv->on('receive', function($serv, $fd, $from_id, $data) { //投递异步任务 $task_id = $serv->ta原创 2017-05-17 09:14:43 · 295 阅读 · 0 评论 -
[李景山php] swoole 之 定时器
//每隔2000ms触发一次swoole_timer_tick(2000, function ($timer_id) { echo "tick-2000ms\n";});//3000ms后执行此函数swoole_timer_after(3000, function () { echo "after 3000ms.\n";});原创 2017-05-17 09:13:57 · 315 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第四章:函数的实现 --匿名函数及闭包
匿名函数及闭包匿名函数是一类不需要指定标示符,而又可以被调用的函,匿名函数可以方便的作为参数传递给其它函数,最常见应用为回调函数。闭包(Closure)说到匿名函数,就不得不提到闭包了,闭包是词法闭包的简称,是引用了自由变量的函数,这个被应用的自由变量将和这个函数一同存在,即使离开了创建它的环境一个一样,所以闭包也可以任务是有函数和其它相关引用组合而成的实体。使用create_function()创原创 2017-05-17 09:08:14 · 294 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第四章:函数的实现 --函数的调用和执行
内置函数和用户自定义函数在调用的过程中有什么不一样的呢?函数的调用函数被调用需要一些基本的信息,比如函数的名称,参数及函数的定义(也就是函数的具体执行内容),从我们开发者的角度来看,定义了一个函数我们在执行的时候自然知道这个函数叫什么名字,以及调用的时候传递了什么参数,函数的操作内容。但是对于Zend引擎不能想我们这样能“看懂”php源代码,但它需要对代码进行处理以后才能执行。我们还是以下两个小例子原创 2017-05-17 08:32:05 · 330 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第四章:函数的实现 --函数的返回值
函数的返回值在PHP中,函数都有返回值,分两种情况,使用return语句明确的返回和没有return语句的返回NULL.return语句当使用return语句时,PHP给用户自定义的函数返回指定类型的变量。通过词法分析和语法分析,生成中间代码,从Zend/zend_language_parse.y文件中可以确认其生成中间代码调用的是zend_do_return函数。生成的中间代码为 ZEND_RET原创 2017-05-17 08:02:20 · 302 阅读 · 0 评论 -
[李景山php] swoole 进程信号触发
swoole_process::signal(SIGALRM, function () { static $i = 0; echo "#{$i}\t alarm\n"; $i++; if ($i > 20) { swoole_process::alarm(-1);// 清除定时器 }});//100msswoole_process::ala原创 2017-05-17 09:19:18 · 934 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第二章:用户代码执行--SAPI概述-Apache模块-FastCGI
Apache 模块apache 是 Apache软件基金会的一个开发源代码的web服务器,可以在大多数电脑操作系统中运行,由于其跨平台和安全性被广泛使用,最流行的Web服务器端软件之一。Apache支持许多特性,大部分通过模块扩展实现。场景的模块包括 mod_auth(权限验证)、mod_ssl(SSL和TLS支持) mod_rewirte(URL重写)等。当PHP需要在Apache服务器下运行时,原创 2017-05-08 20:37:38 · 399 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第五章:类和面向对象 --访问控制的实现
访问的控制实现面向对象的三大特征(封装,继承,多态),其中封装是一个非常重要的特性。封装隐藏了对象内部的细节和实现,使对象能够集中而完整的描述并对应一个具体的事物,只提供对外的访问接口,这样可以在不改变接口的前提下改变实现细节,而且能使对象自我完备。封装还可以增强安全性和简化编程。在面向对象的语言中一般是通过访问控制来实现封装的特性。php提供了public,protected,private 三个原创 2017-05-19 08:33:39 · 280 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--HashTable-1
哈希表(Hash Table)PHP用的最多的是字符串及数组,PHP容易上手也得益于灵活的数组类型。 哈希表通常提供查找(Search),插入(Insert),删除(Delete)等操作,通常哈希表的这些操作时间复杂度为O(1)。基本概念哈希表是一种通过哈希函数,将特定的键映射到特定的值的一种数据结构,它维护键和值之间一一对应关系。键(key):用于操作数据的表示,例如PHP数组中的索引,或者字符原创 2017-05-10 09:30:44 · 299 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型
第一节:变量的结构和类型类型:如:字符串,数组,对象等 粗略分为: 强类型:一旦定义类型,不得改变类型,仅仅可以改变值,需要类型转换。 弱类型:一个变量可以表示任意的数据类型。是一个双刃剑。官方的php变量内部实现:使用数据结构zval来保存,这个结构同时表示php中的各种数据类型,它不仅仅包含变量的值,也包含变量的类型。这就是PHP弱类型的核心。zval结构具体是如何实现弱类型的呢?一探究竟原创 2017-05-09 22:17:08 · 248 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--简略
世界上唯一不变的变化。现代编程语言中的基本元素主要有:变量,流程控制接口,函数等等,我们能否不使用变量来编写程序呢?这显然是可以的,例如:<?phpecho 'hello world';变量具有三个基本组成部分:1 名称: 变量的标识符:像是小狗的名称。PHP同时还支持复合变量,也就是类似$$a的变量,它会进行两次的解释。这给PHP带来了非常灵活的动态特性。 2 类型:变量的类型,像是小狗的类型原创 2017-05-09 21:38:44 · 233 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第二章:用户代码执行--opcode处理函数查找
从PHP5.1开始,PHP对opcode的分发方式可以用户自定义,分为CALL,SWITCH和GOTO三种类型。默认使用的CALL的方式。Debug法opcode的执行由在文件Zend/zend_vm_execute.h中的execute函数执行。 这样就可以方便的知道当前要执行的处理函数了,这种debug的方法,这种方法比较麻烦,需要使用gdb来调试。计算法zend_vm_get_opcode_原创 2017-05-09 20:23:13 · 602 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第二章:用户代码执行--opcode
opcodeopcode是计算机指令中的一部分,用于指定要执行的操作,指令的格式和规范由处理器的指令规范指定。除了指令本身以外通常还有指令所需要的操作数,可能有的指令不需要显式的操作数,这些操作数可能是寄存器中的值,堆栈中的值,某块内存的值或者IO端口中的值等等。通常opcode还有另一种称谓:字节码(byte codes).例如java虚拟机(JVM),.NET的通用中间语言等等PHP的opcod原创 2017-05-09 20:01:28 · 276 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第五章:类和面向对象 --类的结构和实现
PHP内部类是怎么实现的?它的内存布局及存储是怎么样的呢?继承、封装、多态又是怎么实现的呢?类的结构首先看一下类的内部存储结构:struct _zend_class_entry{ char type;// 类型: ZEND_INTERNAL_CLASS / ZEND_USER_CLASS char *name;//类名称 zend_uint name_length;//原创 2017-05-18 08:45:34 · 295 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第五章:类和面向对象 --简介
类及面向对象楼主,我想问个问题,就是,没有对象的怎么办?类是具体事物的抽象,对象是类的实例。PHP类的特征:访问控制,抽象类,final类,类方法,魔术方法,接口,对象克隆,类型提示,命名空间,延迟静态绑定,__callStatic() , __invoke()PHP中的对象是引用传值,简单点说,就是共用地址,不是传参。原创 2017-05-18 08:20:04 · 341 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第二章:用户代码执行--PHP脚本的执行
脚本执行: 在前面的章节介绍了PHP的生命周期,PHP的SAPI,SAPI处于整个架构较上层,而真正的执行主要由Zend引擎来完成,这一小节我们介绍PHP脚本的执行。目前编程语言可以分为两大类: 第一类:像C/C++,.NET,Java之类的编译型语言,它们的共性是:运行之前必须对源代码进行编译,然后运行编译后的目标文件。 第二类:比如PHP,javascript,Ruby,Python这些解原创 2017-05-09 08:55:49 · 772 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第二章:用户代码执行--SAPI概述-PHP中的CGI实现
PHP中的CGI实现PHP的CGI实现了Fastcgi协议,是一个TCP或UDP协议的服务器接受来自Web服务器的请求,当启动时创建TCP/UDP协议的服务器的socket监听,并接收相关请求进行处理。随后就进入了PHP的生命周期:模块初始化,sapi初始化,处理PHP请求,模块关闭,sapi关闭等就构成了整个CGI的生命周期。以TCP为例,在TCP的服务端,一般会执行这样几个操作步骤: 1 调用原创 2017-05-08 21:59:17 · 395 阅读 · 0 评论 -
转载:linux 内核网络发送数据 流程图
数据发送网络流程图原创 2017-05-16 15:34:30 · 886 阅读 · 0 评论 -
从配置角度来说制约linux高并发的两个点
第一:并发连接数,线程/进程数据 第二:网络连接数原创 2017-05-16 15:24:34 · 373 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第四章:函数的实现 --函数的参数
函数的参数上回书说到:函数的定义是一个将函数名注册到函数列表的过程。 函数的参数检查是通过zend_do_receive_arg函数实现的。用户自定义函数的参数在zend_do_receive_arg函数中对于参数的关键代码如下:CG(active_op_array)->arg_info = erealloc(CG(active_op_array)->arg_info, sizeof(zend_a原创 2017-05-16 10:37:04 · 362 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的作用域
变量的作用域是变量的一个作用范围,在这个范围内变量为可见的,即可以访问变量的代码区域,相反,如果不在这个范围内变量是不可见的,无法被调用。全局变量与局部变量当全局变量跟局部变量重名时候,如何区分呢?对于全局变量,Zend引擎有一个_zend_executor_globals结构,该结构中的symbol_talbe就是全局符号表,其中保存了在顶层作用域中的变量。同样,函数或者对象的方法在被调用是会创建原创 2017-05-12 08:25:58 · 483 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第五章:类和面向对象 --概览
魔术函数与魔术方法php定义了一些,当特定的机会自动调用的函数,一般通常用 __ 开头,php 的类是 PHP内部的一个 _zend_class_enty结构体,正常常用的解析方法。self parent static 类它指向当前类,但只有在类定义内部才有效,但也不一定执行类本身这个特殊类。对象对象在PHP中使用一种zend_object_value的结构体存储。对象的创建,在PHP代码中,对象的原创 2017-05-23 08:50:16 · 650 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的赋值和销毁
变量的赋值和销毁变量的声明和赋值在PHP中没有对常规变量的声明操作,如果要使用一个变量,直接进行赋值操作即可,在赋值操作的同时已经进行声明操作。一个简单赋值操作:$a = 10使用 VLD扩展查看其生成的中间代码为ASSIGN。依此,我们找到其执行的函数为 ZEND_ASSIGN_SPEG_CV_CONST_HANDLER,CV是PHP在5.1后增加的一个在编译期的缓存。如我们在使用VLD查看上面的原创 2017-05-11 17:19:42 · 396 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的生命周期
变量的生命周期在ZE进行词法和语法的分析之后,生成具体的opcode,这些opcode最终被excute函数(Zend/zend_vm_exectue.h 46)解释执行。这里的EX(opline)->handler(…)将op_array中的操作顺序执行,其中变量赋值操作在ZEND_ASSIGN_CV_CONST_HANDLER()函数中执行。ZEND_ASSIGN_SPEC_CV_CONST_H原创 2017-05-11 16:54:06 · 337 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--类型提示的实现
在php5.1 之后,添加了数组及对象的类型提示实现,相当于实现了部分强制类型。如下数组的类型提示实例:function array_print(Array arr){ print_r(arr){ print_r(arr); } array_print(1);提示判读的流程图:原创 2017-05-11 16:35:48 · 225 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--静态变量
通常意义上静态变量是静态分配的,他们的生命周期和程序的生命周期一样,只有在程序退出时才结束其生命周期,这和局部变量相反,有的语言中全局变量也是静态分配的。例如PHP和javascript中的全局变量。静态变量可以分为: 静态全局变量,PHP中的全局变量也可以理解为静态全局变量,因为除非明确unset释放,在程序运行中始终存在。 静态局部变量,也就是在函数内定义的静态变量,函数在执行时对变量原创 2017-05-11 16:27:21 · 261 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--预定义变量
预定义变量在PHP脚本执行的时候,用户全局变量(在用户空间显示定义的变量)会保存在一个HashTable数据类型的符号表(symbol_table)中,而我们用得非常多的在全局范围内有效的变量却与这些用户全局变量不同。例如:GET,_GET,_POST,SERVER,_SERVER,_FILES等变量,我们并没有在程序中定义这些变量,并且这些变量也同样保存在符号表中,从这些表象中我们不难得出结论:P原创 2017-05-11 15:46:08 · 312 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--常量
常量PHP常量在指向期间不可改变的特性是如何实现的及常量的定义过程。常量的内部结构typedef struct _zend_constant{ zval value;// zval结构,PHP内部变量的存储结构, int flags;//常量的标记如 CONST_PERSISTENT \ CONST_CS char *name; uint name_len;原创 2017-05-11 15:13:54 · 267 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--链表
链表在Zend引擎中Hash Table的使用非常频繁,这得益于他良好的查找性能。 哈希表会预先分配内容以提高性能,而很多时候数据规模不会很大,固然使用哈希表能提高查询性能,但是某些场景下并不会对数据进行随机查找,这时使用哈希表有点浪费了。zend引擎中的连表是双链表,通过双链表的任意节点都能方便的对链表进行遍历。链表的实现很简单,通常只需要是三个关键元素:1 指向上个元素指针 2 指向下个元素原创 2017-05-11 14:32:30 · 291 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--变量的结构和类型--PHP的哈希实现
对哈希表的需求远不止那么简单。对性能,灵活性都有不同的需求。下面我们看看PHP中的哈希表是怎么实现的。PHP的哈希实现PHP内核中的哈希表是十分重要的数据结构,PHP的大部分语言特性都是基于哈希表实现的,例如:变量的作用域、函数表、类的属性、方法等,Zend引擎内部的很多数据都是保存在哈希表中的。数据结构及说明上一节提到PHP中的哈希表是使用链接法来解决冲突的,具体点讲就是使用链表来存储哈希到同一个原创 2017-05-11 12:08:54 · 214 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第三章:变量及数据类型--global语句
global语句globlal语句的作用是定义全局变量。词法解析查看Zend/zend_language_scanner.l文件<ST_IN_SCRIPTING>"global"{ return T_GLOBAL;}语法解析在词法解析完后,获得了token,此时通过这个token,我们去Zed/zend_language_parse.y进行语法解析。生成并执行中间代码ZEND_FETCH原创 2017-05-12 08:40:51 · 412 阅读 · 0 评论 -
[李景山php] 桥接,虚拟机无法连接外网,因为没有配置网关
route add default gw 192.168.199.1静态,网关设置。原创 2017-05-12 11:12:03 · 460 阅读 · 0 评论 -
[李景山php] 深入理解PHP内核[读书笔记]--第四章:函数的实现 --函数的参数-1
函数的参数上回书说到:函数的定义是一个将函数名注册到函数列表的过程。 函数的参数检查是通过zend_do_receive_arg函数实现的。用户自定义函数的参数在zend_do_receive_arg函数中对于参数的关键代码如下:CG(active_op_array)->arg_info = erealloc(CG(active_op_array)->arg_info, sizeof(zend_a原创 2017-05-16 10:03:53 · 381 阅读 · 0 评论 -
[李景山php] 20170505深入理解PHP内核[读书笔记]--第二章:用户代码执行--生命周期和Zend引擎
不识庐山真面膜,只缘身在此山中。 PHP代码运行示意图:第一步:书写一段php代码。 启动在调用每个模块的模块初始化前,会有一个初始化的过程,它包括:初始化若干全局变量 这里的初始化全局变量大多数情况下是将其设置为NULL,有一些除外,比如设置zuf(zend_utitity_functions),以zuf.printf_function = php_printf为例,这里的php_printf原创 2017-05-06 21:22:45 · 459 阅读 · 0 评论