我需要在PHP中调用一个.so共享库,所以我使用“dlopen”和“dlsym”编写C代码来执行此操作,并且它可以工作。
sample.h:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <dlfcn.h>
typedef int (*libfunc) (char *msg, int msglen);
int
sfunc(char *msg, int msglen);
sample.c文件:
#include "sample.h"
int
sfunc(char *msg, int msglen)
{
void *lib;
libfunc lib_func;
int result;
...
lib = dlopen(THE_LIB_PATH, RTLD_NOW);
lib_func = (libfunc) dlsym(lib, THE_LIB_FUNC);
...
result = lib_func(msg, msglen); // return 0 if success
...
dlclose(lib);
return result;
}
它总是返回0.
然后我将PHP扩展编写为包装器,它接受PHP参数并在之前调用C代码。
php_sample.c:
...
#include "sample.h"
...
PHP_FUNCTION(s_func)
{
char *msg;
long msglen;
int result;
if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &msg, &msglen) == FAILURE) {
RETURN_NULL();
}
result = sfunc(msg, (int) msglen);
RETURN_LONG(result);
}
然后我将扩展(编译为.so)添加到PHP并测试PHP函数:
php -r "echo s_func("somestring");"
呼叫总是失败,只返回不为零的东西。
为什么呢?有什么不同吗?
注意:我在另一台计算机上测试了这个并且它可以工作。那么环境问题还有什么问题吗?