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;";
打赏: 微信
本作品采用 知识共享署名-相同方式共享 4.0 国际许可协议 进行许可。