2014-01-20 41 views
0

在應用程序有以下提到的PHP形式:PHP:2MB的JSON對象與頻繁的AJAX調用?

<html> 
<body> 
    <br/> 
    <br><section style="min-width: 500px; margin: 1px auto;"> 
    <form align="centre" name="showq" id="showq" method="post" action=demo.php> 
     <fieldset><legend> Demo</legend> 
     <table> 
      <tr><td id="one" colspan="2"><div>ABCD</div></td></tr> 
      <tr><td id="two" colspan="2"><div>EFGH</div></td></tr> 
      <tr><td></td><td><input type="submit" name="pre" id="pre" value="pre" ></input>&nbsp; 
     <input type="submit" name="nxt" id="nxt" value="nxt"></input>&nbsp; 
     <input type="submit" name="getvalfromserver" id="getvalfromserver" value="GETVALFRMSERVER"></input></td><td></td></tr> 
     </table> 
    </form></fieldset></section> 
</body> 
</html> 

目前關於「前」或「NXT」或每次點擊「getvalfromserver」它提交PHP的形式,並刷新整個頁面和填充值<TD>與ID「一」和「二」 數據存儲在服務器作爲二維數組PHP

Ex: 
Array { 
    ABCD, EFGH - *First array element* 
    IJKL, MNOP 
    QRST, UVWX 
    and so on... 
} 

我想避免這種刷新頁面;閱讀其他帖子後在stackoverflow;我想到了兩個選項:

  1. 方案一 - 在客戶端傳遞PHP數組作爲JSON
  2. 方案二 - 保持在服務器上的PHP數組和按鈕點擊發送AJAX請求到服務器接收所需的值。

在我的情況下PHP數組的大小可以達到2 MB的數據。用戶同時並且非常頻繁地點擊「nxt」「pre」導航。

除了上面提到的兩個之外,還有第三種選擇嗎? 如果不是,您能否提出建議;兩種選擇中的一種;哪一個更適合從性能角度?

+0

「能否請您提出建議;有兩種選擇,哪種更適合從性能角度來看」 - 這對我來說聽起來太主觀了。 –

+0

2MB並不多。 jQuery是50倍大。一次發送。 –

+0

你能一次看到頁面上的所有數據嗎? – tymeJV

回答

1

根據哪個應用程序正在使用的服務器,你可以很容易地把對JSON gzip壓縮和向下縮小尺寸的東西像600 KB(我假定這是所有文本)

我們已經在這樣做了apache和性能在我們的一頁上顯着提高,不刷新ExtJS應用程序

1)您將首先json_encode 2維數組。

2)然後使用mod_deflate模塊模塊 http://httpd.apache.org/docs/2.2/mod/mod_deflate.html

<IfModule mod_deflate.c> 
     AddOutputFilterByType DEFLATE text/html text/plain text/xml text/css text/javascript application/x-javascript application/javascript application/xml application/xhtml+xml application/json 

3)在胖客戶端啓用Apache服務器的壓縮,可以使用JSON.parse()來或類似的功能解析輸出數據

+0

我們使用LAMP堆棧與Apache網絡服務器。因此,根據您過去的經驗,我們可以在web服務器上gzip 2維數組,然後將其作爲JSON對象傳遞給客戶端?然後解壓到客戶端並在應用程序中使用。你有沒有任何有用的docuemnt指針來指導? –

+0

編輯我的回覆,讓我知道它是否有效 –

+0

您也可以在PHP中使用GZIP文本,而不需要在服務器中加載任何模塊。請參閱:http://ca1.php.net/manual/en/zlib.examples.php – Qualcuno

1

這聽起來像你真正需要做的是創建一個分頁數據的方式。特別是因爲你似乎一次只需要幾個數據點。因此,讓我們說你的陣列看起來像這樣:

Array(
    [0] => Array ('ABCD', 'EFGH'), 
    [1] => Array ('IJKL', 'MNOP'), 
    ... 
    [n] => Array ('foo', 'bar') 
) 

你已經很好地設置分頁。您可以輕鬆地做決定的頁數:

$array_size = count($array); 

也可以逐個檢索值的任何給定的陣列可以直接去它的指數。假設我想要這個數據集的第100頁(如果我按了nxt按鈕99次就會發生。您可以輕鬆地得到這個如下:

// here we assume this page value would be posted by AJAX as parameter 'page' 
// note: GET may also be suitable as method here 
// note: you would also probably need to validate this is an integer like value that is passed 
$page_index = $_POST['page'] - 1; 
// get array at this index value 
$page_to_return = $array[$page_index]; 
// encode to JSON to return to calling script 
echo json_encode($page_to_return); 

這意味着在JavaScript中,你只需要知道你的頁面上,這樣請求一個或下一個頁面時,你可以遞減/遞增該值的價值,將它傳遞給PHP腳本,並獲取該索引處的「頁面」以更新到UI中。

這使您只能在任何給定的頁面請求中傳遞數組中的一小部分。如果你喜歡,你甚至可以在JavaScript中緩存這些值,這樣一個用戶前後翻轉同一個「頁面」就不需要額外的服務器調用。或者根據您的用戶行爲,您甚至可以在第一頁加載時在JavaScript中預加載您的第一個X頁數,然後根據需要請求其他頁面。