2015-05-19 93 views
1

我寫了一個PHP腳本,使用curl使得HTTP POST請求,並執行以下操作,大卷曲響應處理 - PHP

  • 準備後變量
  • 初始化捲曲
  • 設置客戶端的cookie的使用請
  • 設置POST變量作爲查詢字符串
  • 設置其他捲曲選項
  • 執行卷曲

下面是代碼:

$ch = curl_init ($url); 

    curl_setopt ($ch, CURLOPT_COOKIE, "cookie=cookie"); 
    curl_setopt ($ch, CURLOPT_POST, 1); 
    curl_setopt ($ch, CURLOPT_POSTFIELDS, $post_string); 
    curl_setopt ($ch, CURLOPT_FOLLOWLOCATION, 1); 
    curl_setopt ($ch, CURLOPT_HEADER, 0); 
    curl_setopt ($ch, CURLOPT_RETURNTRANSFER, 1); 

    $response = curl_exec($ch); 
    // this point 
    extr ($response, $param_1, $param_2); 

問題是,有時響應是大於1GB,所以PHP代碼暫停,直到被接收完整的響應(在代碼// this point示出),並且如果有錯誤的HTML接收,所以PHP產生錯誤,這裏所有的事情都需要從頭開始。

這裏是功能其餘:

function extr($string = '',$a,$b) 
{ 
    $doc = new DOMDocument; 
    @$doc -> loadHTML($string); 
    $table = $doc -> getElementById('myTableId'); 

    if(is_object($table)): 
    foreach ($table->getElementsByTagName('tr') as $record) 
    { 
     $rec = array(); 
     foreach ($record->getElementsByTagName('td') as $data) 
     { 
      $rec[] = $data -> nodeValue; 
     } 
     if ($rec) 
     { 
      put_data($rec); 
     } 
    } 
    else: 
    { 
     echo 'Skipped: Param1:'.$a.'-- Param2: '.$b.'<br>'; 
    } 
    endif; 
} 

function put_data($one = array()) 
{ 
    $one = json_encode($one) . "\n"; 
    file_put_contents("data.json", $one, FILE_APPEND); 
} 

ini_set('max_execution_time', 3000000); 
ini_set('memory_limit', '-1'); 

我能想到的另一種方法是處理數據,因爲它接收,如果可能的話,使用捲曲,或繼續從先前的狀態前面的捲曲請求。

有沒有可能的解決方法呢?

我需要切換到PHP以外的任何其他語言嗎?

curl_setopt($ch, CURLOPT_WRITEFUNCTION, function(&$ch, $data) { 
    echo "\n\nchunk received:\n", $data; // process your chunk here 
    return strlen($data); // returning non-positive number aborts further transfer 
}); 

正如在評論中已經提到不過,如果您的響應內容類型是,你加載到HTML:

+1

你可以使用字節服務,並要求只有小塊整個文件,但是因爲您然後將這些塊加載到DOM中,所以無論如何您都需要整個文件。如果您輸入不完整的文檔,dom會禁止。 –

+0

您要求什麼,可能會超過1GB的大小? (當然,HTTP是正確的協議呢?) – CBroe

+0

我正在尋找Web服務中的安全漏洞,並找到一個,通過HTTP POST泄漏分析數據,我只需要在MySQL表中收集它們 – Viral

回答

3

可以,因爲他們來使用CURLOPT_WRITEFUNCTION選項有一個回調過程,塊數據DOMDocument,無論如何你首先需要完整的數據。

1

你可以做兩件事:

a)使用SAX解析器。 Sax解析器就像一個DOM解析器,但它可以處理流式輸入,其中DOM解析器必須具有整個文檔,否則會引發錯誤。 Sax解析器只會爲您提供事件來處理。

What is the difference between SAX and DOM?

b)使用SAX解析器的時候,它傳遞數據逐步使用CURLOPT_WRITEFUNCTION ..只是看到lafor還張貼這一點,所以upvoting是