高级篇
Leslie丶
断剑重铸之日,骑士归来之时。
展开
-
【swoole】关于信号量的总结
昨天提到要给大家一个共享内存的demo,但是我们要知道共享内存需要我们进行读写控制,所以我们这里先介绍一下,前文曾提到过的信号量。(整理内容较多,仔细阅读,有错必纠)。那什么是信号量呢?信号量的使用主要是用来保护共享资源,使得资源在一个时刻只有一个进程(线程) 所拥有。信号量的值为正的时候,说明它空闲。所测试的线程可以锁定而使用它。若为0,说明它被占用,测试的线程要进入睡眠队列中,等待被唤醒。Li原创 2017-03-14 09:56:48 · 1271 阅读 · 0 评论 -
php源码之路第六章第三节 (内存使用:申请和销毁)
内存的申请 通过前一小节我们可以知道,PHP底层对内存的管理,围绕着小块内存列表(free_buckets)、 大块内存列表(large_free_buckets)和剩余内存列表(rest_buckets)三个列表来分层进行的。 ZendMM向系统进行的内存申请,并不是有需要时向系统即时申请,而是由ZendMM的最底层(heap层)先向系统申请一大块的内存,通过对上面三种列表的填充,建立一个类原创 2016-11-17 14:46:04 · 510 阅读 · 0 评论 -
php源码之路第六章第一节 (内存管理概述)
内存是计算机非常关键的部件之一,是暂时存储程序以及数据的空间,CPU只有有限的寄存器可以用于存储计算数据,而大部分的数据都是存储在内存中的,程序运行都是在内存中进行的。和CPU计算能力一样,内存也是决定计算效率的一个关键部分。计算中的资源中主要包含:CPU计算能力,内存资源以及I/O。现代计算机为了充分利用资源,而出现了多任务操作系统,通过进程调度来共享CPU计算资源,通过虚拟存储来分享内存存储能力原创 2016-11-13 23:06:30 · 940 阅读 · 0 评论 -
php源码之路第五章第九节 (标准类)
SPL,PHP标准库(Standard PHP Library),从 PHP 5.0 开始内置的接口和类的集合,从 PHP5.3 开始逐渐成熟并成为内核组件的一部分。但是由于其文档的稀少以及推行的力度不够,导致较多的PHP开发人员对其不了解,甚至闻所未闻。SPL是为了解决典型问题而存在,为了实现一些有效的数据访问接口和类。现在它包括对常规数据结构的访问,迭代器,异常处理,文件处理,数组处理和一些设计原创 2016-11-12 23:20:34 · 491 阅读 · 0 评论 -
php源码之路第四章第二节( 函数的定义,传参及返回值)
很快我们就已经深入到函数了,首先我们从第一种函数:用户自定义的函数开始来认识函数。包括函数的定义,函数的参数传递和函数的返回值三个部分。下面我们将对每个部分做详细介绍。函数的定义在PHP中,用户函数的定义从function关键字开始。如下所示简单示例: function foo($var) { echo $var; } 这是一个非常简单的函数,它所实现原创 2016-11-01 11:38:47 · 715 阅读 · 0 评论 -
php源码之路第四章第一节( 函数间的转换)
函数间的转换在函数调用的执行代码中我们会看到这样一些强制转换: EX(function_state).function = (zend_function *) op_array; 或者: EG(active_op_array) = (zend_op_array *) EX(function_state).function;这些不同结构间的强制转换是如何进行的呢?首先我们来看zen原创 2016-10-31 15:11:23 · 448 阅读 · 0 评论 -
php源码之路第五章第八节 (命名空间)
命名空间的定义是:命名空间(英语:Namespace)表示标识符(identifier)的上下文(context)。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。 在编程语言中,命名空间是一种特殊的作用域,它包含了处于该作用域内的标识符,且本身也用一个标识符来表示,这样便将一系列在逻辑上相关的标识符用一个标识符组织了起来。函数和类的作用域可被视作隐式命名空间,它们和可原创 2016-11-11 23:55:59 · 395 阅读 · 0 评论 -
php源码之路第四章第一节( 函数的内部结构)
函数是一种可以在任何被需要的时候执行的代码块。它不仅仅包括用户自定义的函数,还包括程序语言实现的库函数。用户定义的函数如下所示手册中的展示函数用途的伪代码 function foo($arg_1, $arg_2, ..., $arg_n) { echo "Example function.\n"; return $retval;}任何有效的 PHP 代码都可以编写在函数内原创 2016-10-30 22:39:48 · 609 阅读 · 0 评论 -
php源码之路第三章第一节( 哈希表的实现)
PHP的哈希表实现 之前已经介绍了哈希表的基本原理并实现了一个基本的哈希表,而在实际项目中,对哈希表的需求远不止那么简单。对性能,灵活性都有不同的要求。下面我们看看PHP中的哈希表是怎么实现的。 PHP的哈希实现 PHP内核中的哈希表是十分重要的数据结构,PHP的大部分的语言特性都是基于哈希表实现的,例如:变量的作用域、函数表、类的属性、方法等,Zend引擎内部的很多数据都是保存在原创 2016-10-20 21:48:27 · 1459 阅读 · 2 评论 -
php源码之路第五章第七节 (对象)
对象是我们可以进行研究的任何事物,世间万物都可以看作对象。它不仅可以表示我们可以看到的具体事物,也可以表示那些我们看不见的事件等。对象是一个实体,它具有状态,一般我们用变量来表示,同时它也可以具有操作行为,一般用方法来表示,对象就是对象状态和对象行为的集合体。在之前我们很多次的说到类,对于对象来说,具有相同或相似性质的对象的抽象就是类。因此,对象的抽象是类,类的具体化就是对象,我们常常也说对象是类的原创 2016-11-11 11:03:44 · 462 阅读 · 0 评论 -
php源码之路第三章第七节( 数据类型的转化)
PHP是弱类型的动态语言,在前面的章节中我们已经介绍了PHP的变量都存放在一个名为ZVAL的容器中, ZVAL包含了变量的类型和各种类型变量的值。 PHP中的变量不需要显式的数据类型定义,可以给变量赋值任意类型的数据, PHP变量之间的数据类型转换有两种: 隐式和显式转换。隐式类型转换隐式类型转换也被称为自动类型转换,是指不需要程序员书写代码,由编程语言自动完成的类型转换。在PHP中,我们经常遇到的原创 2016-10-30 16:48:25 · 598 阅读 · 0 评论 -
php源码之路第三章第一节( 变量及数据类型之哈希表)终于终于终于等到你!
现代编程语言中的基本元素主要有:变量,流程控制接口,函数等等。我们能否不使用变量来编写程序呢?这显然是可以的,例如:<?phpecho "Hello TIPI Readers";就和我们仅仅使用二进制也能编程一样,不使用变量也能完成某些工作,不使用变量我们的程序将会非常难以编写和维护,变量可以让我们将值存储起来,以便在程序的其他地方使用,或者通过计算保存新的值。变量具有三个基本组成部分:名称原创 2016-10-20 01:48:34 · 1632 阅读 · 0 评论 -
php源码之路第五章第六节 (PHP保留类及特殊类)
在面向对象语言中,都会内置一些语言内置提供的基本功能类,比如JavaScript中的Array,Number等类, PHP中也有很多这种类,比如Directory,stdClass,Exception等类,同时一些标准扩展比如PDO等扩展中也会定义一些类, PHP中类是不允许重复定义的,所以在编写代码时不允许定义已经存在的类。 同时PHP中有一些特殊的类:self,static和parent,原创 2016-11-10 14:17:20 · 1384 阅读 · 0 评论 -
php源码之路第五章第五节 ( 魔术方法,延迟绑定及静态成员)
PHP中有一些特殊的函数和方法,这些函数和方法相比普通方法的特殊之处在于: 用户代码通常不会主动调用,而是在特定的时机会被PHP自动调用。在PHP中通常以"__"打头的方法都作为魔术方法, 所以通常不要定义以"__"开头的函数或方法。例如:__autoload()函数, 通常我们不会手动调用这个函数, 而如果在代码中访问某个未定义的方法, 如过已经定义了__autoload()函数,此时PHP将会尝原创 2016-11-09 23:08:54 · 1254 阅读 · 0 评论 -
php源码之路第六章第四节 ( 垃圾回收)
垃圾回收机制是一种动态存储分配方案。它会自动释放程序不再需要的已分配的内存块。自动回收内存的过程叫垃圾收集。垃圾回收机制可以让程序员不必过分关心程序内存分配,从而将更多的精力投入到业务逻辑。在现在的流行各种语言当中,垃圾回收机制是新一代语言所共有的特征,如Python、PHP、Eiffel、C#、Ruby等都使用了垃圾回收机制。 PHP也在语言层实现了内存的动态管理,内存的动态管理将开发人员从原创 2016-11-18 02:20:30 · 879 阅读 · 0 评论 -
php源码之路第六章第二节 (PHP中的内存管理)
在前面的小节中我们介绍了内存管理一般会包括以下内容:是否有足够的内存供我们的程序使用; 如何从足够可用的内存中获取部分内存; 对于使用后的内存,是否可以将其销毁并将其重新分配给其它程序使用。 与此对应,PHP的内容管理也包含这样的内容,只是这些内容在ZEND内核中是以宏的形式作为接口提供给外部使用。后面两个操作分别对应emalloc宏,efree宏,而第一个操作可以根据emalloc宏返回结果原创 2016-11-14 23:44:25 · 1020 阅读 · 0 评论 -
php源码之路第六章第五节 ( 写时复制(Copy On Write))
在开始之前,我们可以先看一段简单的代码:<?php //例一 $foo = 1; $bar = $foo; echo $foo + $bar;?>执行这段代码,会打印出数字2。从内存的角度来分析一下这段代码“可能”是这样执行的:分配一块内存给foo变量,里面存储一个1; 再分配一块内存给bar变量,也存一个1,最后计算出结果输出。事实上,我们发现foo和bar变量因为值原创 2016-11-19 23:35:11 · 883 阅读 · 0 评论 -
【Swoole扩展】基础到进阶
首先我们了解一下学习Swoole需要掌握哪些知识:首先是Linux的多进程和线程切换,还有就是消息队列、共享内存等相关进程通信 然后是socket编程然后是底层协议TCP/IP协议,TCP/UDP协议IO复用 ①elect/poll/epoll ②基于select/epoll实现的事件循环,Reactor模型 ③可读事件、可写事件调试tools:使用gdb调试Linux程序 使用strac原创 2017-03-13 11:58:45 · 614 阅读 · 0 评论 -
【Day27】什么是nginx,以及通过 nginx 实现静态文件转发、反向代理和负载均衡的配置
Nginx ("engine x") 是一个高性能的HTTP和反向代理服务器,也是一个IMAP/POP3/SMTP服务器。因它的稳定性、丰富的功能集、示例配置文件和低系统资源的消耗而闻名。 Nginx是一款轻量级的Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,并在一个BSD-like 协议下发行。 其特点是占有内存少,并发能力强,事实上nginx的并发能力确原创 2016-10-19 15:24:00 · 2827 阅读 · 1 评论 -
php源码之路第七章第二节 (来实现自己的语法)
经过前面对r2ec以及Bison的介绍,熟悉了PHP语法的实现,我们来动手自己实现一个语法吧。也就是对Zend引擎语法层面的实现。以此来对Zend引擎有更多的了解。 编程语言和社会语言一样都是会慢慢演进的,不同的语种就像我们的不同国家的语言一样,他们各有各的特点,语言通常也能反映出一个群体的特质,不同语言的社区氛围和文化也都会有很大的差异,和现实生活一样,我们也需要尽可能的去接触不同的文化,来原创 2016-11-28 01:48:13 · 622 阅读 · 0 评论 -
php源码之路第八章第一节 (线程,进程和并发)
进程 进程是什么?进程是正在执行的程序;进程是正在计算机上执行的程序实例;进程是能分配给处理器并由处理器执行的实体。进程一般会包括指令集和系统资源集,这里的指令集是指程序代码,这里的系统资源集是指I/O、CPU、内存等。综合起来,我们也可以理解进程是具有一定独立功能的程序在关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。 在进程执行时,进程都可以被唯一的表原创 2016-12-08 11:45:39 · 381 阅读 · 0 评论 -
php源码之路第七章第三节 (PHP代码的加密解密)
PHP语言作为脚本语言的一种,由于不需要进行编译,所以通常PHP程序的分发都是直接发布源代码。对于一些开源软件来说,这并没有什么问题,因为它本来就希望有更多的人阅读代码,希望有更多的人参与进来,而对于商业代码来说,这却是一个不太好的消息,不管是从商业秘密,还是从对公司产权的保护来说却是一个问题,基于此,从而引出了对PHP代码的加密和解密的议题。例如国内的Discuz论坛程序在开源之前要运行是必须安装原创 2016-12-07 18:23:18 · 1672 阅读 · 0 评论 -
php源码之路循环语句 (foreach的实现)
foreach是PHP的关键字,用来实现基于数据的循环。基于数据循环语句的循环是由数据结构中的元素的数目来控制的。一般来说,基于数据的循环语句会使用一种称之为迭代器的函数来实现元素的遍历。 除了foreach,PHP还提供了预定义的一些函数来实现对数组的迭代访问操作,如current, next, reset等等。然而我们使用得最多的还是foreach语句,foreach可以直接迭代访问数组,原创 2016-12-13 23:40:58 · 3329 阅读 · 0 评论 -
php源码之路第七章第二节 (语法的实现之语法解析)
Bison是一种通用目的的分析器生成器。它将LALR(1)上下文无关文法的描述转化成分析该文法的C程序。使用它可以生成解释器,编译器,协议实现等多种程序。 Bison向上兼容Yacc,所有书写正确的Yacc语法都应该可以不加修改地在Bison下工作。它不但与Yacc兼容还具有许多Yacc不具备的特性。 Bison分析器文件是定义了名为yyparse并且实现了某个语法的函数的C代码。这个函数并不原创 2016-11-25 00:25:40 · 774 阅读 · 0 评论 -
VLD扩展使用指南
VLD(Vulcan Logic Dumper)是一个挂钩在Zend引擎下,并且输出PHP脚本生成的中间代码(执行单元)的扩展。它可以在一定程序上查看Zend引擎内部的一些实现原理,是我们学习PHP源码的必备良器。它的作者是Derick Rethans, 除了VLD扩展,我们常用的XDebug扩展的也有该牛人的身影。 VLD扩展是一个开源的项目,在这里可以下载到最新的版本,虽然最新版本的更新也原创 2016-12-15 00:54:41 · 800 阅读 · 0 评论 -
php源码之路第七章第一节 (语法的实现之词性解析)
语言从广义上来讲是人们进行沟通交流的各种表达符号。每种语言都有专属于自己的符号,表达方式和规则。就编程语言来说,它也是由特定的符号,特定的表达方式和规则组成。语言的作用是沟通,不管是自然语言,还是编程语言,它们的区别在于自然语言是人与人之间沟通的工具,而编程语言是人与机器之间的沟通渠道。相对于自然语言,编程语言的历史还非常短,虽然编程语言是站在历史巨人的基础上创建的,但是它还很小,还是一个小孩。它只原创 2016-11-23 00:04:57 · 564 阅读 · 0 评论 -
php源码之路第七章第一节 ( Zend虚拟机)
在前面的章节中,我们了解到一个PHP文件在服务器端的执行过程包括以下两个大的过程: 递给php程序需要执行的文件, php程序完成基本的准备工作后启动PHP及Zend引擎, 加载注册的扩展模块。 初始化完成后读取脚本文件,Zend引擎对脚本文件进行词法分析,语法分析。然后编译成opcode执行。如过安装了apc之类的opcode缓存, 编译环节可能会被跳过而直接从缓存中读取opcode原创 2016-11-22 12:45:57 · 890 阅读 · 0 评论 -
php源码之路第七章第二节 (中间代码的执行)
我们对opcode进行了一个简略的说明。这一小节我们讲这些中间代码在Zend虚拟机中是如何被执行的。 假如我们现在使用的是CLI模式,直接在SAPI/cli/php_cli.c文件中找到main函数,默认情况下PHP的CLI模式的行为模式为PHP_MODE_STANDARD。此行为模式中PHP内核会调用php_execute_script(&file_handle TSRMLS_CC);来执行原创 2016-12-05 02:16:53 · 1283 阅读 · 0 评论 -
php源码之路第八章第二节 ( PHP中的线程安全)
在多线程系统中,进程保留着资源所有权的属性,而多个并发执行流是执行在进程中运行的线程。如Apache2 中的woker,主控制进程生成多个子进程,每个子进程中包含固定的线程数,各个线程独立地处理请求。同样,为了不在请求到来时再生成线程,MinSpareThreads和MaxSpareThreads设置了最少和最多的空闲线程数;而MaxClients设置了所有子进程中的线程总数。如果现有子进程中的线程原创 2016-12-13 00:21:00 · 663 阅读 · 0 评论 -
php源码之路第八章第一节 (线程,进程和并发)
进程 进程是什么?进程是正在执行的程序;进程是正在计算机上执行的程序实例;进程是能分配给处理器并由处理器执行的实体。进程一般会包括指令集和系统资源集,这里的指令集是指程序代码,这里的系统资源集是指I/O、CPU、内存等。综合起来,我们也可以理解进程是具有一定独立功能的程序在关于某个数据集合上的一次运行活动,进程是系统进行资源分配和调度的一个独立单位。 在进程执行时,进程原创 2016-12-12 21:37:58 · 523 阅读 · 0 评论 -
php源码之路第六章第六节 ( 内存泄漏)
内存泄漏指的是在程序运行过程中申请了内存,但是在使用完成后没有及时释放的现象,对于普通运行时间较短的程序来说可能问题不会那么明显,但是对于长时间运行的程序,比如Web服务器,后台进程等就比较明显了,随着系统运行占用的内存会持续上升,可能会因为占用内存过高而崩溃,或被系统杀掉(OOM)。 PHP的内存泄漏 PHP属于高级语言,语言级别并没有内存的概念,在使用过程中完全不需要主动申请或释放原创 2016-11-21 03:42:32 · 834 阅读 · 0 评论 -
php源码之路第三章第六节( 变量的作用域和global语句)
变量的作用域是变量的一个作用范围,在这个范围内变量为可见的,即可以访问该变量的代码区域,相反,如果不在这个范围内,变量是不可见的,无法被调用。全局变量可以将作用范围看作为整个程序。代码如下: <?php $foo = 'tipi'; function variable_scope(){ $foo = 'foo';原创 2016-10-28 21:25:16 · 947 阅读 · 0 评论 -
php源码之路第二章第二节(SAPI概述之FastCGI)
CGI全称是“通用网关接口”(Common Gateway Interface),它可以让一个客户端,从网页浏览器向执行在Web服务器上的程序请求数据。 CGI描述了客户端和这个程序之间传输数据的一种标准。 CGI的一个目的是要独立于任何语言的,所以CGI可以用任何一种语言编写,只要这种语言具有标准输入、输出和环境变量。如php,perl,tcl等。FastCGI是Web服务器和处理程序之间通信的一原创 2016-10-19 03:12:26 · 1381 阅读 · 0 评论 -
这些git经验够你用一年了(绝对好文!)
使用git在本地创建一个项目的过程$ mkdir ~/hello-world //创建一个项目hello-world$ cd ~/hello-world //打开这个项目$ git init //初始化 $ touch README$ git add README //更新README文件$ git commit -m 'first转载 2016-10-15 11:22:33 · 2364 阅读 · 0 评论 -
【Day23】几道值得研究注意的php相关问题(一)
1.nginx使用哪种网络协议? nginx是应用层 我觉得从下往上的话 传输层用的是tcp/ip 应用层用的是http fastcgi负责调度进程 2. <? echo 'hello tusheng' ; ?> 没有输出结果, 可能是什么原因, 简述的解决此问题的过程(提示: 语法没有问题) 可能服务器上面没有开启短标签short_open_tag =设置为Off,,php.ini开启短标签原创 2016-10-15 01:33:09 · 1536 阅读 · 0 评论 -
php源码之路第四章第四节 (匿名函数及闭包)
匿名函数在编程语言中出现的比较早,最早出现在Lisp语言中,随后很多的编程语言都开始有这个功能了,目前使用比较广泛的Javascript以及C#,PHP直到5.3才开始真正支持匿名函数, C++的新标准C++0x也开始支持了。匿名函数是一类不需要指定标示符,而又可以被调用的函数或子例程,匿名函数可以方便的作为参数传递给其他函数,最常见应用是作为回调函数。闭包(Closure)说到匿名函数,就不得不提原创 2016-11-04 23:44:44 · 998 阅读 · 0 评论 -
【Day22】mysql数据库的优化(一版)
mysql数据库优化的目的是什么?mysql优化是多方面的,原则是减少系统的瓶颈,减少资源的占用,增加系统的反应速度。eg. 通过优化文件系统,提高磁盘I/O的读写速度;通过优化操作系统调度策略,提高mysql在高负荷情况下的负载能力;优化表结构、索引、查询语句等使查询响应更快。在mysql中,可以使用show status语句查询一些mysql的性能参数show status like 'valu原创 2016-10-14 13:04:05 · 1583 阅读 · 0 评论 -
php源码之路第三章第四节( 静态变量)
通常意义上静态变量是静态分配的,他们的生命周期和程序的生命周期一样,只有在程序退出时才结束期生命周期,这和局部变量相反,有的语言中全局变量也是静态分配的。例如PHP和Javascript中的全局变量。静态变量可以分为:静态全局变量,PHP中的全局变量也可以理解为静态全局变量,因为除非明确unset释放,在程序运行过程中始终存在。 静态局部变量,也就是在函数内定义的静态变量,函数在执行时对变量的操作原创 2016-10-24 23:56:37 · 451 阅读 · 0 评论 -
php源码之路第四章第三节(函数的调用和执行)
前面小节中对函数的内部表示以及参数的传递,返回值都有了介绍,那函数是怎么被调用的呢?内置函数和用户定义函数在调用时会有什么不一样呢?下面将介绍函数调用和执行的过程。函数的调用函数被调用需要一些基本的信息,比如函数的名称,参数以及函数的定义(也就是函数的具体执行内容),从我们开发者的角度来看,定义了一个函数我们在执行的时候自然知道这个函数叫什么名字,以及调用的时候给传递了什么参数、函数的操作内容。但是原创 2016-11-04 20:40:06 · 1283 阅读 · 0 评论 -
php源码之路第三章第三节( 预定义变量)
在PHP脚本执行的时候,用户全局变量(在用户空间显式定义的变量)会保存在一个HashTable数据类型的符号表(symbol_table)中,而我们用得非常多的在全局范围内有效的变量却与这些用户全局变量不同。例如:$_GET,$_POST,$_SERVER,$_FILES等变量,我们并没有在程序中定义这些变量,并且这些变量也同样保存在符号表中,从这些表象我们不难得出结论:PHP是在脚本运行之前就将这原创 2016-10-23 23:34:21 · 608 阅读 · 0 评论