还是360指数项目,需要用到Query归一化,但是公司内只有c++版本的,数据分析的同事用的都是那个二进制可执行文件来处理,但是我们前端又不可能跑system()方法吧,太不安全了,所以要来了源代码,打算封装成一个php扩展。

下边就讲一下我的封装过程。

首先,要到了Query归一化的C++版本源代码。

引用第三方的类库有两种方法,一种是静态引用,一种是动态引用,推荐使用静态引用,因为静态引用的情况下,会把类库打包到php的扩展.SO文件中,这样我们不必担心依赖关系,带着类库到处跑了。

阅读全文

生成一个PHP扩展.so文件,一般就是这两种方法,第一种是在php源码内configure –[with|enable]-extension_name,然后make && make install,新扩展就会生成并保存在PHP的环境中了。

不过多半会有这种情况,我们跟别人共用一台开发机,开发机已经安装了标准的php开发环境,如果我们在用这种重新编译PHP的情况,如果我们有调试php源码,或者调试扩展,很有可能会损坏原有的标准环境,所以我们就需要另一种方法,只生成一个.so文件,然后把so手动放到标准环境下,就可以不影响大局了。

这种方式呢,也很简单,跟第一种方法一样,三步搞定。

一、phpize

进入你开发php扩展的扩展根目录,比如我想做的扩展是 fkhelloworld,目录在这里 /home/s/www/fukun/clang/php-5.2.6/ext/fkhelloworld.

在这里执行phpize,如果提示找不到此命令,就找到你php的bin目录,执行全路径的命令,比如我的phpize在这里:/home/s/apps/php-5.2.6/bin/phpize

If you look in the current directory at this point, you’ll notice a lot more files than you had there a moment ago. The phpize program combined the information in your extension’s config.m4 file with data collected from your PHP build and laid out all the pieces necessary to make a compile happen. This means that you don’t have to struggle with makefiles and locating the PHP headers you’ll be compiling against. PHP has already done that job for you.

phpize会结合你的config.m4文件中描述的信息以及你的php构建相关数据,制定合并所需的部分数据,这意味着你不必再在意makefile文件和定位要编译的php文件头,PHP已经把这些都做好了。

阅读全文

首先要知道, ZEND_NUM_ARGS()宏定义可以得到参数的个数。

参数解析函数:

int zend_parse_parameters(int num_args TSRMLS_DC, char *type_spec, …);

第一个参数num_args表明了我们想要接收的参数个数,一般都使用ZEND_NUM_ARGS() 来表示对传入的参数“有多少要多少”,如果有特殊需求,可以自己直接指定。第二参数应该总是宏 TSRMLS_CC 。第三个参数 type_spec 是一个字符串,用来指定我们所期待接收的各个参数的类型,有点类似于 printf 中指定输出格式的那个格式化字符串。剩下的参数就是我们用来接收PHP参数值的变量的指针。需要说明的一点是:zend_parse_parameters中如果声明了一个字符串类型,那么后面对应的参数将是两个,第一个代表字符串,第二个代表字符串长度。如果声明了一个指定类型的对象实例,那么后面对应的参数也是两个,第一个代表对象,第二个代表对象的类型。

type_spec 的各类型表示如下:

• l – 长整数

• d – 双精度浮点数

• s – 字符串(也可能是空字节)和其长度

• b – 布尔值

• r – 资源, 保存在 zval*

• a – 数组, 保存在 zval*

• o – (任何类的)对象, 保存在 zval*

• O – (由class entry 指定的类的)对象, 保存在 zval*

• z – 实际的 zval*

| – 表明剩下的参数都是可选参数。

/ – 表明参数解析函数将会对剩下的参数以 SEPARATE_ZVAL_IF_NOT_REF()

的方式来提供这个参数的一份拷贝, 除非这些参数是一个引用。

! – 表明剩下的参数允许被设定为 NULL(仅用在a、o、O、r和z身上)。

下边给几个例子,自己体会下:

阅读全文

作者的图片

DigDeeply

Technology Stack: Golang/PHP/Openresty, and so on…

Web Development Engineer

Beijing China