PHP 扩展 - 获取请求信息

main/SAPI.h 下定义了会使用到的 HTTP Request 属性,在扩展中可以引用该头文件并使用 SG 宏来使用 SAPI 的全局变量,结构如下:

typedef struct _sapi_globals_struct {
    void *server_context;
    sapi_request_info request_info;  // 请求信息
    sapi_headers_struct sapi_headers;
    int64_t read_post_bytes;
    unsigned char post_read;
    unsigned char headers_sent;
    zend_stat_t global_stat;
    char *default_mimetype;
    char *default_charset;
    HashTable *rfc1867_uploaded_files;
    zend_long post_max_size;
    int options;
    zend_bool sapi_started;
    double global_request_time;
    HashTable known_post_content_types;
    zval callback_func;
    zend_fcall_info_cache fci_cache;
} sapi_globals_struct;

结构体 sapi_request_info 结构如下:

typedef struct {
    const char *request_method;  // 请求方法,如 GET / POST / PUT 这些
    char *query_string;  // Query 字符串,就是 url ? 问号后面的 GET 参数
    char *cookie_data;  // Cookie 串
    zend_long content_length;  // 请求长度
    char *path_translated;
    char *request_uri;  // 请求 URI
    struct _php_stream *request_body;
    const char *content_type;  // 内容类型
    zend_bool headers_only;
    zend_bool no_headers;
    zend_bool headers_read;
    sapi_post_entry *post_entry;  // Post 内容
    char *content_type_dup;
    /* for HTTP authentication */  // 下面三个用于 HTTP 验证
    char *auth_user;
    char *auth_password;
    char *auth_digest;

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

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

比如我现在要获取是否为 POST 请求,那么

/* {{{ proto bool isPost(void) */
PHP_FUNCTION(isPost)
{
    if (!SG(request_info).request_method) {
        RETURN_FALSE;
    }
    RETURN_BOOL(0 == strcasecmp(SG(request_info).request_method, "POST"));
}
/* }}} */

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 119,287评论 16 133
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 155,822评论 24 680
  • ##第一节:环境搭建 编译安装的关键点:配置编译安装环境,build-essential环境。 1.1 准备编译环...
    你很闹i阅读 364评论 1 2
  • 在我左思右想的时候,又一部小说横空出世。名字叫《青春校园,不散场》。这是我的真实生活所改编的,望大家喜欢哦! ...
    神马星星果阅读 45评论 10 0
  • 苏东坡: 宁可食无肉,不可居无竹。无肉令人瘦,无竹使人俗。 郑板桥: (一)秋风昨夜渡潇湘,触石穿林惯作狂。惟有竹...
    靥墨阅读 108评论 0 0