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提示相关推荐

  1. docwizard c++程序文档自动生成工具_如何开发一个基于 TypeScript 的工具库并自动生成文档

    为什么用 TypeScript? TypeScript is a typed superset of JavaScript that compiles to plain JavaScript. Any ...

  2. Tencent APIJSON 零代码、全功能、强安全 ORM 库 后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构

    项目介绍 零代码.全功能.强安全 ORM 库 后端接口和文档零代码,前端(客户端) 定制返回 JSON 的数据和结构. A JSON Transmission Protocol and an ORM ...

  3. 用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个子图,分 ...

  4. php扩展库后门,编写基于PHP扩展库的后门

    author:lxj616 0x00 前言 今天我们将讨论编写基于PHP扩展库的后门.通常来说,大部分入侵者都会在脚本中留下自定义代码块后门.当然,这些东西很容易通过源代码的静态或动态分析找到. 利用 ...

  5. TVM apps extension示例扩展库

    TVM apps extension示例扩展库 此文件夹包含TVM的示例扩展库.演示了其它库如何在C++和Python API中扩展TVM. 该库扩展了TVM的功能. python模块加载新的共享库, ...

  6. zlib 离线安装_黑板派Python扩展库安装与常见问题解决完整指南

    点击蓝字 ! 关注我们 "Python小屋"编程比赛正式开始 推荐图书: <Python程序设计(第3版)>,(ISBN:978-7-302-55083-9),董付国, ...

  7. python3.7扩展库是什么_Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包。_学小易找答案...

    [填空题]Python3.4以后的版本中,____________库用于安装管理Python扩展包,________________库用于发布Python包. [判断题]Directions: The ...

  8. 如何用C语言编写PHP扩展的详解

    来源:http://www.jb51.net/article/38381.htm 本篇文章是对用C语言编写PHP扩展进行了详细的分析介绍,需要的朋友参考下 1:预定义 在home目录,也可以其他任意目 ...

  9. 不属于python标准库的是_python标准库和扩展库

    Tkinter ---- Python 默认的图形界面接口. Tkinter 是一个和 Tk 接口的模块, Tkinter 库提供 了对 Tk API 的接口,它属于 Tcl/Tk 的 GUI 工具组 ...

最新文章

  1. 《任正非:我若贪生怕死,何来让你们英勇奋斗》
  2. 使用pytest对django项目单元测试
  3. K8S-网络模型、POD/RC/SVC YAML 语法官方文档
  4. 404错误处理以及以后缀为action结尾的处理
  5. !!导致大智慧公式总是死循环的编码风格
  6. LeetCode OJ 113. Path Sum II
  7. 用博奥如何导入单项工程电子表_博奥工程系列软件实操手册(第六册).doc
  8. Strange Shuffle CodeForces - 1471E(交互题)
  9. 二维数组按指定的键值排序
  10. asp.net应用程序级别跟踪
  11. 《大前端进阶 安全》系列 HTTPS详解(通俗易懂)
  12. acer软件保护卡怎么解除_Acer软件保护卡使用说明
  13. Substance Designer中Histogram相关节点理解
  14. Git:Terminal is dumb, but EDITOR unset
  15. 使用腾讯云Ubuntu20.04搭建代理服务器
  16. 小冲哥c语言视频自学网,C语言二级教学视屏课件_51自学网_小冲哥.doc
  17. 粒径测量中的D10 D50 D90的含义
  18. 以太网PLC无线WIFI跨网段通讯和Modbus仪表数据采集
  19. linux php cpu,理解Linux CPU负载和 CPU使用率
  20. 一个普通程序员的生存之道

热门文章

  1. AM2320 温湿度计 单总线读取数据
  2. 计算机为什么检测不到u盘启动项,BIOS设置U盘为第一启动项后检测不到如何解决?...
  3. 白光干涉衍射实验的计算机仿真,白光干涉_衍射实验的计算机仿真_蓝海江.pdf
  4. 推荐一个硬核嵌入式的原创公众号
  5. HDLBits答案(22)_基于有限状态机的计数器
  6. 不礼让行人怎么抓拍的_【交通违法曝光2019年第11期】梅河口市公安局交警大队对电子警察抓拍的88台机动车不礼让行人车辆曝光如下...
  7. access查找工龄大于30_ACCESS查询操作题完整
  8. java保存base64图片_java保存base64位的图片,并且用时间文件夹分割
  9. deepin编译Linux内核,为Deepin编译Linux 5.10内核的悲伤故事经历:从入门到卸载
  10. JAVA中的onkey_onKeyListener无法在虚拟键盘上工作