- 36
- 0
使用phpx写了一个简单的容器,想放到php中运行做点测试。我在这之前已经成功的写了一个dispatch_function注册到了swoole中,而且运行正常。
后面我又写了个C++类,新建了个PHP类,并将C++类的各个方法注册到了PHP类中。编译通过了,但是PHP加载这个扩展却失败了,报错
PHP Warning: PHP Startup: Unable to load dynamic library '/mypath/mango.so' (tried: /mypath/mango.so (/mypath/mango.so: undefined symbol: _ZN7Context4poolE)...
C++源代码如下
#include <string>
#include <iostream>
#include <unordered_map>
#include "../include/phpx.h"
#include <ext/spl/spl_iterators.h>
#include <server.h>
using namespace std;
using namespace php;
int dispatch_function(swServer *serv, swConnection *conn, swEventData *data);
class Context {
private:
static unordered_map<int, char *> pool;
public:
void static get(Object &_this, Args &args, Variant &retval) {
int key = args[0].toInt();
char * value = pool[key];
if (value == NULL) return;
retval = value;
}
void static set(Object &_this, Args &args, Variant &retval) {
int key = args[0].toInt();
char * value = args[1].toCString();
pool[key] = value;
}
void static del(Object &_this, Args &args, Variant &retval) {
int key = args[0].toInt();
pool.erase(key);
}
};
PHPX_EXTENSION()
{
Extension *ext = new Extension("mango", "0.0.1");
ext->require("swoole");
ext->onStart = [ext]
{
Class *c = new Class("CppClass");
c->addMethod("get", Context::get, STATIC);
c->addMethod("set", Context::set, STATIC);
c->addMethod("del", Context::del, STATIC);
ext->registerClass(c);
// 这个函数在PHP中是正常运行的
swoole_add_function("mango_dispatch_func_1", (void *)dispatch_function);
};
return ext;
}
int dispatch_function(swServer *serv, swConnection *conn, swEventData *data)
{
swConnection *from_sock = swServer_connection_get(serv, conn->from_fd);
int port = swConnection_get_port(from_sock);
int worker_id;
if (port == 80 || port == 8589) {
// http部分使用无状态轮询worker
uint32_t key = sw_atomic_fetch_add(&serv->worker_round_id, 1);
worker_id = key % serv->worker_num;
} else {
// 长连接部分使用有状态模式
worker_id = conn->fd % serv->worker_num;
}
return worker_id;
}
MakeFile如下(用的是官方例子中的MakeFile)
PHP_INCLUDE = `php-config --includes`
PHP_LIBS = `php-config --libs`
PHP_LDFLAGS = `php-config --ldflags`
PHP_INCLUDE_DIR = `php-config --include-dir`
PHP_EXTENSION_DIR = `php-config --extension-dir`
mango.so: mango.cpp
c++ -DHAVE_CONFIG_H -g -o mango.so -O0 -fPIC -shared mango.cpp -std=c++11 ${PHP_INCLUDE} -I${PHP_INCLUDE_DIR} -lphpx\
-I${PHP_INCLUDE_DIR}/ext/swoole/include -I${PHP_INCLUDE_DIR}/ext/swoole
install: mango.so
cp mango.so ${PHP_EXTENSION_DIR}/
clean:
rm *.so
由于本人很多年没摸C++了,基本都还给老师了,不知道哪里出了差错,求大佬帮忙看下是哪里的问题。
0
打赏
收藏
点击回答
- 共 0 条
- 全部回答
-
ぴ夏末ζ烟雨﹌ 普通会员 1楼
"undefined symbol"通常在编译阶段就报错,因为PHPX是PHP的扩展,它需要PHP的才能运行。如果你的PHPX扩展没有正确安装,或者扩展的依赖没有包含在你的PHP的配置中,那么这个错误就会出现。
以下是一些可能的解决步骤:
-
确保PHPX扩展已经正确安装。你可以通过在命令行中运行"php -v"来检查PHP的版本。如果PHPX扩展没有被正确安装,你可以使用"phpize"命令来安装它。
-
确保PHPX扩展的依赖已经被正确安装。你可以通过在命令行中运行"php -d extname=phpx.so"来检查PHPX扩展的依赖是否被正确安装。如果PHPX扩展的依赖没有被正确安装,你需要使用"sudo"命令来运行命令。
-
检查你的PHP的配置。在你的PHP配置文件中,你需要确保PHPX扩展被包含在扩展列表中。你可以通过查看PHP的配置文件来检查这一点。
-
重启你的PHP服务器。有时候,重启你的PHP服务器可以解决这个问题。你可以通过在命令行中运行"php -S"来重启你的服务器。
-
如果以上步骤都无法解决问题,你可能需要查阅PHPX的官方文档或者寻求PHP的社区的帮助。
-
更多回答
网站公告
- 扫一扫访问手机版
回答动态

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器更新之后。服务器里面有部分玩家要重新创建角色是怎么回事啊?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题函数计算不同地域的是不能用内网吧?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题ARMS可以创建多个应用嘛?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题在ARMS如何申请加入公测呀?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题前端小程序接入这个arms具体是如何接入监控的,这个init方法在哪里进行添加?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器刚到期,是不是就不能再导出存档了呢?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器的游戏版本不兼容 尝试更新怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器服务器升级以后 就链接不上了,怎么办?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器转移以后服务器进不去了,怎么解决?预计能赚取 0积分收益

- 神奇的四哥:发布了悬赏问题阿里云幻兽帕鲁服务器修改参数后游戏进入不了,是什么情况?预计能赚取 0积分收益
- 回到顶部
- 回到顶部
