2009-07-26 73 views
0

我正在嘗試製作一個Web應用程序,以便爲我管理我的Mercurial存儲庫。 我想要它,以便當我告訴它加載存儲庫X時:如何從PHP執行CGI文件?

  • 連接到MySQL服務器並確保X存在。
  • 檢查用戶是否被允許訪問存儲庫。
  • 如果上述屬實,從mysql服務器獲取X的位置。
  • 運行包含存儲庫路徑的hgweb cgi腳本(python)。

這是問題所在,我想:採取hgweb腳本,修改它並運行它。 但我不想:採取hgweb腳本,修改它,將其寫入文件並在那裏重定向。 我使用Apache來運行httpd進程。

回答

2

Ryan Ballantyne發表了正確答案(我向上投票)。反引號操作符是執行shell腳本的方式。

最簡單的解決方案可能是修改hgweb腳本,使其不會「包含」存儲庫本身的路徑。相反,將它作爲命令行參數傳遞。這意味着您不必擔心在任何地方修改和編寫hgweb腳本。所有你需要做的是:

//do stuff to get location of repository from MySQL into variable $x 
//run shell script 
$res = `python hgweb.py $x`; 
2

您可以在PHP中運行shell腳本。有很多種方法可以做到這一點,並且一些主機並沒有提供適當的權限,所有這些在php.net上都有詳細記錄。也就是說,最簡單的方法就是簡單地將你的命令用反引號括起來。所以,要解壓的文件,我可以說:

`unzip /path/to/file` 

所以,如果你的Python腳本是這樣的,它可以在命令行環境中運行(或者你可以修改它,以便運行),這將似乎是首選方法。

+0

這並沒有回答他的問題。 – 2009-07-26 23:42:08

+0

@Paul McMillan:很確定它確實回答了這個問題。問題是「我如何從PHP執行CGI文件?」,反引號操作符是要走的路。 – zombat 2009-07-26 23:54:18

0

就你問題而言,不,你不可能讓php執行一個修改後的腳本而不寫入某個地方,無論這是磁盤上的文件,映射到內存的虛擬文件還是類似的東西。

這聽起來像你可能試圖用樹枝砸鐵路釘。如果您根據存儲在MySQL中的用戶權限過濾訪問權限,您是否看過現有的HG解決方案以確保沒有比hgweb更適用的東西?這確實是爲了完成一件事而設計的,而且這超出了普通領域。

我可能會建議尋找Apache的本地身份驗證作爲一個更方便的方法來控制對存儲庫的訪問,然後只提供回購而不修改腳本。