Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/250.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何制作PHP扩展_Php_C++_C - Fatal编程技术网

如何制作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++编写一

我知道,从技术上讲,只需制作一个PHP文件并使用
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
throws
php\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");
}