原文地址:http://nikic.github.io/2014/02/18/Fast-request-routing-using-regular-expressions.html

前一些日子,我发现了一个叫做Pux的路由库,这个路由库声称自己比现有的路由要快很多,为了实现这个特点,该库使用了 C 语言编写了 PHP 扩展。

然而,当我瞅了几眼它的代码后,我非常怀疑这个库在路由过程中做了错误的优化,而且我能够很容易在不适用扩展的情况下做出更高性能的实现。 当我在看了 benchmarking 代码后更加确定了我的怀疑,因为我发现这里仅仅只是对及其确定的单个路由做了测试。

为了进一步研究这个问题,我写了一个轻量的路由库:...

原文地址http://nikic.github.io/2017/04/14/PHP-7-Virtual-machine.html

写这篇文章的目的是基于 php7,阐述 Zend Virtual Machine 的内部实现。这不是一篇综合描述,我将尽可能地覆盖到所有重要的部分和细节。

本文的描述对象是 php7.2 版本,但是几乎所有的特性都已经应用在了 php7.0/7.1 中了。然而,它们同 php5.x 系列 VM 的不同之处同样也很重要,我会很有耐心的同步描述。

这篇文章主要是从指令的角度来阐述,只有在末尾花了少量篇幅描述了 C 语言实现 VM 的细节。但是在文章开始之前,我想先提供一些实现 VM 的主要代码文件:...

原文地址http://blog.jpauli.tech/2017/01/12/threads-and-php.html

前言

PHP 和线程,单凭这简短的几个字,就足以写一本书。像往常一样,我们不会这么做,但是会给出一定程度上跟这个话题相关的信息与细节。让我们从一些人在谈论这个话题时通常感到的困惑开始,PHP 不是一种线程语言, PHP 的内核没有使用线程,而且 PHP 天生也不允许用户层代码通过任何方式使用多线程作为并发机制。

因此 PHP 跟其他一些技术有很大的区别,例如 Java。Java 不仅自身使用了大量的线程,它还允许用户通过编程来是用线程。然而,PHP 不适用线程是有它的原因的。

PHP 内核没有使用线程,主要是为了...

preface

在之前的文章中,我们已经实现了一些 object handlers 来将我们的 ArrayBuffer 整合到 php 中。但是美中不足的是,我们的 ArrayBufferView 并不支持迭代器操作。也就是它不能像 php 中的数组那样使用foreach来遍历。 那么,我们接下来就来看看迭代器在内核中是如何实现的,并且给我们的 ArrayBufferView 也增加一个迭代器。

get_iterator handler

内核中的迭代器跟用户端的IteratorAggregate接口功能是一样的。一个具有迭代功能的类都有一个get_iterator处理器,它会返回一个zend_object_iterator *类...

Object Handlers

在前面的博文中,已经介绍过一些 object handlers 了,也特别介绍了如何通过指定 handlers 来创建一个自定义的结构和使用clone_obj来对自定义的结构进行克隆操作。 然而,这只是开始:在 php 中,几乎所有的对象操作,都可以通过 object handlers 来实现,而且所有的魔术方法和魔术接口在内核中都是实现了对应的 object handler。此外, 一些 handlers 并没有开放给用户端的 php,例如,内部类可以自定义类的比较操作,而使用 php 代码是无法实现的。

由于 php 中有很多不同的 object handlers,这里只挑几个来讨论,其它的只给...

ArrayBuffer 简介

ArrayBuffer 又叫二进制数组,是一个用来表示通用的,固定长度的二进制数据缓冲区。你不能直接操纵 ArrayBuffer 的内容, 而是创建一个表示特定格式的 buffer 的类型化数组对象(也叫做数据视图对象)来对 buffer 的内容进行读写操作。

我最早了解 ArrayBuffer 是从 JavaScript 开始的,具体的用法和 api 可以参考JavaScript 标准库--ArrayBuffer

那么接下来,我们就给 PHP 扩展一个简单的 ArrayBuffer,顺便巩固一下php 扩展开发之自定义对象的存储

定义 ArrayBuffer 的数据结构和相关 handlers...

前言

对于 php 扩展开发,很多人可能已经不那么陌生了,zend 引擎为了们提供了非常丰富了函数和 macro,来帮助我们很快速的创建一个标准的 php 类,然而,当我们在使用自定义的数据结构(struct), 并想把我们自己定义的数据结构封装成 php 的类的时候可能就会有些困惑,因为我们都知道 php 中的所有变量都是通过 zval 来存储的,而我们自定义的数据结构要怎样才能和 zval 实现完美的对接呢? 以前我通常采用的一种方式就是使用 zend 引擎提供的资源类型,因为资源类型的封装中包含了通用的数据类型,而且有很丰富的函数来操作资源,所以使用起来很简单也很方便。然而,强大的 zend 引擎真的没有其他方式扩展数据结构...

函数调用

很多时候,我们需要通过函数名来调用函数,并传递参数,或者把匿名函数作为函数的参数传递,实现回调。当我们在遇到这样的需求的时候,用 php 代码实现起来肯定是非常容易和简单的。但是,当我们在用 c 语言编写 php 扩展的时候,如何来实现这样的功能呢?下面就一起来深入了解 php 内核,看看如何实现。

在 Zend 引擎中,给我们提供了zend_call_function,call_user_function以及call_user_function_ex函数来帮助我们实现函数调用。在zend_API.h文件中,我们可以看到如下函数原型的声明:

ZEND_API int zend_call_function(...