Как определить, какой скрипт выполняется в процессе PHP-FPM

Я запускаю nginx + php-fpm. Есть ли способ, как я могу узнать, что делает каждый из процессов PHP? Что-то вроде extended mod_status в apache, где я вижу, что процесс apache с PID x обрабатывает URL y. Я не уверен, что процесс PHP знает URL-адрес, но получение пути и имени скрипта будет достаточным.

4 ответов


после нескольких часов поиска и просмотра PHP.net система отслеживания ошибок я нашел решение. Он доступен с PHP 5.3.8 или 5.3.9, но, похоже, не документирован. На основе запроса функции #54577, страница состояния поддерживает опцию full, который будет отображать состояние каждого работника отдельно. Так, например, URL будет http://server.com/php-status?full и пример вывода выглядит так:

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

PHP-FPM имеет встроенный монитор состояния, хотя это не так подробно, как mod_status. Из файла конфигурации php-fpm /etc/php-fpm.d/www.conf (на 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

Если вы включите это, вы можете передать путь от nginx к сокету / порту для PHP-FPM, и вы можете просмотреть страницу состояния.

nginx.conf:

location /status {

    include fastcgi_params;
    fastcgi_pass unix:/var/lib/php/php-fpm.sock;

}

командная строка cgi более удобна:

SCRIPT_NAME=/status \
SCRIPT_FILENAME=/status \
REQUEST_METHOD=GET \
cgi-fcgi -bind -connect 127.0.0.1:9000

вы можете использовать strace, чтобы показать запускаемые скрипты - и многое другое - в режиме реального времени. Это довольно многословно, но это может дать вам хорошую общую картину того, что происходит:

# switch php-fpm7.0 for process you're using
sudo strace -f $(pidof php-fpm7.0 | sed 's/\([0-9]*\)/\-p /g')

выше будет присоединяться к раздвоенным процессам php fpm. Использовать -p для присоединения к определенному pid.

выше будет получить путь scrip. Чтобы получить URL-адреса, вы посмотрите на свои журналы доступа nginx / apache.

в качестве примечания, чтобы увидеть syscalls и которые одни берут длинный:

sudo strace -c -f $(pidof php-fpm7.0 | sed 's/\([0-9]*\)/\-p /g')

подождите немного, затем нажмите Ctr-C