superglobales - ¿Cómo es exactamente cómo PHP crea superglobal $_POST, $_GET, $_COOKIE y $_REQUEST?
php post request (4)
Lo siento por el título confuso de la pregunta, intentaré aclarar cuál es el problema.
Estoy trabajando con el servidor Mongrel2 y estoy escribiendo un controlador de PHP que tiene acceso a los datos de solicitud HTTP sin procesar. Como tengo PHP detrás de Mongrel2, no hay creación automática de las variables $ _POST, $ _GET, $ _COOKIE y $ _REQUEST.
La pregunta es: ¿hay alguna manera de que pueda enviar la solicitud HTTP sin formato a una función PHP (o cualquier otra cosa) que genere las variables superglobales que normalmente están disponibles cuando se usa Apache + PHP?
Nota: podría analizar la solicitud HTTP manualmente y crear esas variables yo mismo, pero no pude encontrar ninguna documentación sobre cómo PHP realiza exactamente este análisis e importación HTTP en superglobals. Si es posible, me gustaría automatizar este proceso de creación superglobal sin tener que analizar las solicitudes HTTP por mí mismo.
Gracias por cualquier entrada.
$ _POST, $ _GET, $ _COOKIE y $ _REQUEST están disponibles en PHP cada vez, también si php se ejecutó en la línea de comandos. Estas matrices son de escritura, puede agregar valores a la matriz $ _POST y obtener una en cualquier otro lugar.
Este código es completamente correcto y viable si se ejecuta desde la consola:
<?php
$_POST[''test''] = ''1'';
echo "/$_POST in global scope:/n";
var_dump($_POST);
function p() {
echo "/$_POST in function scope:/n";
var_dump($_POST);
echo "Others super-global array in function scope:/n";
var_dump($_REQUEST);
var_dump($_COOKIE);
}
p();
Resultado:
$_POST in global scope:
array(1) {
''test'' =>
string(1) "1"
}
$_POST in function scope:
array(1) {
''test'' =>
string(1) "1"
}
Others super-global array in function scope:
array(0) {
}
array(0) {
}
Editar
Además, puede crear una clase y guardar datos de HttpRequest en el campo estático de la misma. En este caso, puedes usarlo desde cualquier lugar.
Encontrado en php.net tal vez esto sea útil:
$_POST = array();
$str = ''first=value&arr[]=foo+bar&arr[]=baz'';
parse_str(html_entity_decode($str), $_POST);
print_r($_POST);
Array
(
[first] => value
[arr] => Array
(
[0] => foo bar
[1] => baz
)
)
Nota:
La configuración magic_quotes_gpc afecta la salida de esta función, ya que parse_str () usa el mismo mecanismo que PHP utiliza para llenar las variables $ _GET, $ _POST, etc.
Estoy tratando de contribuir a esta pregunta con el conocimiento que conozco.
Enviar una solicitud HTTP con dichos encabezados puede duplicar la variable POST
POST /somepage.php HTTP/1.1
Host: www.domain.com
User-Agent: Mozilla/12.0
Content-Length: 31
Content-Type: application/x-www-form-urlencoded
parameter=value&testcode=value1
También es posible que desee comprobar la biblioteca de PHP HttpRequest
. [Comience aquí] . Para los datos de la POST, puede anular el contenido anterior de la POST utilizando HttpRequest::setPostFields()
y configurar sus propios datos para ello.
HttpRequest::setPostFields(array(
"parameter" => "value"
));
La creación de estas variables se maneja en las entrañas de PHP, en main/php_variables.c
, en php_auto_globals_create_get()
y funciones similares. Desde PHP 5.4.3:
static zend_bool php_auto_globals_create_get(const char *name, uint name_len TSRMLS_DC)
{
zval *vars;
if (PG(variables_order) && (strchr(PG(variables_order),''G'') || strchr(PG(variables_order),''g''))) {
sapi_module.treat_data(PARSE_GET, NULL, NULL TSRMLS_CC);
vars = PG(http_globals)[TRACK_VARS_GET];
} else {
ALLOC_ZVAL(vars);
array_init(vars);
INIT_PZVAL(vars);
if (PG(http_globals)[TRACK_VARS_GET]) {
zval_ptr_dtor(&PG(http_globals)[TRACK_VARS_GET]);
}
PG(http_globals)[TRACK_VARS_GET] = vars;
}
zend_hash_update(&EG(symbol_table), name, name_len + 1, &vars, sizeof(zval *), NULL);
Z_ADDREF_P(vars);
return 0; /* don''t rearm */
}
Esto termina llamando directamente al SAPI (por ejemplo, módulo Apache / CGI / FastCGI / lo que sea) para buscar variables. No creo que haya ninguna manera de alterar la forma en que esto funciona si te encuentras en un entorno extraño donde las variables GET / POST / etc no están donde PHP espera que estén.