使用Zephir开发PHP扩展

Zephir是高性能PHP框架Phalcon厂商开发的开源高级/特定领域语言,它在降低PHP扩展开发、维护的复杂性的同时,也致力于保证类型和内存安全。Zephir是Zend Engine/PHP/Intermediate缩写,读作“zaefire”。

Zephir的主要特点:

Type system dynamic/static
Memory safety pointers or direct memory management aren’t allowed
Compilation model ahead of time
Memory model task-local garbage collection

下面通过实例讲解如何在CentOS 7上使用Zephir开发一个PHP扩展。

环境需求:
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

1.软件安装

sudo yum -y install php72-php php72-php-fpm php72-php-devel php72-zephir gcc re2c

2.确认zephir安装成功

zephir version

3.生成utils扩展骨架,并查看扩展的目录结构(其中config.json是配置文件,ext用于存放生成的PHP扩展,utils目录用于存放Zephir代码)

zephir init utils
cd utils
ls -al utils
-rw-rw-r--. 1 allen allen 2087 Nov 15 06:09 config.json
drwxr-xr-x. 9 allen allen 4096 Nov 15 05:49 ext
drwxrwxr-x. 2 allen allen 44 Nov 15 04:02 utils

4.config.json配置文件如下,可根据需要进行修改。

{
    "stubs": {
        "path": "ide\/%version%\/%namespace%\/",
        "stubs-run-after-generate": false
    },
    "api": {
        "path": "doc\/%version%",
        "theme": {
            "name": "zephir",
            "options": {
                "github": null,
                "analytics": null,
                "main_color": "#3E6496",
                "link_color": "#3E6496",
                "link_hover_color": "#5F9AE7"
            }
        }
    },
    "warnings": {
        "unused-variable": true,
        "unused-variable-external": false,
        "possible-wrong-parameter": true,
        "possible-wrong-parameter-undefined": false,
        "nonexistent-function": true,
        "nonexistent-class": true,
        "non-valid-isset": true,
        "non-array-update": true,
        "non-valid-objectupdate": true,
        "non-valid-fetch": true,
        "invalid-array-index": true,
        "non-array-append": true,
        "invalid-return-type": true,
        "unreachable-code": true,
        "nonexistent-constant": true,
        "not-supported-magic-constant": true,
        "non-valid-decrement": true,
        "non-valid-increment": true,
        "non-valid-clone": true,
        "non-valid-new": true,
        "non-array-access": true,
        "invalid-reference": true,
        "invalid-typeof-comparison": true,
        "conditional-initialization": true
    },
    "optimizations": {
        "static-type-inference": true,
        "static-type-inference-second-pass": true,
        "local-context-pass": true,
        "constant-folding": true,
        "static-constant-class-folding": true,
        "call-gatherer-pass": true,
        "check-invalid-reads": false,
        "internal-call-transformation": false
    },
    "namespace": "utils",
    "name": "utils",
    "description": "An utils helper extension",
    "author": "aiddroid",
    "version": "0.0.1",
    "verbose": false,
    "requires": {
        "extensions": []
    },
    "globals": {
        "enable_cache": {
            "type": "bool",
            "default": true
        }
    }
}

5.新增Zephir扩展类~/utils/utils/helper.zep(每一个*.zep文件对应一个类)

namespace Utils;

class Helper
{

    public static function square(int number)
    {
        var square = 0;
        let square = number * number;
        return square;
    }
    
    public static function starts_with(string str, string start)
    {
        return strpos(str, start) === 0;
    }
}

6.编译扩展

zephir build
Compiling...
Installing...
Extension installed!
Add extension=utils.so to your php.ini
Don't forget to restart your web server

 

7.生成的扩展文件utils.so在~/utils/ext/modules/utils.so

8.移动utils.so到php modules目录(我的是/opt/remi/php72/root/usr/lib64/php/modules)

9.修改php.ini,启用utils扩展

extension=utils

10.测试utils扩展

php -r "echo Utils\Helper::square(2);"
4

11.查看phpinfo

注意事项:

  • zephir代码中,使用变量前必须声明,动态变量(可被修改、重新赋值的变量)使用var声明,静态变量使用int, string 等类型直接声明,两个例子:
    • var money = 0;let money = 1000;//动态变量,可使用let重新赋值
    • int height = 100;//静态变量,一旦声明,无法修改
  • 每个zep文件中有且仅能有一个class,每个class必须要有namespace声明,namespace路径必须与zep文件路径一致
%1 $ S

发表回复