PHP 扩展 - 获取当前请求 IP 地址

在 PHP 中获取 IP 地址通常都是来自 $_SERVER 全局变量中,比如

$_SERVER['HTTP_CLIENT_IP'];
// OR
$_SERVER['HTTP_X_FORWARDED_FOR'];
// OR
$_SERVER['HTTP_X_REAL_IP'];  // 更多自定义的 key
// OR
$_SERVER['REMOTE_ADDR'];

也有可能在被前端 Web server 或 load balance 附加到请求头上,如 nginx 中可能设置了

proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; 

根据上面的逻辑,我简单实现了如下的一个方法

// azalea.h
PHP_FUNCTION(azalea_ip);
// azalea.c

/* {{{ azalea_getmodel
 */
PHP_FUNCTION(azalea_ip)
{
    zval *server, *field;
    zend_string *ip = NULL;

    server = zend_hash_str_find(&EG(symbol_table), "_SERVER", sizeof("_SERVER") - 1);
    if (Z_TYPE_P(server) == IS_ARRAY) {
        if ((field= zend_hash_str_find(Z_ARRVAL_P(server), "HTTP_CLIENT_IP", sizeof("HTTP_CLIENT_IP") - 1)) &&
                Z_TYPE_P(field) == IS_STRING) {
            ip = Z_STR_P(field);
        } else if ((field = zend_hash_str_find(Z_ARRVAL_P(server), "HTTP_X_FORWARDED_FOR", sizeof("HTTP_X_FORWARDED_FOR") - 1)) &&
                Z_TYPE_P(field) == IS_STRING) {
            ip = Z_STR_P(field);
        } else if ((field = zend_hash_str_find(Z_ARRVAL_P(server), "REMOTE_ADDR", sizeof("REMOTE_ADDR") - 1)) &&
                Z_TYPE_P(field) == IS_STRING) {
            ip = Z_STR_P(field);
        }
    }
    if (ip) {
        zend_string_copy(ip);
    } else {
        ip = zend_string_init("0.0.0.0", sizeof("0.0.0.0") - 1, 0);  // 默认值
    }
    RETURN_STR(ip);
}
/* }}} */

当然了,PHP 通过 $_SERVER 甚至 request header 来获取 IP 都不是绝对靠谱的方法,还得看架构和运行环境。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,896评论 18 139
  • 上一篇《WEB请求处理一:浏览器请求发起处理》,我们讲述了浏览器端请求发起过程,通过DNS域名解析服务器IP,并建...
    七寸知架构阅读 81,198评论 21 356
  • 0 系列目录# WEB请求处理 WEB请求处理一:浏览器请求发起处理 WEB请求处理二:Nginx请求反向代理 本...
    七寸知架构阅读 14,054评论 22 190
  • 冬日的暖阳中,看书,绿妖所写关于他们与北京相处的故事,写刚进北京时候的故事,读起来确实犹如江湖。这本书叫做《在自己...
    杨黎黎Lily阅读 581评论 0 1
  • 都说金牛座的人爱好美食甚于一切 你说过你爱吃鱼,更擅长做鱼 只是很可惜 我只吃过一次你做的平锅鱼 可也只是那一次 ...
    Q七寸阅读 219评论 0 0