zephir mysql_用Zephir编写php扩展库以及生成文档、IDE提示
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
加入这个目录的地址
zephir mysql_用Zephir编写php扩展库以及生成文档、IDE提示相关推荐
- docwizard c++程序文档自动生成工具_如何开发一个基于 TypeScript 的工具库并自动生成文档
为什么用 TypeScript? TypeScript is a typed superset of JavaScript that compiles to plain JavaScript. Any ...
- Tencent APIJSON 零代码、全功能、强安全 ORM 库 后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构
项目介绍 零代码.全功能.强安全 ORM 库 后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构. A JSON Transmission Protocol and an ORM ...
- 用python绘制y=x,y=1+sinx,编写Python程序,使用numpy、pandas、matplotlib三个扩展库在一个画布中绘制4个子图.
目录 1.编写Python程序绘制y=x图. 2.绘制表达式为1+sin(x)的图. 3.编写Python程序,使用numpy.pandas.matplotlib三个扩展库在一个画布中绘制4个子图,分 ...
- php扩展库后门,编写基于PHP扩展库的后门
author:lxj616 0x00 前言 今天我们将讨论编写基于PHP扩展库的后门.通常来说,大部分入侵者都会在脚本中留下自定义代码块后门.当然,这些东西很容易通过源代码的静态或动态分析找到. 利用 ...
- TVM apps extension示例扩展库
TVM apps extension示例扩展库 此文件夹包含TVM的示例扩展库.演示了其它库如何在C++和Python API中扩展TVM. 该库扩展了TVM的功能. python模块加载新的共享库, ...
- zlib 离线安装_黑板派Python扩展库安装与常见问题解决完整指南
点击蓝字 ! 关注我们 "Python小屋"编程比赛正式开始 推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国, ...
- python3.7扩展库是什么_Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包。_学小易找答案...
[填空题]Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包. [判断题]Directions: The ...
- 如何用C语言编写PHP扩展的详解
来源:http://www.jb51.net/article/38381.htm 本篇文章是对用C语言编写PHP扩展进行了详细的分析介绍,需要的朋友参考下 1:预定义 在home目录,也可以其他任意目 ...
- 不属于python标准库的是_python标准库和扩展库
Tkinter ---- Python 默认的图形界面接口. Tkinter 是一个和 Tk 接口的模块, Tkinter 库提供 了对 Tk API 的接口,它属于 Tcl/Tk 的 GUI 工具组 ...
最新文章
- 《任正非:我若贪生怕死,何来让你们英勇奋斗》
- 使用pytest对django项目单元测试
- K8S-网络模型、POD/RC/SVC YAML 语法官方文档
- 404错误处理以及以后缀为action结尾的处理
- !!导致大智慧公式总是死循环的编码风格
- LeetCode OJ 113. Path Sum II
- 用博奥如何导入单项工程电子表_博奥工程系列软件实操手册(第六册).doc
- Strange Shuffle CodeForces - 1471E(交互题)
- 二维数组按指定的键值排序
- asp.net应用程序级别跟踪
- 《大前端进阶 安全》系列 HTTPS详解(通俗易懂)
- acer软件保护卡怎么解除_Acer软件保护卡使用说明
- Substance Designer中Histogram相关节点理解
- Git:Terminal is dumb, but EDITOR unset
- 使用腾讯云Ubuntu20.04搭建代理服务器
- 小冲哥c语言视频自学网,C语言二级教学视屏课件_51自学网_小冲哥.doc
- 粒径测量中的D10 D50 D90的含义
- 以太网PLC无线WIFI跨网段通讯和Modbus仪表数据采集
- linux php cpu,理解Linux CPU负载和 CPU使用率
- 一个普通程序员的生存之道
热门文章
- AM2320 温湿度计 单总线读取数据
- 计算机为什么检测不到u盘启动项,BIOS设置U盘为第一启动项后检测不到如何解决?...
- 白光干涉衍射实验的计算机仿真,白光干涉_衍射实验的计算机仿真_蓝海江.pdf
- 推荐一个硬核嵌入式的原创公众号
- HDLBits答案(22)_基于有限状态机的计数器
- 不礼让行人怎么抓拍的_【交通违法曝光2019年第11期】梅河口市公安局交警大队对电子警察抓拍的88台机动车不礼让行人车辆曝光如下...
- access查找工龄大于30_ACCESS查询操作题完整
- java保存base64图片_java保存base64位的图片,并且用时间文件夹分割
- deepin编译Linux内核,为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载
- JAVA中的onkey_onKeyListener无法在虚拟键盘上工作