2011-08-12 18 views
6

基本上,我試圖弄清楚如何從「web服務器」調用PHP。從虛擬/定製「web服務器」調用PHP

我已閱讀文檔,但沒有多大幫助。

據我所知,有三種方法來調用PHP:通過命令行(例如:php -f "/path/to/script.php"

  • 通過CGI
  • (??)/通過的FastCGI(???)通過網絡服務器(例如:阿帕奇)
  • 模塊

所以,讓我們開始CGI。也許我只是盲目的,但規範並沒有提到Web服務器如何將數據(標頭&回調)傳遞給實現CGI的東西。 FastCGI的情況更糟。

接下來,我們有服務器特定的模塊,我甚至不知道要搜索什麼,因爲所有線索都沒有結果。

+1

你有沒有考慮閱讀的代碼?在你的問題中所有這些東西都是開源的。 –

+0

@Dan我*現在正在嘗試*。但是由於以下幾個原因,證明很困難:**(1)**我找不到所有的代碼**(2)**代碼是用c/C++ **(3)**代碼很老, /或凌亂。 – Christian

+0

@丹說誰?如果我想(或者FPC,我打算這麼做),我可以在彙編程序或ADA中執行此操作。 – Christian

回答

7

調用CGI腳本非常簡單。 PHP有一些特殊性,但你基本上只需要設置環境變量的列表,然後調用PHP,CGI方式:

setenv GATEWAY_INTERFACE="CGI/1.1" 
setenv SCRIPT_FILENAME=/path/to/script.php 
setenv QUERY_STRING="id=123&name=title&parm=333" 
setenv REQUEST_METHOD="GET" 
... 

exec /usr/bin/php-cgi 

他們大多是樣板。 SCRIPT_FILENAME是如何將實際的php文件名傳遞給PHP解釋器,而不是作爲exec參數。 PHP的關鍵也是非標準變量REDIRECT_STATUS=200

對於GET請求,您只需要環境變量。對於POST請求,只需將HTTP請求主體作爲stdin傳遞給執行的php-cgi二進制文件。返回的stdout是由不完整的HTTP標頭,\ r \ n \ r \ n和頁面主體組成的CGI響應。

(只是從內存中。也許有一些更多的陷阱。)

+0

OH。這解釋了一切。 – Christian

+0

我面臨這個問題,那麼你需要顯式地填充'PATH_INFO'和'SCRIPT_PATH'變量。詳情請查看[我的問題](http://stackoverflow.com/questions/18962960) – Andrey

1

FastCGI的可能是最好的選擇,因爲它是如此明智地使用,它會給你的語言獨立性(你可以在Ruby中下降後,例如)和它的well documentedlotsofexamples

如果您真的想要,您可以編寫自己的Server API,但比實現FastCGI更復雜,並且有幾個缺點。

我不會打擾所有直CGI,FastCGI存在的原因。

+0

好的,Web服務器如何使用PHP可執行文件執行IPC?本地(環回)連接? – Christian

+0

@Christian它可能位於不同的主機上(任意TCP/IP連接),或者位於unix管道的另一端。請閱讀我所鏈接的規範,它很簡單。 –

+0

睡了幾個小時後,我會給它一個很好的看看。已經是凌晨2:30了:/ – Christian