fastcgi - significado - php-fpm nginx
Cómo determinar qué script se está ejecutando en el proceso PHP-FPM (4)
Estoy ejecutando nginx + php-fpm. ¿Hay alguna manera, cómo puedo saber qué está haciendo cada uno de los procesos de PHP? Algo así como mod_status extendido en apache, donde puedo ver que el proceso de apache con PID x está procesando la URL y. No estoy seguro de si el proceso de PHP conoce la URL, pero será suficiente obtener la ruta y el nombre del script.
PHP-FPM tiene un monitor de estado incorporado, aunque no es tan detallado como mod_status. Desde el archivo de configuración php-fpm /etc/php-fpm.d/www.conf
(en CentOS 6)
; The URI to view the FPM status page. If this value is not set, no URI will be
; recognized as a status page. By default, the status page shows the following
; information:
; accepted conn - the number of request accepted by the pool;
; pool - the name of the pool;
; process manager - static or dynamic;
; idle processes - the number of idle processes;
; active processes - the number of active processes;
; total processes - the number of idle + active processes.
; The values of ''idle processes'', ''active processes'' and ''total processes'' are
; updated each second. The value of ''accepted conn'' is updated in real time.
; Example output:
; accepted conn: 12073
; pool: www
; process manager: static
; idle processes: 35
; active processes: 65
; total processes: 100
; By default the status page output is formatted as text/plain. Passing either
; ''html'' or ''json'' as a query string will return the corresponding output
; syntax. Example:
; http://www.foo.bar/status
; http://www.foo.bar/status?json
; http://www.foo.bar/status?html
; Note: The value must start with a leading slash (/). The value can be
; anything, but it may not be a good idea to use the .php extension or it
; may conflict with a real PHP file.
; Default Value: not set
;pm.status_path = /status
Si habilita esto, puede pasar la ruta de acceso de nginx a su socket / puerto para PHP-FPM y puede ver la página de estado.
nginx.conf:
location /status {
include fastcgi_params;
fastcgi_pass unix:/var/lib/php/php-fpm.sock;
}
Puede usar strace para mostrar los scripts que se ejecutan, y muchas otras cosas, en tiempo real. Es bastante detallado, pero puede darle una buena imagen general de lo que está pasando:
# switch php-fpm7.0 for process you''re using
sudo strace -f $(pidof php-fpm7.0 | sed ''s//([0-9]*/)//-p /1/g'')
Lo anterior se adjuntará a los procesos bifurcados de php fpm. Utilice -p
para adjuntar a un pid particular.
Lo anterior obtendría la ruta del script. Para obtener las direcciones URL, debería mirar sus registros de acceso nginx / apache.
Como nota al margen, para ver los syscalls y cuáles están tomando más tiempo:
sudo strace -c -f $(pidof php-fpm7.0 | sed ''s//([0-9]*/)//-p /1/g'')
Espera un momento, luego presiona Ctr-C
cgi línea de comandos es más conveniente:
SCRIPT_NAME=/status /
SCRIPT_FILENAME=/status /
REQUEST_METHOD=GET /
cgi-fcgi -bind -connect 127.0.0.1:9000
Después de algunas horas de googlear y de navegar por el sistema de seguimiento de errores PHP.net, he encontrado la solución. Está disponible desde PHP 5.3.8 o 5.3.9, pero no parece estar documentado. En función de la solicitud de función #54577 , la página de estado admite la opción full
, que mostrará el estado de cada trabajador por separado. Entonces, por ejemplo, la URL será http://server.com/php-status?full
y la salida de muestra se verá así:
pid: 22816
state: Idle
start time: 22/Feb/2013:15:03:42 +0100
start since: 10933
requests: 28352
request duration: 1392
request method: GET
request URI: /ad.php?zID=597
content length: 0
user: -
script: /home/web/server.com/ad/ad.php
last request cpu: 718.39
last request memory: 1310720