w3schools superglobales ejemplo _request php http

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&amp;arr[]=foo+bar&amp;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.

http://php.net/manual/en/function.parse-str.php


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.