您可以使用 DTW_CACHE_PAGE 內建函數來快取網頁。 Net.Data 找到巨集中的 DTW_CACHE_PAGE 函數時, 它會聯絡「快取管理程式」並開始將巨集的 HTML 輸出儲存在記憶體。 在 Net.Data 順利處理巨集之後,HTML 輸出會傳送至瀏覽器, 且「快取管理程式」會在一個異動中快取輸出, 如圖 28 所示。
![]() |
設定使用 Net.Data DTW_CACHE_PAGE() 內建函數, 將 Net.Data 產生的頁面寫入快取中。
只要 DTW_CACHE_PAGE() 函數確定快取記憶體沒有此頁面或已過期的話, 該函數就會快取函數陳述式後面的巨集的所有輸出。 若頁面不存在快取中,或比指定的經歷時間還舊, 則 Net.Data 會將輸出頁面傳回瀏覽器、從巨集執行產生新建輸出頁面、 以及在快取中儲存頁面。
若「快取管理程式」找到快取頁面,且頁面仍為現行, 則會顯示快取內容,且 Net.Data 會跳出巨集。 這個行為確定從快取中取回網頁之後, 不會再有任何不必要的處理程序。
效能要訣︰在巨集中將 DTW_CACHE_PAGE() 當成第一個陳述式或最前面幾個陳述式來放置,使執行巨集的成本降至最低。
若要快取頁面:
@DTW_CACHE_PAGE("cache_id", cached_page_id, "age", status)
使用此函數來設定 Net.Data 要快取此陳述式之後的巨集的所有 HTML 輸出。 若要快取全部 HTML 輸出,請在巨集前面放置本陳述式。
參數:
範例:
%HTML(cache_example) { %IF (customer == "Joe Smith") @DTW_CACHE_PAGE("mymacro.d2w", "http://www.mypage.org", "-1", status) %ENDIF ... <html> <head> <:title>This is the page title</title> </head> <body> <center> <h3>This is the Main Heading</h3> <p>It is $(time). Have a nice day! </body> </html> %}
DTW_CACHE_PAGE() 函數從巨集中它的位置起始快取記憶體。 通常在巨集開頭放置此函數以獲得較佳效能以及確定快取全部 HTML 輸出。
就進階的快取應用程式而言,在處理時需要決定在某一點快取而不是在巨集開頭存取的話, 您可以在 HTML 輸出區段放置 DTW_CACHE_PAGE() 函數。 例如,您可能需要根據從查詢或函數呼叫所傳回的列數來做決定。
範例:因為快取的決策是根據 HTML 輸出的預期大小而定, 所以將函數放在 HTML 區塊中。
% DEFINE { ...%} ... %FUNCTION(DTW_SQL) count_rows(){ 從客戶選取 count(*) %REPORT{ %ROW{ @DTW_ASSIGN(ALL_ROWS, V1) %} %} %} %FUNCTION(DTW_SQL) all_customers(){ select * from customer %} %HTML (OUTPUT) { <html> <head> <title>這是客戶列示 </head> <body> @count_rows() %IF ($(ALL_ROWS) > "100") @DTW_CACHE_PAGE("mymacro.d2w", "http://www.mypage.org", "-1", status) %ENDIF @all_customers() </body> </html> %}
在此範例中,頁面是基於 HTML 輸出的預期大小來快取或取回的。 只有在資料庫表格包含 100 列以上時,HTML 輸出頁面的快取才有價值。 Net.Data 在執行巨集之後都會將 OUTPUT 區塊中的本文 This is the customer list,傳送至瀏覽器; 本文從不快取。在函數呼叫 @count_rows() 後面的幾行, 會於 IF 區塊的條件滿足時快取或取回。 兩個部份合起來形成一個完整的 Net.Data 輸出頁面。