strip_tags - ¿Dónde está el punto de entrada principal de php-src/PHP-Internals
strip_tags wordpress (1)
¿Qué función o bit de código sirve como punto de entrada principal para ejecutar / interpretar un programa PHP en la fuente de PHP en sí ? Basado en cosas que he buscado en Google o leído en libros, sé que PHP está diseñado para funcionar con un servidor de algún tipo (incluso el comando CLI funciona al iniciar "la línea de comandos SAPI", que funciona como un mini servidor diseñado para procesar una sola solicitud), y que el servidor le pedirá a PHP que ejecute un programa.
Conozco las funciones de ciclo de vida de minit
y rinit
, que sirven como puntos de entrada para una extensión de PHP .
Lo que no sé es dónde el código fuente de PHP tiene esta conversación consigo mismo.
Hey mira, hay un programa PHP en este archivo / cadena. Debería correrlo
No estoy tratando de realizar ninguna tarea específica aquí. Estoy tratando de entender cómo los elementos internos de PHP hacen lo que hace y encontrar un punto de entrada principal donde pueda comenzar a seguir su ejecución.
¿Dónde está el punto de entrada del código de algún SAPI?
El CLI es una aplicación independiente. Como cualquier otra aplicación escrita en C, su punto de entrada es la función main()
(archivo sapi/cli/php_cli.c
, línea 1200
):
int main(int argc, char *argv[])
Hay dos versiones de la CLI para Windows, una de ellas es una aplicación de consola y comienza con la función main()
descrita anteriormente, la otra es una aplicación GUI de Windows (no crea una consola cuando se inicia y usa cuadros de mensajes) para salida) que comienza con la función WinMain()
(archivo sapi/cli/php_cli.c
, línea 1198
).
main()
y WinMain()
usan el mismo código aquí. Tienen diferentes nombres y diferentes fragmentos de código aquí y allá al verificar si el símbolo PHP_CLI_WIN32_NO_CONSOLE
está definido. Se define en el archivo sapi/cli/cli_win32.c
que se utiliza para generar la aplicación GUI de Windows.
</Windows>
La versión CGI también es una aplicación de consola independiente. Su punto de entrada es también la función main()
en el archivo sapi/cgi/cgi_main.c
, línea 1792
.
Similarmente, la versión FPM comienza con main()
en el archivo sapi/fpm/fpm/fpm_main.c
, línea 1570
.
El controlador Apache2 es un módulo que se puede cargar dinámicamente ( .dll
en Windows, .so
en sistemas similares a Unix). Registra algunas funciones como controladores de eventos para los eventos publicados por el servidor web (inicio del servidor, configuración previa / posterior cargada, solicitud de proceso, etc.). Estos controladores están registrados por la función php_ap2_register_hook()
en el archivo sapi/apache2handler/sapi_apache2.c
, línea sapi/apache2handler/sapi_apache2.c .
(Puede encontrar detalles sobre cómo un módulo cargable se integra con Apache en la documentación de Apache ).
El controlador que nos interesa es la función php_handler()
que se invoca para manejar una solicitud HTTP.
De manera similar, cada SAPI tiene un punto de entrada ( main()
o una función invocada por el servidor web).
Todos estos puntos de entrada hacen un procesamiento similar:
- inicializarse ellos mismos
- analice los argumentos de la línea de comandos (solo si es CLI , CGI u otro tipo de aplicación independiente);
- lea
php.ini
y / u otra configuración que tengan (la configuración del módulo Apache se puede anular en.htaccess
); - cree un flujo usando el archivo de entrada y páselo a la función
php_execute_script()
definida en el archivomain/main.c
, línea php_execute_script() ; - limpie y devuelva un código de salida al proceso de llamada (el shell o el servidor web).
¿Dónde está el código que realmente ejecuta un script PHP?
La función php_execute_script()
es una envoltura; interpreta las entradas de configuración de php.ini
auto_prepend_file
y auto_prepend_file , prepara la lista de archivos (auto-prepend, script principal, auto-append) y pasa la lista a zend_execute_scripts()
que los procesa.
php_execute_script()
no siempre se invoca, algunos SAPIs y los argumentos de la línea de comandos de la CLI producen la invocación directa de zend_execute_scripts()
.
zend_execute_scripts()
es donde suceden las cosas interesantes.
compiles el archivo PHP (y devuelve una lista de códigos OP en op_array
entonces, si la compilación es exitosa (el op_array
devuelto no es NULL
) executes los códigos OP. También hay un manejo y limpieza de excepciones; trabajo aburrido, pero tan importante como El análisis y las ejecuciones sin embargo.
La compilación es un proceso tedioso. Se realiza mediante la función zendparse()
definida en el archivo Zend/zend_language_parser.c
. La definición de la función zendparse()
y el archivo Zend/zend_language_parser.c
no se ven en ningún lugar en el repositorio de Git; el analizador se genera utilizando bison
y re2c
que leen las reglas de sintaxis del lenguaje y la definición de tokens léxicos de Zend/zend_language_parser.y
y Zend/zend_language_scanner.l
y generan el compilador real en el archivo Zend/zend_language_parser.c
.
Sin embargo, incluso si el trabajo duro no es visible en el repositorio, las partes interesantes del proceso de compilación son visibles en los archivos mencionados anteriormente.
La ejecución del script compilado (la lista de códigos OP) se realiza mediante la función zend_execute()
que se define en el archivo Zend/zend_vm_execute.h
. Este también es un archivo generado y la parte interesante es que está generado por un script PHP.
El script del generador ( Zend/zend_vm_gen.php
) usa zend_vm_def.h
y zend_vm_execute.skl
para generar Zend/zend_vm_execute.h y zend_vm_opcodes.h
.
zend_vm_def.h
contiene el código de intérprete real que se ejecuta para manejar cada código OP.
¿Dónde está el código de alguna función proporcionada por el núcleo de PHP o una de sus extensiones empaquetadas?
El código de las funciones de PHP y las funciones proporcionadas por las extensiones es de alguna manera más fácil de seguir. Las funciones incluidas en el núcleo de PHP están ubicadas en archivos en el directorio ext/standard
, las funciones proporcionadas por otras extensiones están ubicadas en archivos en los subdirectorios ext
correspondientes.
En estos archivos, las funciones de C que implementan funciones de PHP se declaran utilizando la macro PHP_FUNCTION()
. Por ejemplo, la implementación de la función de PHP strpos()
comienza en el archivo ext/standard/string.c
, línea 1948
. La función strchr()
es un alias de strstr()
se declara usando la macro PHP_FALIAS()
en el archivo ext/standard/basic_functions.c
en la línea ext/standard/basic_functions.c .
Y así sucesivamente y así sucesivamente.