设为首页 收藏本站
查看: 510|回复: 0

[经验分享] PHP内核中读取$_GET\$_POST等全局变量

[复制链接]

尚未签到

发表于 2017-4-6 08:04:42 | 显示全部楼层 |阅读模式
一、内核中获取$_GET\$_POST\$_SERVER\$_FILES\$_COOKIE等全局变量

HashTable是PHP很多实现的基础,例如$_GET\$_POST等全局变量实现。

那么,在扩展中读取这些全局变量,当然还是操作HashTable。

内核中初始化环境变量的通过main/php_variables.c中php_hash_environment(TSRMLS_D)
  PHP在初始化环境变量的同时,考虑到对大变量的读性能,会通过main/php_variables.c的php_startup_auto_globals来注册一份只读的环境变量。

void php_startup_auto_globals(TSRMLS_D)
{
zend_register_auto_global("_GET", sizeof("_GET")-1, NULL TSRMLS_CC);
zend_register_auto_global("_POST", sizeof("_POST")-1, NULL TSRMLS_CC);
zend_register_auto_global("_COOKIE", sizeof("_COOKIE")-1, NULL TSRMLS_CC);
zend_register_auto_global("_SERVER", sizeof("_SERVER")-1, php_auto_globals_create_server TSRMLS_CC);
zend_register_auto_global("_ENV", sizeof("_ENV")-1, php_auto_globals_create_env TSRMLS_CC);
zend_register_auto_global("_REQUEST", sizeof("_REQUEST")-1, php_auto_globals_create_request TSRMLS_CC);
zend_register_auto_global("_FILES", sizeof("_FILES")-1, NULL TSRMLS_CC);
}只读环境变量的读取方式:
&PG(http_globals)[TRACK_VARS_GET];
&PG(http_globals)[TRACK_VARS_POST];
&PG(http_globals)[TRACK_VARS_REQUEST];
&PG(http_globals)[TRACK_VARS_COOKIE];
&PG(http_globals)[TRACK_VARS_ENV];
&PG(http_globals)[TRACK_VARS_FILES];


其中用到的宏为内核提供
/*main/php_globals.h*/
#define TRACK_VARS_POST0
#define TRACK_VARS_GET1
#define TRACK_VARS_COOKIE2
#define TRACK_VARS_SERVER3
#define TRACK_VARS_ENV4
#define TRACK_VARS_FILES5
#define TRACK_VARS_REQUEST6


如果需要对环境变量进行修改,可以在全局作用域中搜索:
(void)zend_hash_find(&EG(symbol_table), ZEND_STRS("_GET"), (void **)&carrier);
(void)zend_hash_find(&EG(symbol_table), ZEND_STRS("_POST"), (void **)&carrier);
(void)zend_hash_find(&EG(symbol_table), ZEND_STRS("_REQUEST"), (void **)&carrier);
(void)zend_hash_find(&EG(symbol_table), ZEND_STRS("_COOKIE"), (void **)&carrier);
(void)zend_hash_find(&EG(symbol_table), ZEND_STRS("_FILES"), (void **)&carrier);
(void)zend_hash_find(&EG(symbol_table), ZEND_STRS("_ENV"), (void **)&carrier);


  二、现在来看案例,定义一个类request,拥有方法getQuery与getPost.来读取$_GET和$_POST

/*
* fw_request.c
*
*  Created on: 2012-6-19
*      Author: jy
*/
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_ini.h"
#include "main/SAPI.h"
#include "Zend/zend_exceptions.h"
#include "Zend/zend_alloc.h"
#include "php_fw.h"
#include "fw_request.h"
zend_class_entry *request;
/**
*
class Request  {
public mixed  getLang ( void  );
public mixed  getQuery ( string  $name = NULL );
}
*/
//定义类方法的参数类型,使内核自动校验参数类型
ZEND_BEGIN_ARG_INFO(getQueryArgs, 1)
ZEND_ARG_INFO(0, name)
ZEND_END_ARG_INFO()
ZEND_BEGIN_ARG_INFO(getPostArgs, 1)
ZEND_ARG_INFO(0, name)
ZEND_END_ARG_INFO()
ZEND_METHOD(request, getQuery)
{
zval **carrier;
zval *key, *ret;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &key) == FAILURE){
RETURN_FALSE;
}
ret = request_query(TRACK_VARS_GET, Z_STRVAL_P(key), Z_STRLEN_P(key) TSRMLS_CC);
RETURN_ZVAL(ret, 0, NULL);
}
ZEND_METHOD(request, getPost)
{
zval **carrier;
zval *key, *ret;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "z", &key) == FAILURE){
RETURN_FALSE;
}
ret = request_query(TRACK_VARS_POST, Z_STRVAL_P(key), Z_STRLEN_P(key) TSRMLS_CC);
RETURN_ZVAL(ret, 0, NULL);
}
zend_function_entry functions_entry[] = {
PHP_ME(request, getQuery, getQueryArgs, ZEND_ACC_PUBLIC)
PHP_ME(request, getPost, getPostArgs, ZEND_ACC_PUBLIC)
};
ZEND_MINIT_FUNCTION(fw_request)
{
zend_class_entry ce;
INIT_CLASS_ENTRY(ce, "request", functions_entry);
request = zend_register_internal_class_ex(&ce, NULL, NULL TSRMLS_CC);
return SUCCESS;
}
/*
定义request_query来完成内核中读取$_GET\$_POST\$_SERVER\$_FILES\$_COOKIE\$_REQUEST
其中只有$_REQUEST的值是可修改的
*/
zval * request_query(uint type, char * name, uint len TSRMLS_DC) {
zval **carrier, **ret;
zend_bool jit_initialization = (PG(auto_globals_jit) && !PG(register_globals) && !PG(register_long_arrays));
switch (type) {
case TRACK_VARS_POST:
case TRACK_VARS_GET:
case TRACK_VARS_FILES:
case TRACK_VARS_COOKIE:
carrier = &PG(http_globals)[type];
break;
case TRACK_VARS_ENV:
if (jit_initialization) {
zend_is_auto_global(ZEND_STRL("_ENV") TSRMLS_CC);
}
carrier = &PG(http_globals)[type];
break;
case TRACK_VARS_SERVER:
if (jit_initialization) {
zend_is_auto_global(ZEND_STRL("_SERVER") TSRMLS_CC);
}
carrier = &PG(http_globals)[type];
break;
case TRACK_VARS_REQUEST:
if (jit_initialization) {
zend_is_auto_global(ZEND_STRL("_REQUEST") TSRMLS_CC);
}
(void)zend_hash_find(&EG(symbol_table), ZEND_STRS("_REQUEST"), (void **)&carrier);
break;
default:
break;
}
if (!carrier || !(*carrier)) {
zval *empty;
MAKE_STD_ZVAL(empty);
ZVAL_NULL(empty);
return empty;
}
if (!len) {
Z_ADDREF_P(*carrier);
return *carrier;
}
if (zend_hash_find(Z_ARRVAL_PP(carrier), name, len + 1, (void **)&ret) == FAILURE) {
zval *empty;
MAKE_STD_ZVAL(empty);
ZVAL_NULL(empty);
return empty;
}
Z_ADDREF_P(*ret);
return *ret;
}


三、网页访问PHP测试  访问网址http://localhost/test.php?get=test,这个网址由你本地环境决定


$_GET['test'] = "abc";
$obj = new request();
echo $obj->getQuery('test')."<br>";
echo $obj->getPost('test');


输出结果:

test




这也证明了,request_query读取的是只读全局变量。
  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-360769-1-1.html 上篇帖子: paip.php调试imcompatible debug sever version..with zend debugger 下篇帖子: 关于"Action=http://qurl.f.360.cn/check_outchain.php"
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表