从Zephir开始编写PHP入门级扩展

为什么我要写PHP扩展呢?

  1. 访问现有的库。假设现在有一个库很好用(例如MongoDB),你希望在PHP也能用上它。如果这个库很热门,那么你就走运了,应该有大牛帮你实现了。要是运气不好,这个库比较冷门,但你业务需求又刚好需要用到的话,那只能干着急了(当然这种情况是极少出现的)。
  2. 性能。PHP是动态语言,代码性能比C语言相差一个级别。正是由于此原因,产生了Yaf,Phalcon这样的PHP的扩展框架。

简介:

通过 PHP 扩展, 我们可以在 php 代码中使用一些特定的方法(大部分的 php 扩展都是用 C 写的)。

比如,在 PHP 中需要与 SQLite3 交互,我们可以自己写方法与之进行连接,再写 SQL 语句请求数据。然而,这都是些既琐碎又重复度相当高的工作,因此,所有开发者对插件的需求呼之欲出。

现在,这款插件已经诞生了。你只需像安装其他扩展一样进行安装,然后在 ‘php.ini’ 文件执行 ‘extension=sqllite3.so’,就可以在你的 php 项目里对 sqlite3 进行访问了。

你该安装的第一个扩展

Zephir:
官网文档给出的定义是:

一种开源的高级语言,旨在简化 PHP 扩展的创建和可维护性,重点关注类型和内存安全性。

特点:

  • 类型:动态 / 静态。
  • 内存安全性:不允许指针或者直接内存管理。
  • 编译模式:提前编译。
  • 内存模型:本地任务垃圾回收机制。

工作原理?

把你写好的 php 代码编译成 c,然后你可以将其以扩展的形式添加到 ‘php.ini’ 文件中。

下面是编译方案的例子:

编译方案

  • 让我们从 Hello world 的扩展开始吧。

安装 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
re2c
php-zephir-parser

用 Ubuntu, 可以采取如下方式安装:

sudo apt-get update
sudo apt-get install git gcc make re2c php php-json php-dev libpcre3-dev

或者,用 CentOS, 可以采取如下方式安装:

yum update
yum install git gcc make re2c php php-json php-dev libpcre3-dev

确认安装了较新的 PHP 版本:

php -v
PHP 7.3.7 (cli) (built: Jul 14 2019 17:24:22) ( ZTS DEBUG )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.7, Copyright (c) 1998-2018 Zend Technologies
with Zend OPcache v7.3.7, Copyright (c) 1999-2018, by Zend Technologies
with Xdebug v2.7.2, Copyright (c) 2002-2019, by Derick Rethans

确认有 PHP 开发库:

phpize -v
Configuring for:
PHP Api Version:         20180731
Zend Module Api No:      20180731
Zend Extension Api No:   320180731

安装Zephir:
官方推荐安装 Zephir 的方法是简单地从 GitHub 获取最新版本的 PHAR ,然后将其添加到$PATH环境变量中.
Composer方式

composer global require zephir-lang/zephir

或者,git安装Zephir然后

git clone https://github.com/phalcon/zephir
cd zephir
./install -c

验证是否安装正确:

zephir help

如果一切就绪,你应该能在你的屏幕上看到以下帮助信息:

扩展初始化:

zephir init helloworld
如果一切正常,您应该会看到以下帮助

_____              __    _
/__  /  ___  ____  / /_  (_)____
  / /  / _ \/ __ \/ __ \/ / ___/
 / /__/  __/ /_/ / / / / / /
/____/\___/ .___/_/ /_/_/_/
         /_/
Zephir 0.13.5 by Andres Gutierrez and Serghei Iakovlev (1232784)
Usage:
  command [options] [arguments]
Options:
      --dumpversion  Print the version of the compiler and don't do anything else (also works with a single hyphen)
  -h, --help         Print this help message
      --no-ansi      Disable ANSI output
  -v, --verbose      Displays more detail in error messages from exceptions generated by commands (can also disable with -V)
      --vernum       Print the version of the compiler as integer
      --version      Print compiler version information and quit
Available commands:
  api        Generates a HTML API based on the classes exposed in the extension
  build      Generates/Compiles/Installs a Zephir extension
  clean      Cleans any object files created by the extension
  compile    Compile a Zephir extension
  fullclean  Cleans any object files created by the extension (including files generated by phpize)
  generate   Generates C code from the Zephir code without compiling it
  help       Display help for a command
  init       Initializes a Zephir extension
  install    Installs the extension in the extension directory (may require root password)
  stubs      Generates stubs that can be used in a PHP IDE

开始PHP扩展编写:
取一个名字为 “helloworld” 的目录在当前工作目录中被创建:
扩展初始化:
zephir init helloworld

扩展目录结构:

  • ext: 包含被编译器用来生成扩展的代码。
  • helloworld: 这个目录与我们的扩展同名。我们在这个目录中放置 Zephir 代码。
  • config.json: 这个文件包含我们可用于更改 Zephir 与 / 或此扩展的行为的配置

添加我们的第一个类:

在 helloworld 目录中 .

Zephir 的设计初衷是用来生成面对对象的扩展,接下来我们先添加一个初始类。

我们先来在扩展中创建一个 helloworld 类,使用此类来渲染 Hello World!

helloworld/helloworld/greeting.zep

namespace HelloWorld;

class Greeting
{

    public static function say()
    {
        echo "Hello World!";
    }
}

注意:如果是在windows环境中编译,需要先安装PHP扩展php-zephir-parser

# 下载地址 https://github.com/zephir-lang/php-zephir-parser/releases/tag/v1.3.6
# 推荐 zephir_parser_X64_vc15_php7.4_1.3.6-559.zip
extension=zephir_parser

接下来命令行执行以下命令来编译扩展:

zephir build

第一次运行以上命令时,会初始化一些东西。如果一些顺利的话,会输出以下内容:

 

zephir build output

检测下是否安装成功:

 

在 PHP 代码中测试:

zephir_helloworld.php

<?php
echo HelloWorld\Greeting::say()."\n";

 

接下来运行命令:

php zephir_helloworld.php

你可以可以看到输出 Hello World!

结语

如果你是 PHP 软件工程师,对内存管理等底层语言的编程方式不是特别熟悉,可以尝试从 Zephir 开始写一些简单的扩展。

Zephir 内部已经做好了内存管理,但是基于其内存安全的设计,你无法使用 C 语言的强大手动内存管理功能,如果你是 C 程序员,你会觉得 Zephir 更加简单易用,但是在有些地方可能不够强大。

转载请注明出处:https://www.onexin.net/zephir-php/

相关文章:

1、windows10环境使用Zephir编写PHP7.4扩展
https://www.onexin.net/windows10-zephir-php7-4/

2、用 PHP 编写更好的正则表达式regex
https://www.onexin.net/php-regex/

3、PHP 版本 8.2,8.1,8.0,7.4
https://www.onexin.net/php-8_2-8_1-8_0-7_4/

4、PHP中的Liskov替换原则
https://www.onexin.net/php-liskov/

5、php实现自运行的do实例详解
https://www.onexin.net/php-do/

Leave a Reply