Zephir安装
前置条件
根据官方文档,安装和使用Zephir之前需要准备好这些软件和库
gcc >= 4.x/clang >= 3.x
re2c 0.13 or later
gnu make 3.81 or later
autoconf 2.31 or later
automake 1.14 or later
libpcre3
php development headers and tools
如果是ubuntu/debian/deepin等发行版就好办了
$ sudo apt-get update
$ sudo apt-get install git gcc make re2c php7.0 php7.0-json php7.0-dev libpcre3-dev
安装Zephir
$ git clone https://github.com/phalcon/zephir
$ cd zephir
$ ./install -c
检查一下是否安装成功
$ zephir help
_____ __ _
/__ / ___ ____ / /_ (_)____
/ / / _ \/ __ \/ __ \/ / ___/
/ /__/ __/ /_/ / / / / / /
/____/\___/ .___/_/ /_/_/_/
/_/
Zephir version 0.9.11-0161027a24
Usage:
command [options]
Available commands:
api [--theme-path=/path][--output-directory=/path][--theme-options={json}|/path]Generates a HTML API
compile Compile a Zephir extension
install Installs the extension (requires root password)
version Shows the Zephir version
help Displays this help
init [namespace] Initializes a Zephir extension
fullclean Cleans the generated object files in compilation
builddev Generate/Compile/Install a Zephir extension in development mode
stubs Generates extension PHP stubs
build Generate/Compile/Install a Zephir extension
generate Generates C code from the Zephir code
clean Cleans the generated object files in compilation
Options:
-f([a-z0-9\-]+) Enables compiler optimizations
-fno-([a-z0-9\-]+) Disables compiler optimizations
-w([a-z0-9\-]+) Turns a warning on
-W([a-z0-9\-]+) Turns a warning off
这就是安装成功了
编写一个demo
如何下手呢?上面的zephir help已经给过我们提示了
init [namespace] Initializes a Zephir extension
我们可以这样创建一个新工程,比如按照官网文档上的
$ zephir init utils
这样我们就生成了一个目录
utils/
看一下结构
$ cd utils
$ ls
ext/ utils/ config.json
其他暂且不管,我们的代码应该在utils/utils/下面编写
//必然是喜闻乐见的helloworld
//创建文件greeting.zep
namespace Utils;
class Greeting
{
public static function say()
{
echo "hello world!";
}
}
保存之后,终端工具编译安装一下,可以只编译(zephir compile),也可以只安装(zephir install),我们按照官网的例子,既编译又安装,so
//在你刚才创建的工程目录下
$ zephir build
执行这个命令会先把zephir代码解析成C代码,然后编译该C代码成.so库文件,最后放进你的php扩展库目录,最后一步会要求你提供root账号的口令,输入口令后会提示你不要忘了重启web服务器
//我们看一下这台服务器上的php扩展库目录
$ php -i | grep extension_dir
extension_dir => /usr/lib/php/20151012
//进入这个目录看一下
$ ls /usr/lib/php/20151012|grep utils
utils.so
没问题,然后我们编辑一下配置文件php.ini或者在扩展配置文件目录(我是这个:/etc/php/7.0/cli/conf.d/)新建文件utils.ini,写入一行
extension=utils.so
注意:
debian/ubuntu系的发行版php和php-cli的配置文件和扩展配置文件目录都是独立的,如果该扩展需要在web服务器环境下使用,需要在相应位置重复上述过程,具体文件位置,使用phpinfo()查看
如果一切顺利,此时执行php -m就可以看到utils扩展
$ php -m | grep utils
utils
我们写一个php脚本,试试这个扩展能不能用
echo Utils\Greeting::say(), "\n";
终端执行一下(当然也可以浏览器访问一下)
$ php test_utils.php
hello world!
写个真正有用的!
hello world并没有太大用处,我们写一个别的,比如扩充一下php的二维数组操作
//创建文件arr.zep
namespace Utils;
class Arr
{
/**
* 二维数组取多列
*
* @param array matrix 待处理数组
* @param array cols 指定多列列名
* @return array
*/
public function matrixCols(array matrix, array cols) -> array
{
array out = [];
var key, value;
let cols = array_flip(cols);
for key, value in matrix {
let out[key] = array_intersect_key(value, cols);
}
return $out;
}
}
跟上边一样,编译出来
zephir build
在cli下不需要其他操作,会覆盖上一次编译的库文件。如果想通过web服务器访问,则需要重启一下
写个php脚本试一下
$arr = [
[
'phone' => 123456,
'name' => '张三',
'gender' => '男'
],
[
'phone' => 7890,
'name' => '张四',
'gender' => '女'
],
[
'phone' => 7890,
'name' => '张五',
'gender' => '男'
],
[
'phone' => 123456,
'name' => '张六',
'gender' => '女'
]
];
$a = new Utils\Arr;
$o = $a->matrixCols($arr, ['name', 'gender']);
var_dump($o);
运行一下
$ php test_utils.php
array(4) {
[0]=>
array(2) {
["name"]=>
string(6) "张三"
["gender"]=>
string(3) "男"
}
[1]=>
array(2) {
["name"]=>
string(6) "张四"
["gender"]=>
string(3) "女"
}
[2]=>
array(2) {
["name"]=>
string(6) "张五"
["gender"]=>
string(3) "男"
}
[3]=>
array(2) {
["name"]=>
string(6) "张六"
["gender"]=>
string(3) "女"
}
}
很成功
生成API
有了库文件,总得让人知道这个库有哪些功能,怎么用。zephir提供了非常棒的文档生成器,只要zep文件中的代码按照phpdoc的格式编写即可
终端执行
zephir api
utils工程目录下会生成一个doc目录,里面就是html格式的API文档,默认theme就很美观了,也可以自定义
生成IDE支持文件
工程目录下,终端执行
zephir stubs
会在工程目录下生成一个ide目录
里面是版本号目录,再里面是真真货了,名为Utils,把这个目录在IDE里面设置一下即可得到代码提示,自动补全等辅助功能
在phpstorm里面是这样的:
File->settings->Languages & Frameworks->PHP->Include Path
加入这个目录的地址