PHP扩展库访问PHP超全局

时间:2009-12-15 10:41:53

标签: php c++

我用C ++编写了一个PHP扩展库。我正在编写上面的PHP 5.x广告的扩展名。

我需要在我的C ++代码中访问PHP超级全局。有谁知道如何做到这一点?。非常感谢代码片段或指针(没有双关语)到类似的资源(没有双关语...)。

2 个答案:

答案 0 :(得分:3)

您确实需要哪些数据? - 大多数数据的最佳方式是参考它们来自的C结构。例如,对于请求数据,您可以检查sapi_globals,可使用SG()宏访问,会话数据可通过会话模块获得,...

如果您真的需要访问超级全局,可以在EG(symbol_table)哈希表中找到它。由于PHP有一个JIT机制只在需要时提供超级全局变量,你可能需要先调用zend_auto_global_disable_jit()来禁用它。


回答以下评论:这些数据是否足够:

typedef struct {
    const char *request_method;
    char *query_string;
    char *post_data, *raw_post_data;
    char *cookie_data;
    long content_length;
    uint post_data_length, raw_post_data_length;

    char *path_translated;
    char *request_uri;

    const char *content_type;

    zend_bool headers_only;
    zend_bool no_headers;
    zend_bool headers_read;

    sapi_post_entry *post_entry;

    char *content_type_dup;

    /* for HTTP authentication */
    char *auth_user;
    char *auth_password;
    char *auth_digest;

    /* this is necessary for the CGI SAPI module */
    char *argv0;

    /* this is necessary for Safe Mode */
    char *current_user;
    int current_user_length;

    /* this is necessary for CLI module */
    int argc;
    char **argv;
    int proto_num;
} sapi_request_info;

typedef struct _sapi_globals_struct {
    void *server_context;
    sapi_request_info request_info;
    sapi_headers_struct sapi_headers;
    int read_post_bytes;
    unsigned char headers_sent;
    struct stat global_stat;
    char *default_mimetype;
    char *default_charset;
    HashTable *rfc1867_uploaded_files;
        long post_max_size;
        int options;
        zend_bool sapi_started;
        time_t global_request_time;
        HashTable known_post_content_types;
} sapi_globals_struct;

然后使用SG(request_info).request_uri或类似的,而你应该只阅读这些值,而不是写,所以如果需要,请复制。

这些都不够吗? - 然后回到我上面所说的话:

/* untested code, might need some error checking and stuff */
zval **server_pp;
zval **value_pp;
zend_auto_global_disable_jit("_SERVER", sizeof("_SERVER")-1 TSRMLS_CC);
if (zend_hash_find(EG(symbol_table), "_SERVER", sizeof("_SERVER"), (void**)&server_pp) == FAILURE) {
    zend_bailout(); /* worst way to handle errors */
}
if (Z_TYPE_PP(server_pp) != IS_ARRAY) {
    zend_bailout();
}
if (zend_hash_find(Z_ARRVAL_PP(server_pp), "YOUR_VARNAME", sizeof("YOUR_VARNAME"), (void**)&value_pp) == FAILURE) {
    zend_bailout();
}
/* now do something with value_pp */

请注意我在这里输入了我的ind而没有检查任何东西所以它可能是错的,包含错别字等。 并且作为注释:您应该意识到必须使用sizeof()而不是sizeof()-1和散列API,因为终止空字节是计算散列的一部分,并且函数返回SUCCESS或FAILURE ,SUCCESS被定义为0FAILURE被定义为-1,这不是人们所期望的,所以总是使用这些常量!

答案 1 :(得分:0)

我想你需要像zend_hash_find(CG(auto_globals),...这样的东西,但我不是专家