2012-06-28 14 views
7

Ho un sito Web con uno script personalizzato in esecuzione su un servizio di hosting VPS. Tutti gli script escono attraverso index.php tramite mod_rewrite e .htaccess per gli URL amichevoliCome rintracciare lo script PHP che esegue un determinato processo?

Qualcosa nel mio script sta generando alto utilizzo della CPU, come spettacolo: CPU usage

Quando vado e strace un dato processo ottengo questo che non capisco:

setitimer(ITIMER_PROF, {it_interval={0, 0}, it_value={90, 0}}, NULL) = 0 
    rt_sigaction(SIGPROF, {0x7a6b8f, [PROF], SA_RESTORER|SA_RESTART, 0x2af8ae8742f0}, {0x7a6b8f, [PROF], SA_RESTORER|SA_RESTART, 0x2af8ae8742f0}, 8) = 0 
    rt_sigprocmask(SIG_UNBLOCK, [PROF], NULL, 8) = 0 

Questo viene ripetuto continuamente in un ciclo infinito.

Quello che devo sapere è come rintracciare lo script PHP esatto che causa questo problema. Eventuali suggerimenti?

+1

Abilitare la registrazione degli errori. Imposta il tempo massimo di esecuzione. Dai un'occhiata al log degli errori che lo script non funziona bene. Probabilmente crea il tuo gestore di errori che è in grado di scaricare i dettagli della richiesta nel caso in cui venga attivato l'errore di timeout, quindi puoi iniziare a riprodurlo con un debugger remoto. – hakre

+0

E quale API stai usando? CGI? – hakre

risposta

2

Utilizzare la funzione getmypid() nel proprio script. Esegui semplicemente questo in un file di registro o qualcosa per vedere quale script è quale.

EDIT: Utilizzare l'impostazione auto_prepend_file config per includere automaticamente questo frammento in tutti i tuoi file:

php_value auto_prepend_file append.php 
+0

Il problema è che non sa quale script sia ... – Josh

+0

Ovviamente no. Suppongo che stia cercando di capirlo eseguendo il debug delle sue sceneggiature. Non ha detto che non può modificare i suoi script. Sto suggerendo all'OP di modificare i suoi script per annotare quale PID utilizza ogni script per aiutare nei suoi sforzi di tracciamento. – davidethell

+1

Quindi stai suggerendo di aggiungerlo ad ogni file PHP? OK. Penso di vedere cosa intendi. Se esegue ogni registro di script '__FILE__' * e *' getmypid() ', questa è una risposta valida. – Josh

6

Se si può ottenere the PECL proctitle package nel vostro PHP installazione, è possibile utilizzare che per fare index.php impostare il titolo processo al nome della sceneggiatura a cui è stata passata. (Il titolo del processo alterato può o non può apparire in particolari visualizzatori di tabelle di processo, usare ps se tutto il resto fallisce.)

+1

Oh cool: D imparo qualcosa di nuovo ogni giorno. – Leigh

+0

Questo è un trucco ingegnoso! Dovrò ricordarlo. – Josh

+0

@chaos come faccio a sapere se è disponibile sul mio host? se no, come lo installo e se è installato .. come lo uso? –

Problemi correlati