本指南将帮助您快速安装 PHPX 并创建第一个 PHP 扩展。
在开始之前,请确保您的系统满足以下要求:
- PHP 8.1 或更高版本
- GCC 4.8+ 或 Clang
- CMake 3.10+
- Composer
- GTest(用于运行测试)
- Git(用于克隆仓库)
sudo apt-get update
sudo apt-get install php8.1-dev php8.1-cli cmake g++ git composersudo yum install php-devel php-cli cmake gcc-c++ git composerbrew install php@8.1 cmake composergit clone https://github.com/swoole/phpx.git
cd phpxcmake .
make -j 4
sudo make install
sudo ldconfigphp-config --includes # 应显示包含 phpx 头文件的路径
ls /usr/local/include/phpx/ # 应看到 PHPX 头文件# 创建扩展项目
composer create-project swoole/phpx-ext test
cd test
# 构建扩展
cmake .
make -j 4
sudo make installmkdir myext
cd myext
mkdir srccmake_minimum_required(VERSION 3.10)
project(myext)
set(CMAKE_CXX_STANDARD 14)
find_package(GTest)
execute_process(COMMAND php-config --prefix
OUTPUT_VARIABLE PHP_PREFIX OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND php-config --includes
OUTPUT_VARIABLE PHP_INCLUDES OUTPUT_STRIP_TRAILING_WHITESPACE)
execute_process(COMMAND php-config --extension-dir
OUTPUT_VARIABLE PHP_EXTENSION_DIR OUTPUT_STRIP_TRAILING_WHITESPACE)
include_directories(${PHP_PREFIX}/include/phpx)
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${PHP_INCLUDES}")
add_library(myext SHARED src/myext.cc)
target_link_libraries(myext phpx)
install(TARGETS myext LIBRARY DESTINATION ${PHP_EXTENSION_DIR})#include "phpx.h"
using namespace php;
// 定义一个简单的函数
PHPX_FUNCTION(hello) {
return "Hello from PHPX!";
}
// 模块入口
void php_myext_MINFO_FUNC(zend_module_entry *module) {
php_info_print_table_start();
php_info_print_table_row(2, "myext support", "enabled");
php_info_print_table_end();
}
// 扩展定义
Extension ext("myext", "1.0.0");
extern "C" {
zend_module_entry myext_module_entry = {
STANDARD_MODULE_HEADER,
"myext", // 扩展名称
nullptr, // 函数列表(由 PHPX 自动填充)
nullptr, // MINIT
nullptr, // MSHUTDOWN
nullptr, // RINIT
nullptr, // RSHUTDOWN
php_myext_MINFO_FUNC, // MINFO
"1.0.0", // 版本号
STANDARD_MODULE_PROPERTIES
};
}
#ifdef COMPILE_DL_MYEXT
ZEND_GET_MODULE(myext)
#endif
// 注册函数
extern "C" void startup_extension() {
ext.registerFunction("hello", hello);
}cmake .
make -j 4
sudo make install编辑 php.ini,添加:
extension=myext.so创建测试文件 test.php:
<?php
echo hello() . "\n";
// 输出:Hello from PHPX!运行:
php test.phpPHPX 提供了工具来自动生成函数信息和函数入口:
<?php
/**
* @generate-function-entries
*/
/**
* Say hello
*
* @return string
*/
function hello(): string {}php vendor/swoole/phpx/bin/gen_stub.php myext.stub.php这将生成:
myext_arginfo.h- 参数信息myext_legacy_arginfo.h- 兼容旧版本的参数信息
PHPX_FUNCTION(greet) {
String name = args[0].toString();
Int age = args[1].toInt();
return String("Hello ") + name + ", age: " + std::to_string(age);
}PHPX_FUNCTION(array_test) {
Array arr;
arr.set("name", "John");
arr.set("age", 25);
arr.set(0, "first");
return arr;
}PHPX_FUNCTION(create_object) {
Object obj = newObject("stdClass");
obj.setProperty("name", "Test");
return obj;
}PHPX_FUNCTION(divide) {
double a = args[0].toDouble();
double b = args[1].toDouble();
if (b == 0) {
throwError("Division by zero");
return;
}
return a / b;
}PHPX_FUNCTION(call_php_func) {
Variant result = call("strlen", {"Hello World"});
return result; // 11
}enableDebugInfo(true);Variant var = getValue();
var.debug(); // 打印变量信息
var.print(); // 使用 var_dump 格式打印printf("Refcount: %d\n", var.getRefCount());A: 确保已正确安装 PHPX,并且 include_directories 指向正确的路径。
A: 检查:
- 扩展文件是否在正确的目录
php.ini中的路径是否正确- 是否有权限问题
A: 常见原因:
- 未正确初始化变量
- 引用计数错误
- 访问已释放的内存
使用 valgrind 或 gdb 进行调试。
php -m | grep myext
# 或
php --ri myext完成快速开始后,您可以:
需要帮助?查看 常见问题 或提交 Issue。