php 扩展开发 从入门到放弃(一)

从入门到放弃
“放弃” 一词常常是令人沮丧的,而在程序员的世界里,为何遍地都是“入门到放弃”、“从删库到跑路”系列
我认为是程序员的自我调侃。程序开发在很多情况下是枯燥无味的,使用消极的话语也就是反话,来激励自己:“从入门到不要轻易放弃!”

什么是 php 扩展(extensions)

为 php 提供扩展功能。如:通过 ip 查询所在地址、通过手机号查询归属地,这些业务上需要的功能是 php 不自带的,php 要在一个海量数据的文件中获取需要的数据,效率相对是比较低的。

为什么要用 php 扩展

我认为首要原因是性能。php 扩展使用 c 语言编写,众所周知 c 是更加底层的语言,效率要比 php 高出许多。(那我们为什么要用 php?因为高级语言封装了更多的功能,能极大提高开发效率。所以在开发效率与执行效率之间,通常是要做取舍的。)
其次做一些扩展开发,也能让我们更加深入的了解 php(php的实现、生命周期等),我爱 php,毕竟它是世界上最好的语言。

如何查看已经安装的 php 扩展

  • web 方式:<?php phpinfo();
  • cli 方式:php -m

开发第一个扩展 hello(演示的 php 版本是 7.1.23)

1.查看 php 版本

php -v

2.获取 php 源码

git clone -b PHP-7.1.23 git://github.com/php/php-src.git

3.生成 hello 扩展

cd php-src/ext/
./ext_skel --extname=hello
cd hello

4.编辑 hello 扩展
vi config.m4 # 小于 php7 的需要修改该文件,将 3行 dnl 注释去除,php7 以上的版本忽略该步骤

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

vi hello.c

PHP_FUNCTION(hello)
{
    php_printf("hello world");
}

const zend_function_entry hello_functions[] = {
    PHP_FE(hello,   NULL)  /* 添加这行 */
    PHP_FE(confirm_hello_compiled,  NULL)       /* For testing, remove later. */
    PHP_FE_END  /* Must be the last line in hello_functions[] */
};

5.编译安装
在 ext/hello/ 下执行以下命令

/usr/bin/phpize
./configure --with-php-config=/usr/bin/php-config
sudo make 
sudo make install

注:
1) phpize 用绝对路径,避免在 /usr/bin/ 下没有这个命令,你的路径可能是类似: /usr/local/php7/bin/phpize
2) configure 添加 php-config 的路径参数

6.安装 hello 扩展
vi /etc/php.ini 添加行

extension=hello.so

重启 php,如果是 apache 则重启 httpd,如果是 nginx + php-fpm 则重启 php-fpm,让扩展生效

7.试试新出炉的 hello() 函数吧

php -r "hello();echo PHP_EOL;";

如需转载请标注来源: http://lukachen.com/archives/248/

发表新评论