學習使用apache的cgi問題

   cgi是實現前後臺交互的一個很簡單的方法,前臺通過瀏覽器輸入一段“http://webServer/cgiName.cgi?parameter”的字符串,後臺服務器部署apache之後,在後臺實現cgi程序響應前臺的服務請求。

   這段時間需要使用cgi去完成一個簡單的請求服務功能,前臺通過vbs腳本輸入字符串給後臺,其中str爲cgi字符串。服務器接收到字符串之後

Set objhttp = createobject("msxml2.xmlhttp")

objhttp.open "GET",str, False

objhttp.send("")

對字符串進行解析,然後完成後臺服務,再將處理的結果printf給前臺。

    本來是一個很簡單的cgi程序,但是在實現之後卻遇到了大麻煩。問題是實現的cgi程序之後,gdb調試沒問題,前臺調用腳本執行也沒問題。但是執行幾次問題就來了。前臺腳本執行沒有結果,在瀏覽器中輸入cgi字符串,返回的是500錯誤。查看apache錯誤日誌,發現報錯“Premature end of script headers”。這個問題一般是因爲後臺找不到正確的路徑報錯。而我程序裏的操作文件都是根據絕對路徑進行操作的,這確實很奇怪。有經驗的同事講在cgi中使用fopen函數一般使用相對路徑。改爲相對路徑之後,果然在前臺可以繼續使用cgi了。但是好景不長,執行幾次還是出現開始的問題。看來由絕對路徑改爲相對路徑並沒有解決根本問題。難道是我在程序中打開文件的次數過多,導致文件句柄太多造成。對程序再次檢查之後發現有一處打開文件之後,操作完沒有使用fclose關掉。於是竊喜,以爲發現問題了。然後網上有人講apache錯誤“Premature end of script headers”一般是因爲在輸出之前沒有輸出回車換行導致的,於是在正式輸出之前先輸出“/r/n”重編後執行,目前還沒有出現之前的問題。後續還得繼續觀察一段時間。

    由此總結了幾個問題:

1. 爲什麼cgi訪問一會可以一會報錯?(難道是之前忘fclose一個文件,導致執行幾次cgi後文件操作故障?不解。。。)

2. 爲什麼在服務器端執行cgi程序沒問題,前臺執行就報500錯誤? 不解,有朋友說是打屏的時候應該先輸出“/r/n”

,但是我的head裏面已經先輸出“/r/n”了。

 

結論是:有經驗的同事告訴我,最好還是少用些文件操作,目前修改的程序先跑着吧,要是出問題了(千萬別出問題呀) 就把文件操作精簡下,能用字符串在內存中操作的,堅決不用輸出文件。   

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章