为什么要开发php扩展?

今天在研究php扩展的时候, 有同学问我为什么要自己动手写php的扩展, 什么场景采用的到? 我回答他在需要处理大量数据的时候, 用c写的扩展性能会高很多。晚上回到家中想起, 假如自己在实际项目中去写php扩展, 很可能不会因为性能原因。因为对于php而言性能本不就是它的优势, 如果因为性能原因我们大可以选择一门更适合的语言去完成这个项目。那什么样的应用场景需要自己亲自动手去开发php扩展呢?
我想如果某些服务需要大批量的应用于各个项目当中, 我觉得它很适合用扩展去解决, 统一管理又独立项目之外而且还能轻松的迁移于各个项目。

用C开发php扩展

1.首先你得有php的源码包, 如果你是用源码包安装的php, 自然它就已经存在你服务器上了, 如果不是通过源码包安装的php需要去网上download一份php的源码包。

2.进入到ext目录, 用php自带的ext_skel生成扩展需要的基本骨架, 我这里定了一个名叫hello的扩展。

1
2
3
4
5
# cd /usr/local/src/php-7.0.9/
# cd ext/
#./ext_skel --extname=hello
# cd ./hello/
# vim config.4

这时候在ext目录下生成了hello的目录, 我们进入目录修改config.4文件, 找到

1
2
3
dnl PHP_ARG_ENABLE(hello, whether to enable hello support,
dnl Make sure that the comment is aligned:
dnl [ --enable-hello Enable hello support])

这三行, dnl是注释符, 我们去除掉这三行的dnl的注释符, 好了之后变成

1
2
3
PHP_ARG_ENABLE(hello, whether to enable hello support,
Make sure that the comment is aligned:
[ --enable-hello Enable hello support])

3.打开hello.c文件。

1
# vim hello.c

找到PHP_FUNCTION(confirm_hello_compiled) 。 在它上面添加

1
2
3
4
5
6
PHP_FUNCTION(hello)
{
zend_string *strg;
strg = strpprintf(0, "This is my first extend");
RETURN_STR(strg);
}

然后再找到PHP_FE(confirm_hello_compiled, NULL), 在这行上面添加

1
PHP_FE(hello,  NULL)

大功告成。

4.我们现在开始编译, 在当下目录执行phpize命令, 生成configure文件。然后就是正常的源码编译安装流程了, 见下面详细命令操作。

1
2
3
# /usr/local/php7/bin/phpize 
# ./configure --with-config-path=/usr/local/php7/bin/php-config
# make && make install

5.这时候新生成的扩展就已经存放在php扩展目录中了, 最后打开php.ini添加一行extension=hello.so.

1
# echo extension=hello.so >> /etc/php.ini

6.我们来实验一把

1
2
3
4
5
6
# php -a
Interactive mode enabled

php > echo hello();
This is my first extend
php >

看到了吧成功了。

用php开发php扩展

除了用c开发php扩展之外, 还有个工具能用php开发php扩展, 它就是Zephir.
Zephir提供了一种类似php的高级语言语法的方式,来自动生成扩展的c语言代码,使编写php扩展变得非常的简单, 因为很简单这里不就多做赘述了, 如果有需要大家可以去查资料, end.

参考

PHP7扩展开发之hello word
Zephir–最简单的php扩展开发工具
zephir 官网