第16课:PHP扩展

PHP扩展是PHP程序员经常用到的,PHP尽管提供了大量有用的函数,但是在特殊情况下还可能需要进行扩展编程,比如大量的 PECL(PHP Extension Community Library)就是以扩展的形式提供的(动态链接库dll文件),它们比 PEAR 的运行效率要高很多。
PHP 扩展是用 C 或 C++ 编写的,需要编译成动态连接库文件后在PHP环境下注册后才能使用

常用的PHP扩展:curl(接口请求使用)  redis(缓存使用) session(会话) 等等

1.PHP扩展的使用

我们要在linux环境下安装使用某个扩展
[1]/opt/php/bin/phpize先进入phpize具体路径根据你PHP安装目录确定
[2]配置编译 ./configure --with-php-config=/opt/php/bin/php-config --with-扩展名
make && make install会在在/opt/php/lib/php/extensions下产生一个 扩展名.so 文件 
[3]确定php.ini文件中的extension_dir=/opt/php/lib/php/extensions 跟extension=扩展名.so都是设置正确
[4]重启PHP 如果是php-fpm方式 一般通过/etc/init.d/php-fpm reload  或者  restart来重启PHP
[5]验证扩展是否安装 有两种方式,一种是用命令行 php -m查看当前已经安装成功的扩展列表。或者写一个PHP文件,打印出phpinfo信息,查看是否有对应扩展

2.PHP扩展开发
一般都是用C或者C++来开发扩展,需要有相关基础

举例:开发一个打印Godeye.org的扩展
[1]在 php5-5.3.5/ext 目录下,有一个名为 ext_skel 的文件,这是用来创建扩展的一个简便的工具。确保它有可执行权限(chmod u+x ext_skel),在终端下执行
./ext_skel --extname=hello

[2]编辑 config.m4
用文本编辑器打开 ext/hello/config.m4,里面有大量的注释说明(以 dnl 开头的行),基本上已经把很多问题说明白了。这里要做的就是把

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

这三行取消注释。这样在接下来的编译时,可以用 ./configure --enable-hello 来编译我们刚刚写的扩展。

[3]重新生成 configure
回到源代码根目录,运行 ./buildconf --force,会激活 configure --enable-hello 参数。如果你在运行 buildconf 时报下面的错误:

buildconf: Your version of autoconf likely contains buggy cache code.
           Running vcsclean for you.
           To avoid this, install autoconf-2.13.

请安装 autoconf-2.13(ubuntu 懒人的用法)
sudo apt-get install autoconf2.13

[4]编写 hello_world 函数
声明函数:打开 ext/hello/php_hello.h,在
PHP_MINIT_FUNCTION(hello);
PHP_MSHUTDOWN_FUNCTION(hello);
PHP_RINIT_FUNCTION(hello);
PHP_RSHUTDOWN_FUNCTION(hello);
PHP_MINFO_FUNCTION(hello);
后面添加PHP_FUNCTION(hello_world);
即在扩展的头文件中声明了 hello_world 的函数的原型。PHP_FUNCTION 是用来定义 PHP 函数的 C 语言宏。至于宏展开后的样子,几乎不用去想。只管用就可以了

[5]实现函数:打开 hello.c,在文件的末尾添加
PHP_FUNCTION(hello_world){
	php_printf("Godeye.org");return;}
这里即是 hello_world 函数的实现。php_printf 的作用是向 SAPI 输出一段字符串,类似于 PHP 语言中的 echo。

接下来还需要将 hello_world 函数注册到 zend_module_entry,这样这个函数才能在 PHP 程序中变成“可见”的。找到
const zend_function_entry hello_functions[]={
	PHP_FE(confirm_hello_compiled,	NULL)/* For testing, remove later. */{NULL, NULL, NULL}/* Must be the last line in hello_functions[] */};

将其修改为:
const zend_function_entry hello_functions[]={
	PHP_FE(confirm_hello_compiled,	NULL)/* For testing, remove later. */
	PHP_FE(hello_world, NULL){NULL, NULL, NULL}/* Must be the last line in hello_functions[] */};

此时整个的 hello 扩展的代码就编写完了。最后再来 make 一下

[6]测试
在终端下运行 sapi/cli/php -r 'hello_world();echo "\n";',如果看到输出"Godeye.org",就成功了

打赏  如对你有帮助,请我喝杯咖啡吧!