Какие данные вам действительно нужны? - Лучший способ для большинства данных - обратиться к структуре 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
определяется как 0
и FAILURE
как -1
, что не соответствует ожиданиям, поэтому всегда используйте эти константы!