[ PHP 内核与扩展开发系列] 流式访问:访问流与静态资源操作

在你打开一个流之后,就可以在它上面执行 I/O 操作了,使用哪种协议包装 API 创建了流并不重要,它们都使用相同的访问 API。 读 流的读写可以使用下面的 API 函数组合完成,它们多数都是遵循 POSIX I/O 中对应的 API 规范的: int php_stream_getc(php_stream *stream); 从数据流中接收一个字符,如果流上没有数据,则返回 EOF。 …

[ PHP 内核与扩展开发系列] 流式访问:流的概览

通常直接文件描述符相比调用流包装层消耗更少的 CPU 和内存; 不过, 这样会将实现某个特定协议的所有工作都堆积到作为扩展开发者的身上,通过挂钩到流包装层,你的扩展代码可以透明的使用各种内建的流包装,比如HTTP、FTP,以及它们对应的 SSL 版本,另外还有 gzip 和 bzip2 压缩包装。通过 include 特定的 PEAR 或 PECL 模块,你的代码还可以访问其他协议, 比…

[ PHP 内核与扩展开发系列] INI 配置文件:声明和访问 php.ini 设置

在前面的章节中,我们已经学会了 MINIT、MSHUTDOWN,以及 RINIT 和 RSHUTDOWN 等函数的使用,这里我们将介绍并学习 php.ini 设置的使用。 INI 条目被定义在一个完整的独立块,位于 MINIT 方法所在的同一个源文件,并且用下面的一对宏来定义,并在这对宏之间放入一个或者多个条目:PHP_INI_BEGIN() 和 PHP_INI_END()。 这些宏方法…

[ PHP 内核与扩展开发系列] PHP 启动与终止那点事:超全局变量的定义和使用

超全局变量的定义 在 PHP 中有一种“特殊”的全局变量,通常我们把它们称作超全局变量,所谓的超全局变量指的是在全部作用域中始终可用的内置变量,常见的比如 $_GET、$_POST、$_FILE等。 它们会在编译之前就声明,所以在普通的脚本中,可能无法定义其它的超级全局变量。在扩展中,使用超级全局变量最好的示例是 session 扩展,它使用 $_SESSION 在 session_st…

[ PHP 内核与扩展开发系列] PHP 启动与终止那点事:全局变量的定义和使用

这一章节,我们将学习如何在 PHP 扩展中使用全局变量。 在扩展中定义全局变量 首先,我们需要在扩展的头文件中(默认是 php_*.h)中定义所有的全局变量。举个例子,比如我们要定义一个 unsigned long 类型的全局变量,可以这么做: ZEND_BEGIN_MODULE_GLOBALS(sample4) unsigned long counter; ZEND_END_MODUL…

[ PHP 内核与扩展开发系列] PHP 启动与终止那点事:常量的底层实现

在脚本中使用扩展的一个方便之处是,人们可以改变自己定义的常量,你可以通过 define() 函数来定义一个常量。在内核中,我们将会使用 REGISTER_*_CONSTANT() 的家族函数来注册常量。 对于自定义的大多数常量来说,你可能希望在程序初始化的时候便定义这些常量: PHP_MINIT_FUNCTION(sample4) { REGISTER_STRING_CONSTANT(“…

[ PHP 内核与扩展开发系列] PHP 启动与终止那点事:一次请求的生命周期

在前面的章节里,你已经学会了如何使用 MINIT 函数在 PHP 加载模块的共享库时来执行初始化任务。在第一章,你还了解到扩展里其他三个函数:和 MINIT 函数对应的 MSHUTDOWN 函数,以及在每个页面请求开始和结束时候调用的方法 —— RINIT 函数和 RSHUTDOWN 函数。 除了上面说到的四个函数,还有两个函数只用于处理单个线程的启动和关闭,它们只作用于线程环境。 回顾…

[ PHP 内核与扩展开发系列] 类与面向对象:访问对象实例的属性和方法

上一章节里,我们看了一下如何在 PHP 扩展里定义类与接口,这一章节我们将学习一下如何在 PHP 扩展中操作类的实例 —— 对象。PHP语言中的面向对象其实是分为三个部分来实现的:class、object、refrence。class 就是我们所说的类,可以直观的理解为前面章节中所描述的 zend_class_entry。object 就是类的实际对象。每一个 zval 并不直接包含具体…

[ PHP 内核与扩展开发系列] 类与面向对象:接口实现与类的继承

定义接口 定义一个接口还是很方便的,我先给出一个 PHP 语言中的实现: <?php interface i_myinterface { public function hello(); } 其在扩展中的实现是这样的: zend_class_entry *i_myinterface_ce; static zend_function_entry i_myinterface_metho…

[ PHP 内核与扩展开发系列] 类与面向对象:如何定义一个类

zend_class_entry zend_class_entry 是内核中定义的一个结构体,是内核实现 PHP 语言中类与对象的一个非常基础、关键的结构类型,相当于我们定义类的原型。如果我们想获得一个名字为 myclass 的类该怎么做呢?首先我们定义一个 zend_class_entry 变量,并为它设置名字,最后注册到 runtime 中去: zend_class_entry *m…

123