PHP-X是我在2017年初创建的一个新项目,这个项目的目标是让有一定工作经验的PHP程序具备扩展开发的能力。0x002012年开始写swoole的初衷,到现在已经5年了。我发现编写PHP扩展是一项艰巨的工作。在PHP程序员群体中,甚至可以说,100个人中很难找到一个能写出PHP扩展的人。PHP官方对扩展开发者非常不友好。源代码中提供的ZendAPI极难使用。API复杂而凌乱,充满了各种宏的写法。ZendAPI的坑很多,普通开发者很容易踩坑。出现各种莫名其妙的coredump问题。ZendAPI几乎没有文档,开发者要想真正掌握这项技能,需要付出大量的学习时间。所以今年我想出了一个新主意。根据我5年多写swoole扩展的经验,我尝试在ZendAPI和C++之间构建一个封装层,让PHP扩展开发变得简单。具有一定C++基础的PHPer可以轻松开发PHP扩展。PHP-X项目就这样诞生了,开发只用了一个月的时间。它的开发效率非常高。只在我公司工作3年的PHP程序员可以做延期。随后,在公司的多个项目中进行了快速验证。在3小时内修复了很多崩溃和内存泄漏。目前,稳定性、性能和鲁棒性已达到工业水平。0x01StartPHP-X本身是基于C++11开发的,使用cmake编译配置。首先,您需要确保安装了所有依赖项。包括:gcc-4.8或更高版本php-7.0或更高版本,需要php7-dev包cmake-2.8或更高版本然后安装PHP-X。gitclonehttps://github.com/swoole/PHP-X.gitcdPHP-Xcmake.make-j4sudomakeinstall没有任何编译错误,libphpx.so就会成功编译安装到系统的lib目录下。头文件被复制到系统包含目录。这时候需要执行sudoldconfig刷新so文件缓存。0x02新建工程,使用任意开发工具新建test.cc源文件。首先需要引入phpx.h头文件。然后使用using引入phpx命名空间。PHP并没有正式使用C++,所以phpx直接使用php作为命名空间。#includeusingnamespacestd;usingnamespacephp;使用PHPX_EXTENSION宏创建扩展。在这个宏中,只需要newExtension就可以创建一个扩展。构造函数接受2个参数,第一个是扩展的名称,第二个是扩展的版本号。在PHPX_EXTENSION宏中返回指向此扩展对象的指针。PHPX_EXTENSION(){Extension*ext=newExtension("test","0.0.1");returnext;}这里必须使用newExtension,不能直接在栈上创建对象0x03AddfunctionPHPextension的主要功能是提供扩展函数,因为扩展函数是用C/C++代码实现的,所以其性能会比PHP用户函数高几十倍甚至上百倍。在phpx中实现函数非常简单。使用PHPX_FUNCTION实现扩展函数,然后调用Extension::registerFunction注册扩展函数。PHPX_FN是一个辅助宏,实际上扩展为“cpp_hello_world”。cpp_hello_worldPHPX_FUNCTION展开后,包含2个变量。第一个是参数args,第二个是返回值retval。通过操作args和retval这两个变量,就可以实现函数的输入输出我们这里的代码很简单,cpp_test($str,$n),调用这个函数返回一个$n$str的数组。#includeusingnamespacestd;usingnamespacephp;//声明函数PHPX_FUNCTION(cpp_test);PHPX_EXTENSION(){Extension*ext=newExtension("test","0.0.1");ext->registerFunction(PHPX_FN(cpp_test));returnext;}//实现函数PHPX_FUNCTION(cpp_test){//args[1]是这个扩展函数的第二个参数longn=args[1].toInt();//将返回值retval初始化为一个数组Array_array(retval);for(inti=0;istring(5)"hello"[1]=>string(5)"hello"[2]=>string(5)"hello"}可以看到执行结果符合预期。那么恭喜你,现在你已经成功开发了一个PHP扩展。是不是很简单?0x06More上面的例子比较简单,写个扩展函数就可以了。要在实际项目中实际使用PHP-X,您还有很多工作要做。需要C++技能才能了解有关PHP-XAPI的更多信息。另外,使用Eclipse等IDE工具可以实现API的自动提示和补全,让开发变得更简单。与ZendAPI相比,PHP-X更加简单易用。我相信你不会花太多时间来掌握这项技能。以后我会写更多的教程,教大家如何使用PHP-X实现扩展类、资源、回调函数等更复杂的功能。