首页 >后端开发 >php教程 >通过Zephir开始PHP扩展开发

通过Zephir开始PHP扩展开发

Jennifer Aniston
Jennifer Aniston原创
2025-02-21 11:21:09987浏览

通过Zephir开始PHP扩展开发

>本教程将解释如何使用新语言创建PHP扩展:Zephir,类似于C和Fortran。您可以从GitHub下载完整的源代码。我们之前曾谈到过Zephir的概念,因此,如果您有兴趣获得广泛的概述,请参阅我们以前的文章。 可以将Zephir视为一种混合语言,使您可以编写看起来像PHP的代码,但然后将其编译到本机C,这意味着您可以从中创建扩展名并使用非常有效的代码。

钥匙要点

> Zephir允许PHP开发人员使用类似于PHP的语法编写有效的扩展,但已编译为本机C以增强性能。
    要建立Zephir开发环境,您需要特定的工具,例如GCC,GNU MAKE,PHP开发标头,RE2C和JSON-C,并建议基于Linux的系统。 在Zephir中创建PHP扩展的过程涉及初始化项目,在.zep文件中编写代码,编译代码并配置您的PHP环境以包括新扩展。
  • > Zephir不仅提高了性能,还提供了一种保护源代码的方法,使其适合创建封闭的源PHP应用程序。
  • >安装
  • 要构建PHP扩展名并使用Zephir,您需要以下内容:>
  • gcc> = 4.x/clang> = 3.x/vc 9
  • > gnu使3.81或更高版本 PHP开发标题和工具
> RE2C 0.13或更高版本

> JSON-C

>每个平台的安装说明都有所不同,因此,我相信,如果您正在阅读带有类似于此的主题的文章,您会知道如何获得它们。为了记录 - 我建议使用基于Linux的系统开发Zephir应用程序。
    获得所有先决条件软件后,请从Github下载最新版本的Zephir,然后运行Zephir安装程序,例如:
  • 它应该自动安装 - 尝试键入Zephir帮助。如果不起作用,请将“ bin”目录添加到您的路径环境变量中。就我而言:/home/duythien/app/zephir/bin,就像这样:
  • >
  • 附加以下导出命令:
  • >
  • 要验证新路径设置并测试安装,请输入:>
  • >您可以找到有关Zephir基础知识和语法以及其键入系统的信息,并在其网站上查看一些演示脚本。
用Zephir

编程

>现在,我们将使用Zephir来重新工作C和Fortran很好地处理的数学方程式。这个例子是深奥的,不会被大量解释,除了演示Zephir的力量。

用有限差

求解的时间依赖性的Schrodinger方程
<span>git clone https://github.com/phalcon/zephir
</span><span>cd zephir && ./install -c</span>
时间依赖性的schrödinger方程可以通过隐式(大矩阵)和显式(leapfrog)方法来求解。我将使用明确的方法。

首先,发出以下命令来创建扩展名的骨架:>

<span>git clone https://github.com/phalcon/zephir
</span><span>cd zephir && ./install -c</span>
>完成此命令后,在当前工作目录上创建了一个称为“ myApp”的目录。这看起来像:

在“ myApp”文件夹中,创建一个称为“ contenum.zep”的文件(这将为我们提供MyAppquantum名称空间)。在内部复制以下代码:
vi $HOME/.bash_profile

>我们使用了许多PHP函数,例如Fopen(),Sin(),fprintf()等 - 随意研究语法。我还将给你一个例子。在使用Phalcon PHP框架的过程中,如果您在越南人或德语工作,则功能phalcontag :: friendertitle()是无效的。这个示例比上面的方程简单得多,可以创建file normalizechars.zep。将以下代码插入文件:
export PATH=$PATH:/home/duythien/app/zephir/bin

现在,我们需要告诉Zephir必须编译我们的项目,并生成扩展名:>
echo $PATH
zephir help

首次运行,执行了许多内部命令,生成了必要的代码和配置,以将此类导出到PHP扩展名中。如果一切顺利,您将在输出结束时看到以下消息:

>
zephir init myapp

编译…

安装…
安装了扩展!

添加扩展= myApp.o so到您的php.ini
不要忘记重新启动您的Web服务器


>请注意,由于Zephir尚处于起步阶段,因此可以遇到错误和问题。我第一次试图编译它没有用。我尝试了以下命令,并最终使它起作用:

>

最后一个命令将在PHP扩展文件夹中安装模块(在我的情况下:/usr/lib/php5/20121212/)。最后一步是通过添加以下行添加此扩展名:

myapp/
 |-----ext/
 |-----myapp/
 |-----config.json
重新启动apache,我们完成了。

>

测试代码
namespace Myapp;
class Quantum{

    const PI = 3.14159265358979323846;
    const MAX = 751;

    public function Harmos(double x){
        int  i,j,n;
        var  psr, psi, p2, v,paramater,fp;
        double dt,dx,k0,item_psr,item_psi;

        let dx = 0.02,
            k0 = 3.0*Myapp\Quantum::PI,
            dt = dx*dx/4.0;
        let paramater =[dx,k0,dt,x];
        let i   = 0,
            psr = [],
            psi = [],
            p2  = [],
            v   = [],
            fp  = [];           

        let fp = fopen ("harmos.txt", "w");
            if (!fp) {
            return false;
            }
        while i <= Myapp\Quantum::MAX{
            let item_psi = sin(k0*x) / exp(x*x*2.0),
                item_psr = cos(k0*x) / exp(x*x*2.0);
            let psr[i] = [item_psr],
                psi[i] = [item_psi],
                v[i] = [5.0*x*x],   
                x = x + dx,
                i++;
        }
        var tmp; 
        let i =1, j=1,tmp=[2.0];
        for n in range(0, 20000){

            for i in range(1,Myapp\Quantum::MAX - 1 ){
                let psr[i][3] =psr[i][0] - paramater[2]*(psi[i+1][0] + psi[i - 1][0]
                            - tmp[0]*psi[i][0]) / (paramater[0]*paramater[0]) + paramater[2]*v[i][0]*psi[i][0],

                p2[i] = psr[i][0]*psr[i][4] + psi[i][0]*psi[i][0];
            }
            for j in range(1,Myapp\Quantum::MAX - 1 ) {
                let psr[0][5] = 0,
                    psr[Myapp\Quantum::MAX][6]= 0 ;
                let psi[j][7] = psi[j][0] + paramater[2]*(psr[j+1][8] + psr[j - 1][9]
                             - tmp[0]*psr[j][10]) / (paramater[0]*paramater[0]) - paramater[2]*v[j][0]*psr[j][11];
            }
        //output split
        if (n ==0 || n % 2000 == 0) {
            let i =1;
            while i < Myapp\Quantum::MAX - 1 {
            fprintf(fp, "%16.8lf %16.8lf %16.8lf \n",i*dx,n*dt,p2[i]);
                let i = i + 10;
            }
            fprintf(fp, "\n");
        }
        // change new->old
        let j = 1;
        while j <  Myapp\Quantum::MAX - 1 {
                let psi[j][0] = psi[j][12],
                    psr[j][0] = psr[j][13];
                let j++;
        }

    }
    return true;    

    }
}

现在,创建一个名为zephir.php的新文件:>

>通过访问Zephir.php页面结束。它看起来应该与以下输出相似:

namespace Myapp;

class NormalizeChars{
    public function trans(var s)
    {
            var replace;
        let replace = [
            "ế" : "e",
            "ề" : "e",
            "ể" : "e",
            "ễ" : "e",
            "ệ" : "e",
            //--------------------------------E^
            "Ế" : "e",
            "Ề" : "e",
            "Ể" : "e",
            "Ễ" : "e",
            "Ệ" : "e",
            //--------------------------------e
            "é" : "e",
            "è" : "e",
            "ẻ" : "e",
            "ẽ" : "e",
            "ẹ" : "e",
            "ê" : "e",
            //--------------------------------E
            "É" : "e",
            "È" : "e",
            "Ẻ" : "e",
            "Ẽ" : "e",
            "Ẹ" : "e",
            "Ê" : "e",
            //--------------------------------i
            "í" : "i",
            "ì" : "i",
            "ỉ"  : "i",
            "ĩ" : "i",
            "ị" : "i",
            //--------------------------------I
            "Í" : "i",
            "Ì" : "i",
            "Ỉ"  : "i",
            "Ĩ" : "i",
            "Ị" : "i",
            //--------------------------------o^
            "ố" : "o",
            "ồ" : "o",
            "ổ" : "o",
            "ỗ" : "o",
            "ộ" : "o",
            //--------------------------------O^
            "Ố"  : "o",
            "Ồ" : "o",
            "Ổ"  : "o",
            "Ô" : "o",
            "Ộ"  : "o",
            //--------------------------------o*
            "ớ"  : "o",
            "ờ" : "o",
            "ở"  : "o",
            "ỡ" : "o",
            "ợ"  : "o",
            //--------------------------------O*
            "Ớ"  : "o",
            "Ờ" : "o",
            "Ở"  : "o",
            "Ỡ" : "o",
            "Ợ"  : "o",
            //--------------------------------u*
            "ứ"  : "u",
            "ừ" : "u",
            "ử"  : "u",
            "ữ" : "u",
            "ự"  : "u",
            //--------------------------------U*
            "Ứ"  : "u",
            "Ừ" : "u",
            "Ử"  : "u",
            "Ữ" : "u",
            "Ự"  : "u",
            //--------------------------------y
            "ý"  : "y",
            "ỳ" : "y",
            "ỷ"  : "y",
            "ỹ" : "y",
            "ỵ"  : "y",
            //--------------------------------Y
            "Ý"  : "y",
            "Ỳ" : "y",
            "Ỷ"  : "y",
            "Ỹ" : "y",
            "Ỵ"  : "y",
            //--------------------------------DD
            "Đ"  : "d",
            "đ" : "d",
            //--------------------------------o
            "ó"  : "o",
            "ò" : "o",
            "ỏ"  : "o",
            "õ" : "o",
            "ọ"  : "o",
            "ô" : "o",
            "ơ"  : "o",
            //--------------------------------O
            "Ó"  : "o",
            "Ò" : "o",
            "Ỏ"  : "o",
            "Õ" : "o",
            "Ọ"  : "o",
            "Ô" : "o",
            "Ơ"  : "o",
            //--------------------------------u
            "ú"  : "u",
            "ù" : "u",
            "ủ"  : "u",
            "ũ" : "u",
            "ụ"  : "u",
            "ư" : "u",
            //--------------------------------U
            "Ú"  : "u",
            "Ù" : "u",
            "Ủ"  : "u",
            "Ũ" : "u",
            "Ụ"  : "u",
            "Ư" : "u",

            //--------------------------------a^
            "ấ"  : "a",
            "ầ" : "a",
            "ẩ"  : "a",
            "ẫ" : "a",
            "ậ"  : "a",
            //--------------------------------A^
            "Ấ"  : "a",
            "Ầ" : "a",
            "Ẩ"  : "a",
            "Ẫ" : "a",
            "Ậ"  : "a",
            //--------------------------------a(
            "ắ"  : "a",
            "ằ" : "a",
            "ẳ"  : "a",
            "ẵ" : "a",
            "ặ"  : "a",
            //--------------------------------A(
            "Ắ"  : "a",
            "Ằ" : "a",
            "Ẳ"  : "a",
            "Ẵ" : "a",
            "Ặ"  : "a",
            //--------------------------------A
            "Á"  : "a",
            "À" : "a",
            "Ả"  : "a",
            "Ã" : "a",
            "Ạ"  : "a",
            "Â" : "a",
            "Ă"  : "a",
            //--------------------------------a
            "ả"  : "a",
            "ã" : "a",
            "ạ"  : "a",
            "â" : "a",
            "ă"  : "a",
            "à" : "a",
            "á"  : "a"];
        return strtr(s, replace);

    }
}

如果您在数学上倾斜,请安装gnuplot并使用我们从Zephir扩展程序中获得的.txt输出运行:

通过Zephir开始PHP扩展开发此命令将使用数据文件harmos.txt绘制图像,这看起来像这样,证明我们的方程式是正确计算的。

>

cd myapp
zephir build

>受保护的代码

在某些情况下,汇编并不能显着提高性能,也许是因为应用程序的I/O界限(很可能),而不是由于计算或内存的限制。但是,编译代码还可以为您的应用程序带来一定程度的智力保护。使用Zephir生产本机二进制文件时,您也可以向用户或客户隐藏代码 - Zephir允许您编写封闭的源PHP应用程序。

结论

>本文提供了有关如何在Zephir中创建扩展的基本指南。请记住,Zephir并非是为了替换PHP或C的创建,而是作为对他们的补充,使开发人员可以冒险进行代码编译和静态键入。 Zephir是一种尝试加入C和PHP世界中最好的东西,并使应用程序运行速度更快,因此与HHVM和Hack竞争。

有关Zephir的更多信息,请查看在线文档。您喜欢这篇文章吗?在评论中让我知道!

>

经常询问有关PHP扩展开发的问题

什么是Zephir,为什么它用于PHP扩展开发?

> Zephir是一种高级的开源编程语言,旨在轻松有效地创建PHP扩展。它用于PHP扩展开发中,因为它提供了类似于PHP的语法,使PHP开发人员更容易编写扩展名,而无需学习C的复杂性,该语言通常用于PHP扩展。 Zephir还提供内存安全性和性能优化,使得结果扩展更加可靠,更快。

>如何安装Zephir?

安装Zephir,您需要克隆Zephir Repository从Github克隆到您的本地机器。克隆后,导航到克隆目录并运行安装命令。重要的是要注意,Zephir需要某些依赖项,例如PHP开发标头和C编译器。在开始安装过程之前,请确保安装它们。

如何使用Zephir?

使用Zephir创建PHP扩展名,涉及多个步骤。首先,您需要使用init命令初始化Zephir项目。这为您的扩展创建了目录结构。接下来,您在.zep文件中编写扩展代码。准备好代码后,您可以使用Compile命令将其编译为PHP扩展名。最后,您需要将扩展​​名添加到php.ini文件中才能启用它。

>

>使用Zephir而不是C进行PHP扩展开发的好处是什么?

,而C是一种强大的语言,它可能是复杂且难以使用的,尤其是对于不熟悉它的开发人员而言。另一方面,Zephir为PHP开发人员提供了更简单,更熟悉的语法。它还可以自动处理内存管理,从而降低了内存泄漏的风险。此外,Zephir还包括可以使生成的扩展程序运行速度更快的性能优化。

>我可以使用Zephir为其他语言编写其他语言的扩展名,而不是PHP?

当前,Zephir专门设计用于创建PHP扩展。但是,其开发人员对将来对其他语言的支持表示兴趣。目前,如果要为其他语言创建扩展,则需要使用其他工具或语言。

>

>我如何调试Zephir扩展名?

>可以调试Zephir扩展程序使用各种工具完成了。一种常见的方法是使用Zephir Parser扩展名,该扩展程序提供详细的错误消息,并可以帮助您确定代码中的问题。您还可以使用标准的PHP调试工具,例如Xdebug,尽管这些工具可能无法为Zephir特定问题提供那么多细节。

>

>与本机PHP代码相比,Zephir的性能是什么?设计为高效,在许多情况下,用Zephir编写的扩展可以比等效的PHP代码更快。这是因为Zephir将其编译为C,这是一种低级语言,计算机可以更快地执行。但是,确切的性能差异可能会因特定代码以及如何使用而有所不同。欢迎来自社区。如果您有兴趣做出贡献,可以在Github上查看该项目,以查看当前有哪些问题以及需要哪些帮助。

>

有任何学习Zephir的资源?是学习Zephir的几种资源。 Zephir官方文档是一个很好的起点,为语言的功能和用法提供了全面的指南。还有几个在线可用的教程和博客文章,可以提供其他见解和示例。 PHP应用程序的关键部分。当需要与C库接口时,也可以使用它,因为Zephir可以用作PHP和C之间的桥梁。此外,Zephir可用于将复杂的业务逻辑封装在PHP扩展中,为应用程序提供了一个干净,高效的接口代码。

以上是通过Zephir开始PHP扩展开发的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn