2013-12-23 123 views
6

我有一個Perl CGI應用程序有時會超時,導致它被Apache和504 Gateway Time-out錯誤發送給瀏覽器。我試圖用型材本NYTProf應用,但是我無法讀取配置文件數據:分析超時的Perl CGI腳本

$ nytprofhtml -f www/cgi-local/nytprof.out 
Reading www/cgi-local/nytprof.out 
Profile data incomplete, inflate error -5 ((null)) at end of input file, perhaps the process didn't exit cleanly or the file has been truncated (refer to TROUBLESHOOTING in the documentation) 

我使用sigexit=1 NYTProf選項。下面是再現問題最少的CGI腳本:

#!/usr/bin/perl -d:NYTProf 

sleep 1 while 1; 

回答

6

設置sigexit=1告訴NYTProf趕上下列信號:

INT HUP PIPE BUS SEGV 

然而,當你的CGI腳本超時,Apache的發送SIGTERM。你需要捕捉SIGTERM

sigexit=term 

爲了趕上SIGTERM除了默認的信號,使用:

sigexit=int,hup,pipe,bus,segv,term 
1

CGI.pm有debug mode,您可以使用命令行運行您的程序,並通過您的CGI參數鍵/值對。

它還有一個功能,您可以使用save your params to a file,然後在稍後讀取該文件。

我所做的是添加了代碼來保存params到一個文件,並通過瀏覽器運行我的程序。這也有助於我確保瀏覽器發送正確數據的能力。

然後我更改代碼以從文件中讀取參數,並按需要經常運行它,直到我調試完其他所有內容爲止。

一旦從命令行運行到您滿意的程序,您就可以通過nytprof運行它,找出所有時間都在使用的東西。