如何制作PHP扩展
我知道,从技术上讲,只需制作一个PHP文件并使用如何制作PHP扩展,php,c++,c,Php,C++,C,我知道,从技术上讲,只需制作一个PHP文件并使用require\u一次,就可以实现PHP扩展 但是如果你在C或C++中写了扩展,那么它会优化性能吗? 如果是这样的话,您将如何为其创建一个“hello world”呢?这是一个关于PHP扩展的教程。它是否会优化性能,这取决于您试图在扩展上包装什么。但是我不会为了优化而编写PHP扩展。如果我没有选择,我会写一本。也就是说,包装一个通用的C库,使其可以直接在PHP中使用…用C/C++编写的软件肯定比用PHP编写的代码运行得更快。您可以用C/C++编写一
require\u一次
,就可以实现PHP扩展
但是如果你在C或C++中写了扩展,那么它会优化性能吗?
如果是这样的话,您将如何为其创建一个“hello world”呢?这是一个关于PHP扩展的教程。它是否会优化性能,这取决于您试图在扩展上包装什么。但是我不会为了优化而编写PHP扩展。如果我没有选择,我会写一本。也就是说,包装一个通用的C库,使其可以直接在PHP中使用…用C/C++编写的软件肯定比用PHP编写的代码运行得更快。您可以用C/C++编写一个扩展并将其链接到PHP。PHP手册在这里介绍了这一点: 其他答案提供了编写PHP扩展的其他教程的链接,您可以在谷歌上搜索“PHP扩展教程”以查找更多内容 但在你的应用程序中这样做是否正确则是另一回事。大多数专家都认为PHP运行得很好,速度足够98%的应用程序使用。PHP速度不够快的实例通常不是由于语言,而是程序员创建的低效应用程序体系结构。这是一个无法通过在C/C++中重写部分应用程序来弥补的弱点 我知道,从技术上讲,只需制作一个PHP文件并使用
require\u一次
,就可以实现PHP扩展
此功能的基础是include
语句,它包含并计算指定的文件。扩展不是正确的术语,因为您只是包含了另一个PHP脚本文件。PHP扩展以编译模块的形式为该语言提供附加函数
但是如果你在C或C++中写了扩展名,那么它会优化性能吗?
是的,它优化了性能。这就是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
如您所见,新的扩展名包含一个C文件:php\u helloworld.C
步骤3-代码
让我们为扩展创建C代码
首先,我们创建一个头文件:
php\u 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\u helloworld.c
// include the PHP API itself
#include <php.h>
// 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");
}
然后配置构建并启用扩展:
./configure --enable-php-helloworld
最后,我们可以构建它:
make
sudo make install
步骤5-测试
为了测试我们的PHP扩展,让我们加载helloworld\u PHP.so
扩展文件并执行函数helloworld\u 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编程语言的好书
- -解释基本的参数处理
- -延伸写作教程的材料
我认为(但不确定)你可以通过制作一个dll
文件并将其放在与php
安装文件一起存在的ext文件夹中来实现。如果我前面的话是正确的,你可以在visual studio中创建(dll)文件
,我如何编写C++
扩展名?我一直在网上搜索,除了过时的教程外,什么也找不到。你能扩展你的答案来包含一个C++例子或者提供一些与图画或现代例子的好链接吗?嗯,C和C++是不一样的。我建议使用像PHP-CPP这样的包装器库,请参阅了解基本启动。你可以在这里找到这个库的教程:make
throwsphp\u helloworld.c:28:17:error:“helloworld\u php\u module\u entry”未声明(此函数首次使用)
应该是zend\u module\u entry helloworld\u php\u module\u entry
而不是zend\u module\u entry helloworld\u php\u module\u entry
也php-d extension=php\u helloworld.so-r'helloworld\u php();'
而不是php-d extension=helloworld_php.so-r'helloworld_php();'代码>链接被破坏。这里是一个归档版本:出于性能原因,在C或C++中写扩展是一个失败的游戏。您正在用性能上微不足道的增益换取可维护性上的巨大损失。PHP对于99.999%的web相关用例来说足够快。是的,有些网站这样做是因为他们拥有绝对荒谬的流量。这些都是异常值,它们根本不能代表普通PHP网站的流量。如果你想获得许可证或类似的东西,我想用C语言编写扩展可以为你的web应用程序提供安全性。向下链接……是的,毫无疑问,11年后情况发生了变化。因此,请使用我的第二个建议:谷歌it。
ARG_ENABLE("helloworld", "helloworld support", "yes");
if (PHP_HELLOWORLD == "yes") {
EXTENSION("helloworld", "php_helloworld.c");
}