在Windows下开发和编译PHP扩展,需要进行以下步骤:
1. 安装Visual Studio
在Windows下进行PHP扩展开发,需要一个编译器来编译C代码,而Visual Studio是一个流行的C/C++编译器,可以在官网下载并安装Visual Studio Community版本(https://visualstudio.microsoft.com/zh-hans/downloads/)。
2. 安装PHP环境
在Windows下编译PHP扩展,需要先安装PHP环境。我们可以在PHP官网(http://windows.php.net/download/)下载符合我们本地开发环境的PHP版本,并进行安装。该过程不再细说。
3. 配置PHP环境变量
- 给php.ini文件加入扩展库的路径,例如:
extension_dir = "C:\php\ext"
- 添加路径到系统环境变量,例如:
C:\php;C:\php\ext
- 重启电脑,确保环境变量生效。
4. 创建扩展库项目
在Visual Studio中创建一个新的C++项目,选择Win32控制台应用程序。然后,在存放PHP扩展库源码的目录下新建一个.h头文件和.c源代码文件。
假设我们需要创建一个名为“hello”的扩展库,以下是示例代码:
hello.h:
#ifndef PHP_HELLO_H
#define PHP_HELLO_H
#include "php.h"
extern zend_module_entry hello_module_entry;
#endif
hello.c:
#include "hello.h"
ZEND_FUNCTION(hello_world)
{
php_printf("Hello World!\n");
}
const zend_function_entry hello_functions[] = {
ZEND_FE(hello_world, NULL)
{NULL, NULL, NULL}
};
zend_module_entry hello_module_entry = {
STANDARD_MODULE_HEADER,
"hello",
hello_functions,
NULL,
NULL,
NULL,
NULL,
NULL,
"1.0",
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_HELLO
ZEND_GET_MODULE(hello)
#endif
5. 编写扩展库代码
在hello.c文件中实现扩展功能。上述代码中,定义了一个hello_world()函数,用于输出“Hello World!”字符串。同时,hello_functions数组和hello_module_entry结构体也需要进行修改,以适应我们的扩展。
6. 编译扩展库
- 在Visual Studio中导入PHP源码:打开项目属性,选择VC++ 目录,设置包含目录和库目录,例如:
C:\php\include;C:\php\lib
- 在VC++目录设置完毕后,我们需要指定编译器的选项,具体方式是:打开项目属性,选择C/C++,预处理器选项,预处理器定义,添加如下代码:
PHP_WIN32
ZEND_WIN32
-
接下来,在C/C++/常规选项卡中,将/MT选项改为/MTd。
-
最后,在C/C++/代码生成选项卡中,将运行库从Multi-Threaded(/MT)改为Debug Multi-Threaded(/MTd)。
-
保存并只需重新编译项目即可。编译成功后,会在项目目录下生成一个hello.dll文件。
7. 配置PHP调用扩展库
- 将hello.dll扩展库移动到PHP的扩展库目录中,例如:
C:\php\ext
- 编辑php.ini文件,在最后加入如下代码:
extension=hello.dll
保存文件并重启Apache和PHP服务。
- 然后,使用PHP的Extension Boole扩展管理工具(http://pecl.php.net/package/pecl-manager),输入以下命令进行安装和启用扩展库:
pecl install hello
echo "extension=hello.so" > /path/to/php.ini
上述就是"windows下开发并编译PHP扩展的方法"的完整攻略。
示例说明:
- 创建一个名为“love”的扩展库。
love.h:
#ifndef PHP_LOVE_H
#define PHP_LOVE_H
#include "php.h"
extern zend_module_entry love_module_entry;
#endif
love.c:
#include "love.h"
ZEND_FUNCTION(say_love)
{
php_printf("I love you all the time!\n");
}
const zend_function_entry love_functions[] = {
ZEND_FE(say_love, NULL)
{NULL, NULL, NULL}
};
zend_module_entry love_module_entry = {
STANDARD_MODULE_HEADER,
"love",
love_functions,
NULL,
NULL,
NULL,
NULL,
NULL,
"1.0",
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_LOVE
ZEND_GET_MODULE(love)
#endif
用Visual Studio进行编译,启用扩展库的命令为pecl install love。
- 创建一个名为"world"的扩展库。
world.h:
#ifndef PHP_WORLD_H
#define PHP_WORLD_H
#include "php.h"
extern zend_module_entry world_module_entry;
#endif
world.c:
#include "world.h"
ZEND_FUNCTION(say_world)
{
char* arg;
size_t arg_len;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &arg, &arg_len) == FAILURE) {
RETURN_NULL();
}
php_printf("Hello %s!\n", arg);
}
const zend_function_entry world_functions[] = {
ZEND_FE(say_world, NULL)
{NULL, NULL, NULL}
};
zend_module_entry world_module_entry = {
STANDARD_MODULE_HEADER,
"world",
world_functions,
NULL,
NULL,
NULL,
NULL,
NULL,
"1.0",
STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_WORLD
ZEND_GET_MODULE(world)
#endif
改扩展主要实现的功能是输出带参数的字符串。用Visual Studio进行编译,启用扩展库的命令为pecl install world。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:windows下开发并编译PHP扩展的方法 - Python技术站