2011-07-08 109 views
1

我有一個php客戶端,它向服務器發送http請求。這是代碼:如何從php服務器讀取http獲取請求

客戶

<?php 

function xml_post($xml_request) 
{ 
    $url="http://localhost/malakies/server.php?xml=" . urlencode($xml_request); 
    $ch=curl_init(); 

    curl_setopt($ch,CURLOPT_URL,$url); 
    curl_setopt($ch,CURLOPT_RETURNTRANSFER,1); 
    $result=curl_exec($ch); 

    if (curl_errno($ch)){ 
    $ERR .= "cURL ERROR: ".curl_errno($ch).": ".curl_error($ch)."\n"; 
    } 

    return $result; 
} 

$result=xml_post("Send sth"); 
echo $result; ?> 

和服務器代碼:

<?php 
$postdata = $_GET['xml']; 
echo $postdata; ?> 

所有工作完美。但我有一個問題,它可能是一個菜鳥之一:) 我想在服務器端有一個偵聽器,當一個http請求已經來了,並與這個請求做了什麼。我不知道,如果HTTP請求,讓我這樣一個選擇的技術..我想折騰這樣的:

while(http request hasn't come yet) 
    just wait; 
do sth with the http request. 

預先感謝您。

+1

這是一個奇怪的要求。從某種意義上說,你的網絡服務器已經爲你做到了這一點。它在請求進入時觸發你的PHP腳本。這在某種程度上是不夠的嗎? –

+1

你有Apache做這個工作(監聽傳入的HTTP請求)。或者您想保持與長時間打開的客戶端的連接?這是什麼目的? – Gedrox

回答

1

對於每個單獨的請求,PHP腳本會自動運行。所以實際上PHP/Apache已經在做你所要求的。

如果你來自不同的編程語言(比如Java),那麼你通常會有一個事件循環等待新的連接,這可能會引起混淆。

另一方面,也許你有一個特定的情況在你的腦海裏。如果出現這種情況,請進一步解釋您的需求...

+0

好的解釋..像java一樣,你有一個事件函數,比如點擊一個元素被點擊時觸發的事件函數。以類似的方式,我想在php中這樣的功能,這將在http請求到來時觸發。假設客戶端和服務器是兩個網站。如果我刪除命令「echo $ result;」從我想要的客戶端代碼,當我打開「服務器」網站查看字符串「發送」。如果我在刷新客戶端時在瀏覽器(clent和server)中打開了兩個選項卡,我想在服務器端看到字符串「send sth」,而不是在客戶端中。 –

+0

那麼你描述的情況與我的答案相符。 PHP模塊分別爲每個請求運行請求的腳本。這意味着如果您運行兩次客戶端代碼,服務器代碼也將運行兩次(因爲您正在從客戶端請求兩次)。 如果您的服務器代碼想要存儲有關客戶端的信息(例如,您想要存儲客戶端發送的數據),則可以使用會話。會話通常通過存儲在客戶端(通常是瀏覽器)的cookie來標識,但由於您使用的是CURL,因此您可能需要使用cookiejar進行會話(http://php.net/manual/en/book.curl .php) – usoban

0

因爲您的url在server.php中「結束」,您需要在名爲「server.php」的服務器上放置一個文件。如果您的curl腳本返回404錯誤,您沒有將該文件放在正確的位置。您需要放置文件的位置取決於操作系統。在Linux上,這可能是/ var/www /。所以你需要找出你的「文檔根」是什麼。在那裏你會創建一個subdir malakies。在Linux例子中,這將是/var/www/malakies/server.php。 PHP將在請求進入時在您的文件中執行腳本。您傳遞的數據將被放置在名爲$ _GET的關聯數組中。我建議以下內容爲server.php:然後

<?php 
echo "Have a first line so you see something even when no data is passed\n"; 
var_dump($_GET['xml']); 
?> 

xml_post在你捲曲函數將返回(忽略顏色)

Have a first line so you see something even when no data is passed 
Send sth 

如果它不工作,有什麼錯誤代碼,您得到什麼?

我認爲你已經安裝了apache,並且你想用PHP來捕獲請求。

+0

我用套接字改變了我的技巧。我發現它們對我的實驗來說非常有用。我會檢查你的解決方案的HTTP請求! TY! –