如何制作PHP扩展
我知道你可以通过制作一个PHP文件并使用require_once
来从技术上进行PHP扩展。
但如果你用C或C ++编写扩展,它会优化性能。
如果是这样,你会如何为此做一个“你好世界”?
用C / C ++编写的软件肯定比PHP中的代码运行得更快。 您可以在C / C ++中编写扩展并将其链接到PHP。 PHP手册在此处介绍了这一点: http : //php.net/manual/en/internals2.php
其他答案提供了编写PHP扩展的其他教程的链接,您可以谷歌搜索“PHP扩展教程”以查找更多内容。
但是,这是否是你的应用程序中正确的事情是另一个故事。 大多数专家都认为PHP运行得很好,足够快,98%的应用程序。 PHP不够快的实例通常不是由于语言,而是程序员创建的低效应用程序体系结构。 这是一个无法通过在C / C ++中重写部分应用程序来弥补的弱点。
我知道你可以通过制作一个PHP文件并使用
require_once
来从技术上进行PHP扩展。
此function的基础是include
语句,它包含并评估指定的文件。 扩展不是正确的术语,因为您只是包含另一个PHP脚本文件。 PHP扩展以编译模块的forms为语言提供附加function。
但如果你用C或C ++编写扩展,它会优化性能吗?
是的,它优化了性能。 这就是编写CPhalcon或YAF等PHP扩展的原因。
如何制作“Hello World”PHP扩展?
我将描述如何通过五个步骤构建“Hello World”PHP扩展。
需要基于Debian的操作系统,因为我们需要使用apt-get获取一些工具和依赖项。
第1步 – 设置构建环境/要求
PHP扩展是编译的C代码。 我们需要一个shell(应该已经安装),一个编辑器(您的选择),一个编译器(这里我们将使用GCC),PHP本身和PHP开发依赖项进行构建。
sudo apt-get install build-essential php7.0 php7.0-dev
第2步 – 配置
我们需要在基本配置文件中描述我们的扩展和形成它的文件:
文件: config.m4
PHP_ARG_ENABLE(php_helloworld, Whether to enable the HelloWorldPHP extension, [ --enable-helloworld-php Enable HelloWorldPHP]) if test "$PHP_HELLOWORLD" != "no"; then PHP_NEW_EXTENSION(php_helloworld, php_helloworld.c, $ext_shared) fi
如您所见,NEW_EXTENSION包含一个C文件: php_helloworld.c
。
第3步 – 代码
让我们为我们的扩展创建C代码。
首先,我们创建一个头文件:
php_helloworld.h
// we define Module constants #define PHP_HELLOWORLD_EXTNAME "php_helloworld" #define PHP_HELLOWORLD_VERSION "0.0.1" // then we declare the function to be exported PHP_FUNCTION(helloworld_php);
其次,我们创建源文件:
php_helloworld.c
// include the PHP API itself #include // then include the header of your extension #include "php_helloworld.h" // register our function to the PHP API // so that PHP knows, which functions are in this module zend_function_entry helloworld_php_functions[] = { PHP_FE(helloworld_php, NULL) {NULL, NULL, NULL} }; // some pieces of information about our module zend_module_entry helloworld_php_module_entry = { STANDARD_MODULE_HEADER, PHP_HELLOWORLD_EXTNAME, helloworld_php_functions, NULL, NULL, NULL, NULL, NULL, PHP_HELLOWORLD_VERSION, STANDARD_MODULE_PROPERTIES }; // use a macro to output additional C code, to make ext dynamically loadable ZEND_GET_MODULE(helloworld_php) // Finally, we implement our "Hello World" function // this function will be made available to PHP // and prints to PHP stdout using printf PHP_FUNCTION(helloworld_php) { php_printf("Hello World! (from our extension)\n"); }
第4步 – 构建
现在,我们已准备好构建扩展。
首先,我们为PHP扩展准备构建环境:
phpize
然后我们配置构建并启用扩展:
./configure --enable-php-helloworld
最后,我们可以构建它:
make sudo make install
第5步 – 测试
要测试我们的PHP扩展,让我们加载helloworld_php.so
扩展文件并执行我们的函数helloworld_php()
:
php -d extension=php_helloworld.so -r 'helloworld_php();'
完成:)
在Windows上构建
如果您尝试构建Windows(YIKES!),则需要稍微调整一下步骤:
第2步 – 配置
文件: config.w32
ARG_ENABLE("helloworld", "helloworld support", "yes"); if (PHP_HELLOWORLD == "yes") { EXTENSION("helloworld", "php_helloworld.c"); }
第4步 – 构建
使用nmake
而不是make
。
有用资源列表:
- 关于C编程语言的好书
- https://wiki.php.net/phpng-upgrading
- https://wiki.php.net/internals/
- http://phpinternalsbook.com/
- https://nikic.github.io/
- http://jpauli.github.io/
- https://github.com/php/php-src
- http://www.slideshare.net/pierrej/extending-php-7-the-basics – 解释基本的参数处理
- https://github.com/phplang/extension-tutorial – 扩展编写教程的材料
这是关于PHP扩展的教程。 它是否会优化性能,取决于您尝试包含在扩展上的内容。 但我不会为了优化目的而编写PHP扩展。 如果我别无选择,我会写一个。 IE包装一个通用的C库,使其直接在PHP中可用…
我认为(但不确定)你可以通过制作一个dll
文件并将其放在与php
安装文件存在的ext文件夹中来实现。如果我以前的话是正确的你可以在visual studio中做那个(dll) file