2013-02-22 14 views
14

Używam nginx + php-fpm. Czy jest jakiś sposób, w jaki sposób mogę wiedzieć, co robi każdy z procesów PHP? Coś jak rozszerzony mod_status w apache, gdzie widzę, że proces apache z PID x przetwarza URL y. Nie jestem pewien, czy proces PHP zna adres URL, ale uzyskanie ścieżki i nazwy skryptu będzie wystarczające.Jak ustalić, który skrypt jest wykonywany w procesie PHP-FPM

Odpowiedz

24

Po kilku godzinach googlowania i przeglądanie PHP.net systemu śledzenia błędów znalazłem rozwiązanie. Jest dostępny od PHP 5.3.8 lub 5.3.9, ale nie wydaje się być udokumentowany. Na podstawie żądania funkcji #54577 strona stanu obsługuje opcję full, która wyświetla status każdego pracownika osobno. Więc na przykład adres URL będzie http://server.com/php-status?full i wyjście próbka wygląda następująco:

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 
+3

Inną bardzo użyteczną opcją jest: html, np: http://server.com/php-status?full&html (sformatuje dane wyjściowe jako tabelę html, co znacznie ułatwia obserwowanie wszystkich uruchomionych skryptów) – ivanhoe

+0

jak czy mogę uzyskać do niego dostęp shoud i dodaję dowolny parametr do konfiguracji nginx? –

+0

@babakfaghihian tak, musisz przekazać ten URL (na przykład '/ php-status') do php-fpm. – Marki555

6

PHP-FPM ma wbudowany monitor stanu, choć nie jest to tak szczegółowe, jak mod_status. Z pliku konfiguracyjnym php-fpm /etc/php-fpm.d/www.conf (na 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 

Jeśli włączysz tę można następnie przekazać ścieżkę z nginx do gniazda/portu dla PHP-FPM i można przeglądać strony stanu.

nginx.conf:

location /status { 

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

} 
+0

tak wiem o tym statusie z PHP-FPM, ja już go używać w monitorowaniu munin i zabbix. Zapewnia jednak jedynie informacje zbiorcze, a nie informacje dotyczące poszczególnych procesów. – Marki555

+0

Nie myśl, że można zrobić znacznie więcej oprócz tworzenia niestandardowego rozwiązania rejestrowania lub konfigurowania przetwarzania dzienników dostępu, ale to nie daje szczegółowych informacji, takich jak czas przetwarzania. Jestem pewien, że wraz z dojrzewaniem PHP-FPM rozszerzą raportowanie statusu. – sjdaws

+0

W końcu odkryłem, że strona statusu obsługuje informacje o procesach (zobacz moją odpowiedź). – Marki555

3

linii poleceń CGI jest bardziej wygodny:

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

Pamiętaj również, że musisz dodać 'QUERY_STRING = full', aby zwrócić to, czego szuka OP. Zmiana 'SCRIPT_FILENAME' na'/status? Full' nie działa. – Isius

+0

Nadal musisz włączyć stronę statusu, odkomentowując 'pm.status_path'; Zaletą tej metody jest to, że serwer ten nie musi być narażony na działanie serwera. 'SCRIPT_NAME' i' SCRIPT_FILENAME' powinny być takie same jak 'pm.status_path' z pliku' php-fpm.conf'. Ten ostatni parametr ('127.0.0.1: 9000') jest połączeniem z serwerem FCGI, * nie * serwerem sieciowym - powinien to być dowolny parametr' listen' znajdujący się w tym samym pliku INI. Jeśli jest to gniazdo, możesz potrzebować użyć 'sudo' do połączenia, w takim przypadku użyj również' -E', aby powiedzieć 'sudo', aby przechodził przez zmienne środowiskowe do' cgi-fcgi'. – Wolfgang

Powiązane problemy