2013-04-04 66 views
0

我們正在研究基於PROXY的保護軟件。它捕獲用戶的http請求,做代理的東西,並捕獲http響應,修改其內容並將其發送回原始用戶。即時修改HTML內容=> SLOW

我們有2次嘗試:

  1. Squid代理和PHP皮了魷魚。 這是有前途的,但在PHP流我們不知道我們預計的響應數據的長度,所以它每次都是時間=> SLOW

  2. 現在,我們寫了一個.net應用程序。它做我們需要的一切,甚至不會修改內容。如果我們需要GZIP/GUNZIP,或只是修改內容,它會變得非常緩慢。

你能幫助我們嗎?

我們正在匈牙利的大學爲這個項目工作近一年。我們編寫了一個自動,自學的完整語義分析器引擎,可以分析和解釋所有語言,並可以檢測和篩選目標內容。我們還構建了一個圖像識別軟件,它可以在所有圖像中以90%的置信度檢測目標物體。

所以一切都準備好了,但是我們的代理應用程序被阻塞了。

如果有人寫的話,我們也可以爲這份工作付錢。

回答

0

我花了很多時間用PHP進行編程 - 是的,作爲一種解釋型語言,它可能很慢 - 而且有大量可用的錯誤代碼 - 但是即使在開始觸摸代碼之前,調整環境可以將執行時間縮短5-10倍。然後改變代碼可以使它更快地運行;最大的收穫來自架構和數據結構的良好選擇(這對任何語言都是如此 - 不僅僅是PHP)。

我不知道你從哪裏開始,但是發現你無法處理該流相對於生成內容並通過網絡發送它所花費的時間量。因爲它是超時的東西是非常錯誤的。 (你是不是想用解析XML的解析器解析HTML?)。內容的長度對腳本的性能幾乎沒有影響,除非您嘗試將它全部映射到PHP的地址空間中。但是,AFAIK不可能使用PHP直接在Squid中實現一個內容過濾器(如果你這樣做,我很想知道你是如何做到的,如果你已經實現了ICAP,那也是非常有趣的)。我猜你正在使用URL重定向器通過用PHP編寫的代理腳本來路由請求。

可以在C/C++中編寫ECAP模塊。

圖像識別和自然語言處理在編程中不是小事,所以你必須有一些優秀的程序員在你的團隊中工作。真正解決你的問題已經超出了堆棧溢出回答的範圍,並且向承包商兜售絕對不是主題。

+0

感謝您的回覆,但是: – 2013-04-05 10:34:45

+0

請在上方/下方閱讀我的評論。 – 2013-04-05 10:42:30

+0

symcbean您是否使用ECAP完成了這項工作?如果是,你是如何解壓gzip塊的? – sam 2015-11-11 07:27:09

0

感謝您的回覆!

首先:我們的PHP速度很快,fsockopen速度很慢,因爲它無法知道何時關閉來自SQUID的響應連接。

這裏是我們的代碼:

$buffer = socket_read($client, 4096); 
    if (!($handle = fsockopen(HOST, SQUIDPROXYPORT, $errno, $error, 1))) { 
     Log::write($this->log, 'Errno: ' . $errno . ' Error: ' . $error . "\n" . $buffer); 
     exit('Nem sikerült csatlakozni! ' . $errno . ':' . $error); 
    } 
    stream_set_timeout($handle, 0, 100000); 

    fwrite($handle, $buffer); 

    $result = ''; 
    do { 
     $tmp = fgets($handle, 1024); 
     if ($tmp) { 
      $result .= $tmp; 
     } 
    } while (!feof($handle) && $tmp != false); 

    socket_write($client, $result, strlen($result)); 

    fclose($handle); 
    socket_close($client); 

再次,它是如何工作的:

  1. 客戶端發送HTTP請求給我們
  2. 我們的PHP獲得請求,併發送其頭Squid代理
  3. 魷魚做了它的東西,並將響應數據發回我們的PHP
  4. 我們的PHP獲得了fsockopen從魷魚
  5. 響應數據,我們分析響應數據,或修改
  6. 我們發回給客戶

但是: 雖然我們正在等待響應的數據,我們接受它,但我們不能知道什麼時候關閉我們的PHP和SQUID之間的連接。這導致工作緩慢,幾乎每次都會超時。

如果您有任何想法,請與我們分享!

+0

我已經整理了格式 - 但實際上它應該已被添加並標記爲對問題的更新。 – symcbean 2013-04-05 15:08:14

+0

我懷疑你的問題很大一部分是你的架構 - 你爲每個初始者緩衝每個請求兩次,並將響應作爲數據報而不是流(儘管這可能很難改變)。如果你的問題不知道你什麼時候從squid獲得響應,那麼你不會簡單地將HTTP請求轉發給代理,而是創建一個curl請求,它應該快得多。但是,根據服務的使用方式(例如URL重定向器/ Squid內容重寫),解決問題的方法更爲有效。 – symcbean 2013-04-05 15:22:16