2011-09-18 69 views
6

我對PHP不太熟練。我想知道如何在2個Web服務器之間進行通信。清除時,(從第一臺服務器)在遠程服務器上運行一個功能(查詢)。並將結果返回給第一臺服務器。PHP:遠程函數調用並返回結果?

其實主題將是:
Web Server (1) ---------------->Web Server (2) --------------->Database Server
Web Server (1) < ---------------- Web Server (2) < --------------- Database Server

Query Function()將僅位於Web Server (2)。然後我需要從Web Server (1)遠程運行query function()

這是什麼電話?這可能嗎?

+0

你有沒有看過[這些問題](http://stackoverflow.com/search?q=php+rpc)? –

+0

RPC?這是一個關於RPC的例子嗎? –

+1

RPC代表*遠程過程調用*,它似乎是你想要做的。這是一個通用協議(或概念)。變體是RMI(Java),XML-RPC,JSON-RPC ....有很多選擇。你甚至可以創建自己的。但這並不意味着這是你處境中最好的方式。 [也許REST會更好](http://stackoverflow.com/questions/1098473/rest-vs-rpc)。 –

回答

11

是。

我能想到的一個好方法是通過URL向第二臺服務器發送請求。在GET(或POST)參數中,指定您想要調用的方法,並且(爲了安全)某種隨時間變化的散列。在那裏確保沒有第三方可以在第二臺服務器上任意運行該功能。

要發送請求時,你可以使用捲曲:

function get_url($request_url) { 
    $ch = curl_init(); 
    curl_setopt($ch, CURLOPT_URL, $request_url); 
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, 10); 
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 
    $response = curl_exec($ch); 
    curl_close($ch); 

    return $response; 
} 

這發出一個GET請求。然後,您可以使用:

$request_url = 'http://second-server-address/listening_page.php?function=somefunction&securityhash=HASH'; 
$response = get_url($request_url); 

關於第二個服務器,建立了listening_page.php(與任何文件名,你喜歡,當然)來檢查GET請求,並驗證請求的完整性(即哈希,正確&有效的參數)。

+0

哇!這可以做到嗎?所以我可以直接進行任何函數()調用並獲取返回值,就像在相同的本地函數中一樣..? –

+0

是的。你需要'公開'你想要被調用的函數。 (即,服務器2獲得GET請求,然後*它*執行所請求的功能,然後將響應傳遞迴服務器1,所以服務器1不直接*調用遠程功能,但它具有類似的效果)。 – Alex

+0

我已經測試過,它的工作夥伴:D這麼簡單。它是這些的正確解決方案嗎?我的意思是,其他人都說要使用REST API,SOAP等。爲什麼請.. –

0

您可以通過使用API​​來實現。在第二臺服務器上創建一個頁面,該頁面接受變量並使用這些變量與服務器通信(取決於您需要的)。並且該頁面的標準回覆應該是JSON或XML。然後通過請求該文件並從第二臺服務器獲取答覆,從服務器1讀取該文件。

*注:如果一個私有文件,請確保您使用的身份驗證方法,以防止用戶訪問該文件

+0

所以你在談論一個REST API? –

+0

是的,但它取決於用戶,REST API是好的,但如果他更喜歡他可以使用純文本作爲回覆。 – ahoura

+0

好友對不起打斷你的談話感到遺憾。但是,因爲我是PHP新手,PHP可以直接接收JSON或XML結果嗎?我的意思是,JSON或AJAX結果返回到Javascript並通過HTML元素進行打印。 (據我所知,這一點很少。) –

0

你打算做的事絕對有可能。您將需要建立某種形式的API,以便服務器之一,使服務器2

的請求,我建議你在SOAP和REST的API閱讀起來

http://www.netmagazine.com/tutorials/make-your-own-soap-api

通常你會使用像CURL從服務器1聯繫服務器2.

谷歌捲曲,你應該很快得到想法。

它不會很容易給你一個完整的解決方案,所以我希望這個微調在正確的方向是有幫助的。

+0

感謝您關於使用SOAP和REST API的建議,但是Alex的方法很簡單,那麼你能解釋他的解決方案和SOAP/REST API之間有什麼不同嗎?謝謝:) –

+0

使用上面建議的http get是非常好的解決方案,但是構建API最終會導致r更好的功能性,安全性等。如果你只是查詢結果,那麼它的快速和簡單的使用get。例如,如果您想驗證用戶身份,發佈要插入數據庫的數據等,那麼公開獲得的數據可能並不理想。 – arkleyjoe