2010-12-05 146 views
0

我想測試我的PHP腳本,它創建了48個cURL多個句柄,每個句柄持有大約1500個請求,全部並行執行。我試圖確保所有請求都是實際發送的,爲此,我在服務器上記錄請求。這裏是我的dump.php,這是我做的請求,我的腳本,它會記錄到一個文件請求:快速記錄請求

<?php 
ob_start(); 
echo $_SERVER["REQUEST_URI"]; 
$dump = ob_get_clean(); 
$log = "dump.txt"; 
$fh = fopen($log, 'a') or die("can't open file"); 
fwrite($fh, $dump . "\r\n\r\n"); 
fclose($fh); 

echo "Dump Completed"; 
?> 

但是,我的四核PC能夠火的一個小問題以每10秒約1500的速度關閉這些請求,並且很可能會在嘗試同時打開文件時超載我的服務器。我在發送每個請求之間延遲了0.1秒,但是我的服務器仍然無法打開文件,轉儲文本並在下一個請求到達之前關閉它。結果,我的PHP文件說約有72k的請求被髮送,但是我的服務器說只有約14k被收到。這可能是由於我的PHP程序超載了我的PC或端口系統,並且一些請求從未成功發送,或者我的服務器速度不夠快,無法一秒處理150個請求。

任何可能的解決方案試圖安全地知道我的所有請求都已發送?當我的客戶使用腳本時,至少有99.5%的請求實際發送至關重要,而且他的服務器足夠強大,可以毫無問題地處理這些請求。出於安全原因,我無法在服務器上測試它,但我的功能不足以模擬工作條件。

+0

只是簡單的說明 - 將數據存儲到平面文件(尤其是如果它是單個平面文件)可能會給您在處理同時發生的請求時帶來麻煩。這是一個瓶頸。如果您需要將數據記錄到中央存儲中,可以查看使用數據庫(可以處理同時寫入)。你如何衡量實際頁面負載的數量? – 2010-12-06 00:58:30

回答

0

理想情況下,我會寫這些值到一個關鍵緩存,如memcached實例,然後最終到一個單線程腳本的數據庫/平面文件。這將使您能夠跟上請求的速度,並且還能夠將數據存儲到磁盤。

話雖如此,只是使用數據庫作爲快速解決方法將工作。

0

如果您需要複雜的請求信息,數據庫絕對是最好的選擇。

如果您關心的是count,我推薦使用Memcache原子加操作(http://php.net/manual/en)的Membase(http://www.membase.org/downloads)計數器/memcache.add.php)