为什么我的C函数运行良好,但在PHP扩展中出错?

时间:2017-05-11 03:43:01

标签: c shared-libraries php-extension

我需要在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");"

呼叫总是失败,只返回不为零的东西。

为什么呢?有什么不同吗?

注意:我在另一台计算机上测试了这个并且它可以工作。那么环境问题还有什么问题吗?

0 个答案:

没有答案