通过PHP-CPP开始PHP扩展开发
>
- >扩展PHP功能以进行一些非常特殊的用法(数学,统计,几何等)。
- 与纯PHP实施相比, 具有更高的性能和效率
- 利用以前掌握的语言(对我,C)获得的编程获得的迅速性。
- >
- 使用更多的PRHP语义,例如Zephir。
- >使用更多的Pro-C/C语义,例如PHP-CPP,将在本文中解决。
- 对我来说,选择第二种方法的主要驱动器很简单:我开始使用C/C进行编程爱好,因此我仍然更愿意在C/C中编写那些较低级别的模块。 PHP-CPP的官方网站给出了其他一些理由。
钥匙要点
PHP-CPP是一个用于开发PHP扩展的库,允许C开发人员编写PHP扩展,而无需直接与Zend API合作的复杂性。它写在C 11中,并提供了有据可查和用户友好的课程的集合。
> PHP-CPP正在迅速发展,建议使用Git克隆存储库以进行最新更新。它支持单线读取的PHP安装,并需要升级到G编译器到4.8.x版或更高版本以兼容。- >
- > PHP-CPP提供了一个骨架扩展项目,其中包括一个main.cpp文件,用于编译扩展名的制造文件以及用于扩展加载的.INI文件。可以定制骨架项目以适合个人需求,并使用“ make && sudo make install”命令进行编译和安装。 PHP-CPP支持四种类型的函数签名,可以从PHP调用,并允许参数以数组形式通过值传递。它还允许功能导出/注册,功能参数类型的规范以及以对象为导向的扩展的创建。
- >安装和配置
- PHP-CPP正在迅速发展。在本文撰写本文时,它以0.9.1版本(大约2天发布)。根据其文档:“这是一个为即将推出的V1.0版本做准备的功能冻结版本”,因此我们有信心很快就会看到其1.0主要版本。 因此,至少在此期间,建议使用git克隆存储库,并通过git拉动获得最新更新。
注意:安装上的PHP-CPP文档指出,暂时,它“仅支持单线读取PHP安装”,因为“内部Zend Engine使用了非常奇怪的系统来确保线程安全性”。未来的发行版可能支持多线Readed PHP安装,但让我们暂时记住这一点,并遵守其当前限制。幸运的是,大多数PHP安装都应该是“单线读取的PHP安装”。
>> php-cpp写在C 11中。因此,我的Ubuntu 12.04 LTS中安装的G较旧版本不支持它。我们需要将G编译器升级到上述4.8.x版本。有一篇文章详细介绍了进行升级的步骤。请按照列出的说明进行操作。
>另外,PHP-CPP汇编将使用php.h标头文件。除非安装PHP-DEV,否则通常在Ubuntu框中缺少此文件。我们可以通过发出此命令来安装与PHP5相关的开发文件:
<span>sudo apt-get install php5-dev</span>
>升级G并安装必要的标头文件后,我们可以发布以下命令以编译和安装PHP-CPP库文件(libphpcpp.so):
<span>make && sudo make install</span>
>。 PHP-CPP LIB的安装现已完成。这非常简单,我们现在可以继续进行编程部分。
在这样做之前,我们将讨论PHP-CPP中使用的一些重要概念和术语。完整的文档可以在其官方网站上找到,并鼓励每个人在执行任何真正的编程之前阅读它。骨架(空)扩展项目文件
PHP-CPP提供了一个骨架扩展项目,其中包含以下3个文件:
> main.cpp:包含get_module函数的主CPP文件(稍后将详细讨论)
>makefile:示例制作文件以编译扩展名
- yourextension.ini:仅包含一行扩展名加载
- > makefile
- >如果您熟悉 *NIX开发,那么您熟悉此Makefile。应进行一些轻微的更改以自定义此文件以满足我们的需求:
更改名称=您对更有意义的extension,例如名称=骨架。
>更改ini_dir = /etc/php5/conf.d匹配系统的配置。就我而言,它是ini_dir = /etc/php5/cli/conf.d。我修改了INI路径,以首先启用PHP CLI环境的扩展。
- 这些都是我所做的所有更改。其余的makefile可以保持原样。
- > yourextension.ini
>
<span>sudo apt-get install php5-dev</span>
> main.cpp
在PHP-CPP提供的空项目中,此文件仅包含一个函数:get_module(),该函数下面摘录:
<span>make && sudo make install</span>
>目前,让我们更改此行以匹配我们打算创建的扩展名:
接下来,我们需要将所需的文件复制到适当的文件夹中:
<span><span>#include <phpcpp.h></span> </span> <span>/** </span><span> * tell the compiler that the get_module is a pure C function </span><span> */ </span><span>extern "C" { </span> <span>/** </span><span> * Function that is called by PHP right after the PHP process </span><span> * has started, and that returns an address of an internal PHP </span><span> * strucure with all the details and features of your extension </span><span> * </span><span> * @return void* a pointer to an address that is understood by PHP </span><span> */ </span> PHPCPP_EXPORT <span>void *get_module() </span> <span>{ </span> <span>// static(!) Php::Extension object that should stay in memory </span> <span>// for the entire duration of the process (that's why it's static) </span> <span>static Php::Extension extension("yourextension", "1.0"); </span> <span>// @todo add your own functions, classes, namespaces to the extension </span> <span>// return the extension </span> <span>return extension; </span> <span>} </span><span>} </span>
然后,我们可以通过PHP -I |将扩展名验证在CLI中加载。 GREP骨架,终端应显示类似的东西:
><span>static Php::Extension extension("skeleton", "1.0"); // To be humble, we can change the version number to 0.0.1</span>
(回想一下skeleton.ini是我们修改的文件,其中包含扩展名= skeleton.so line。)
> 到目前为止,我们已经使用PHP-CPP进行了编译并安装了我们的第一个PHP扩展。当然,此扩展程序还没有任何作用。现在,我们将创建第一个功能,以进一步了解建立PHP扩展的过程。
“你好,泰勒”功能
>
>根据“注册本机函数”上的PHP-CPP文档,它支持四种类型的功能签名:
在这种情况下,我使用第二个签名,并且参数以数组形式(PHP功能)按值传递。但是,在Helloworld中,我们专门使用了C型STD :: String来获取第一个参数。 我们还使用C STD LIB来输出一个热情的消息。
在get_module()函数中,在声明扩展变量后,我们添加了要导出的函数(helloworld()),并为php脚本(helloworld)分配一个名称。现在,让我们编译并安装扩展程序。如果一切顺利进行,新的骨架将复制到扩展名目录。
<span>make && sudo make install</span>
我们可以编写一个简单的脚本来测试刚刚创建的函数:
<span>cp -f skeleton.so /usr/lib/php5/20121212 </span><span>cp -f skeleton.ini /etc/php5/cli/conf.d</span>
>我们将回到以后观察到的内容。
>函数参数通过参考
接下来,我们将看到另一个函数,该函数通过引用,swap()函数传递参数。在此功能中,我们还将尝试指定参数及其类型的数量。在main.cpp中,我们添加了另一个函数swap():
>
<span>sudo apt-get install php5-dev</span>
我们明确地说:
<span>make && sudo make install</span>
将有两个参数(a和b);
- >
- 应通过引用(而不是通过值);
>通过 它们应该是数字类型的。 - >让我们编译并再次安装更新的扩展程序,并编写一些代码片段,以查看此新功能的工作方式:
>
>
>第一个呼叫(交换($ a,$ b))显示了预期的结果:20 | 10。该函数交换了两个数字。<span>extension=skeleton.so</span>
第二个通话是出乎意料的:我们告诉PHP我们要交换两个数字!但是它只是忽略了第二个参数传递的是字符串,并且无论如何都进行交换!
好吧,从某种意义上说,仍然可以预期。 PHP并没有真正区分数字类型和字符串类型。这种行为符合PHP标准。同样,由于这种行为,我们没有,也不能使用C内部类型作为功能(TEMP)中使用的临时变量,而是使用PHP ::值作为变量类型。第三个通话将起作用。第一个var_dump将显示DateTime对象,第二个将显示整数。这是某种程度上出乎意料的(至少对我来说)。毕竟,对象与数字/字符串完全不同。但是,在考虑到这种“互换”行为在PHP中也可行之后,它与PHP的奇怪之处相符。
>那么,这是否意味着“类型”规范不会产生任何影响?并不真地。为了进一步阐述这一点,我们创建了第三个功能:
我们这样注册了此功能:
测试代码将是这样的:
><span><span>#include <phpcpp.h></span> </span> <span>/** </span><span> * tell the compiler that the get_module is a pure C function </span><span> */ </span><span>extern "C" { </span> <span>/** </span><span> * Function that is called by PHP right after the PHP process </span><span> * has started, and that returns an address of an internal PHP </span><span> * strucure with all the details and features of your extension </span><span> * </span><span> * @return void* a pointer to an address that is understood by PHP </span><span> */ </span> PHPCPP_EXPORT <span>void *get_module() </span> <span>{ </span> <span>// static(!) Php::Extension object that should stay in memory </span> <span>// for the entire duration of the process (that's why it's static) </span> <span>static Php::Extension extension("yourextension", "1.0"); </span> <span>// @todo add your own functions, classes, namespaces to the extension </span> <span>// return the extension </span> <span>return extension; </span> <span>} </span><span>} </span>
>当我们通过正确的类类型(SampleClass)传递时,对SwapoBject()的第一个调用将起作用。第二个将失败,显示“可捕获的致命错误:参数1传递给swapobject()必须是SampleClass的实例,是给定的另一个类别的实例...”。
<span>static Php::Extension extension("skeleton", "1.0"); // To be humble, we can change the version number to 0.0.1</span>
结论
在本文中,我们说明了准备PHP-CPP为我们的PHP环境工作的步骤。我们还讨论了使用PHP-CPP(和C语义)创建PHP扩展的一些基本步骤。>我们介绍了扩展项目文件,功能签名,功能导出/注册和功能参数类型。
>在下一篇文章中,我们将进一步详细介绍PHP-CPP中的一些关键功能,并提供现实世界中的用例,展示了使用php-cpp的C类和名称空间实现的使用。
>
>关于PHP扩展开发的常见问题(常见问题解答)什么是PHP-CPP,它与PHP有何不同?它提供了有据可查和用户友好型类的集合,使C开发人员可以编写PHP扩展名,而无需直接与Zend API合作的复杂性。与PHP是一种解释的语言不同,PHP-CPP允许您以C(Comperied语言)编写代码。这可能会导致性能改进,因为编译的代码通常比解释的代码更快。>如何在系统上安装php-cpp?
>调试PHP扩展程序可能会有些棘手,因为您''重新处理一种编译的语言。但是,您可以使用GDB(GNU调试器)等工具进行调试。 GDB允许您设置断点,逐步浏览代码并检查变量,在尝试追踪错误时,这可能非常有用。
我可以使用php-cpp创建PHP 7的扩展名。
是的,PHP-CPP与PHP 7兼容。但是,您需要确保使用最新版本的PHP-CPP,因为较早的版本可能不支持PHP 7。>我如何处理PHP-CPP中的异常?
php-cpp提供一个名为php ::异常的类,您可以用来从C代码中抛出异常。这些例外可以像其他任何PHP例外一样在您的PHP代码中捕获和处理。
>我可以使用PHP-CPP创建面向对象的扩展吗?您可以在C代码中定义类,然后可以在PHP代码中使用这些类。这使您可以编写易于维护的干净,模块化的代码。
>如何从我的C代码中调用PHP函数?
>
>一旦您''如何分发我的php扩展名? VE构建了PHP扩展名,您可以通过将其包装为PECL包装来分配它。 PECL是PHP扩展的存储库,它提供了分发和安装扩展的标准方法。以上是通过PHP-CPP开始PHP扩展开发的详细内容。更多信息请关注PHP中文网其他相关文章!

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

JWT是一种基于JSON的开放标准,用于在各方之间安全地传输信息,主要用于身份验证和信息交换。1.JWT由Header、Payload和Signature三部分组成。2.JWT的工作原理包括生成JWT、验证JWT和解析Payload三个步骤。3.在PHP中使用JWT进行身份验证时,可以生成和验证JWT,并在高级用法中包含用户角色和权限信息。4.常见错误包括签名验证失败、令牌过期和Payload过大,调试技巧包括使用调试工具和日志记录。5.性能优化和最佳实践包括使用合适的签名算法、合理设置有效期、

会话劫持可以通过以下步骤实现:1.获取会话ID,2.使用会话ID,3.保持会话活跃。在PHP中防范会话劫持的方法包括:1.使用session_regenerate_id()函数重新生成会话ID,2.通过数据库存储会话数据,3.确保所有会话数据通过HTTPS传输。

SOLID原则在PHP开发中的应用包括:1.单一职责原则(SRP):每个类只负责一个功能。2.开闭原则(OCP):通过扩展而非修改实现变化。3.里氏替换原则(LSP):子类可替换基类而不影响程序正确性。4.接口隔离原则(ISP):使用细粒度接口避免依赖不使用的方法。5.依赖倒置原则(DIP):高低层次模块都依赖于抽象,通过依赖注入实现。

PHP8.1中的枚举功能通过定义命名常量增强了代码的清晰度和类型安全性。1)枚举可以是整数、字符串或对象,提高了代码可读性和类型安全性。2)枚举基于类,支持面向对象特性,如遍历和反射。3)枚举可用于比较和赋值,确保类型安全。4)枚举支持添加方法,实现复杂逻辑。5)严格类型检查和错误处理可避免常见错误。6)枚举减少魔法值,提升可维护性,但需注意性能优化。

在PHPStorm中如何进行CLI模式的调试?在使用PHPStorm进行开发时,有时我们需要在命令行界面(CLI)模式下调试PHP�...

如何在系统重启后自动设置unixsocket的权限每次系统重启后,我们都需要执行以下命令来修改unixsocket的权限:sudo...

静态绑定(static::)在PHP中实现晚期静态绑定(LSB),允许在静态上下文中引用调用类而非定义类。1)解析过程在运行时进行,2)在继承关系中向上查找调用类,3)可能带来性能开销。
