文档章节

PHP-X介绍

o
 osc_y4jbxqkl
发布于 2018/02/07 19:50
字数 1050
阅读 7
收藏 0

「深度学习福利」大神带你进阶工程师,立即查看>>>

 

为什么要开发PHP扩展

PHP-X是用来开发PHP扩展的库。PHP代码写得好好的,为啥要开发PHP扩展呢?
1、我们知道PHP不擅长CPU密集型的操作,那么把CPU密集型的相关代码迁移到扩展上,就可以大幅提高效率了,比如加密mcrypt、序列化igbinary、图像处理gd2等。

2、另外有些系统相关的操作,PHP没有提供接口,那么也可以通过扩展开提供,比如多进程PCNTL、多线程Pthread、文件事件inotify等。

3、追踪PHP的调用,为代码优化提供建议,比如各种监控APM。

大牛们说的从用户空间沉降到内核空间,就是指从PHP代码改为扩展。

开发扩展用的语言

PHP的解释器ZendEngine提供了一些列C接口,可以用C、C++语言来开发接口。
由于扩展都是以动态库的形式提供,理论上能生成动态库并符合Zend接口的语言都可以,比如有人就用Rust来开发PHP扩展。
另外还可以用Zephir,专门用来开发PHP扩展的语言,著名的Phalcon就是用Zephir开发的。

使用C/C++开发扩展的姿势

使用Zend提供的API来开发接口,实际上并不是很方便,具体的流程可以看这篇[教程](
http://www.php-internals.com/book/?p=chapt11/11-02-00-extension-hello-world)。

那么我们怎么开发呢?使用PHP-X,它是Swoole作者开源的,封装了Zend的API,
可以方便的使用C\C++来开发PHP扩展。

安装PHP7

PHP-X只支持PHP7以上,这里我们使用PHP7.1来开发,测试发现PHP7.2暂时还不支持。
下面我们将在centos7环境上进行,你可以选择自己喜欢的Linux系统。
自发现了remi源里面有各种PHP相关的软件包,我就变懒了,不再手工编译了。
1.先安装remi源 ,网址
yum install -y https://mirrors.tuna.tsinghua.edu.cn/remi/enterprise/remi-release-7.rpm
2.编辑remi配置 vi /etc/yum.repos.d/remi-php71.repo 打开PHP7.1

3.安装PHP以及开发PHP的开发库
yum install php php-devel -y
4.安装cmake、gcc等
yum install cmake3 make gcc gcc-c++ git -y
5.编译PHP-X
先下载PHP-X的代码,git clone https://github.com/swoole/PHP-X
进入PHP-X文件夹

cmake .
make -j 4
sudo make install

可以看到如下输出:

libphpx.so被安装到了/usr/local/lib下
6.测试
进入example/cpp_ext 目录下
make install
会自动把生成的cpp_ext.so复制到PHP的扩展目录。
这时可以修改php.ini,remi源使用的是php.d文件夹中的ini,即每个扩展独立的配置,这种做法比修改完整的php.ini更好。
我们也采用这种方式。
下查看一下配置目录,如下:

然后新建cpp_ext.ini,内容为:

extension=cpp_ext.so

复制 cp cpp_ext.ini /etc/php.d/

运行 php -m | grep cpp_ext 如果有输出,则安装成功。

如果出现下面的错误,表示libphpx.so动态库没找到,我们需要配置一下动态库的加载路径。

使用ldd查看一下cpp_ext.so,确实没找到libphpx.so。

配置动态库加载路径

  • 先查看环境echo $LD_LIBRARY_PATH变量,如果输出为空,则配置为export LD_LIBRARY_PATH=/usr/local/lib/
    如果不为空,则export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:/usr/local/lib/
  • 刷新环境变量 source ~/.bashrc
  • 刷新动态库缓存 lddconfig

 

更多的文档可以参考作者在PHPCon China 2017上使用C++开发PHP7扩展 的演讲(PS:网页上还有有其它演讲者的ppt,值得一看,或者在这里下载)以及官网文档

扩展

我们看到使用PHP-X编写的扩展库,并不能独立运行,还需要libphpx.so才行。那么可以做到扩展独立吗?

熟悉C\C++的人知道,库分为动态库,和静态库。如果编译的时候把PHP-X编译为静态库,并采用静态链接的方式,就可以把我们的自己编写的扩展独立于libphpx.so了。

独立的好处在于部署方便,发布后用户就不用额外依赖PHP-X了;坏处在于如果都使用PHP-X,就造成了代码冗余。

另外类似PHP-X的还有国外的PHP-CPP。

 

 
 
 
 
o
粉丝 0
博文 500
码字总数 0
作品 0
私信 提问
加载中
请先登录后再评论。
程序猿媛一:Android滑动翻页+区域点击事件

滑动翻页+区域点击事件 ViewPager+GrideView 声明:博文为原创,文章内容为,效果展示,思路阐述,及代码片段。文尾附注源码获取途径。 转载请保留原文出处“http://my.oschina.net/gluoyer...

花佟林雨月
2013/11/09
4.3K
1
opm-server-mirror

代码更新 2009-11-25: 加入反爬虫功能。直接Web访问服务器将跳转到Google。 使用方法 下载index.zip 解压index.zip得到index.php 将index.php传到支持php和cURL的国外服务器上 打开 http:/...

luosheng86
2013/01/29
1K
0
tiny php template--TPT

关于TPT TPT是php实现的用于模板解析小工具,全部实现仅仅60行代码。 配置 DIRCOMPILED和DIRTEMPLATE,分别表示模版编译目录和模版文件目录: define('DIRCOMPILED','/compileddiy');define(......

红猪-侠
2013/03/03
1K
1
PHP web 服务器--YACS

YACS 是一个强大的 PHP 脚本,可以让你维护一个动态的 Web 服务器。 特性: - Runs on your own server, or on a shared web site - Post articles with web forms, by e-mail, or remotely ......

匿名
2013/03/18
864
0
PHP框架--XiunoPHP

XiunoPHP 是一款面向高负载应用的 PHP 开发框架,PHPer 通过它可以快速的简单的开发出高负载项目。 XiunoPHP 前身名为 Xiuno Framework,更名后版本号从 v1.0 开始计算。已经经过了多年的实际...

匿名
2013/03/20
2.5K
0

没有更多内容

加载失败,请刷新页面

加载更多

一年Node.js开发开发经验总结

写在前面 不知不觉的,写Node.js已经一年了。不同于最开始的demo、本地工具等,这一年里,都是用Node.js写的线上业务。从一开始的Node.js同构直出,到最近的Node接入层,也算是对Node开发入门...

osc_2fb62vw0
9分钟前
0
0
详解斜率优化

详解斜率优化 斜率优化的话前几个月学过一次,然后感觉会了,结果今天遇到个题,比赛时花了1h硬敲没怼出来,然后又去看了看人家的讲解,加上自己疯狂yy,才发现(原来很水嘛)上次只是略懂皮...

osc_eumlh0pn
10分钟前
0
0
pytest文档46-关于https请求警告问题(InsecureRequestWarning: Unverified HTTPS request is being made)

前言 使用 pytest 执行 https 请求用例的时候,控制台会出现警告:InsecureRequestWarning: Unverified HTTPS request is being made. Adding certificate verification is strongly advised......

osc_8s3utzxr
11分钟前
8
0
进程间通信和线程间通信的几种方式

进程间通信和线程间通信的几种方式 进程、线程、协程之概念理解 进程和线程、协程的区别 进程 进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的...

osc_we9lokaj
12分钟前
0
0
给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如"Aa"不能当做一个回文字符串。注 意:假设字符串的长度不会超过 1010。

给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串。在构造过程中,请注意区分大小写。比如"Aa"不能当做一个回文字符串。注 意:假设字符串的长度不会超过 1010...

osc_kedi1mvz
13分钟前
0
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部