ただし、使用しているデータベースが Web サーバーとは異なるコンピューター上にある場合は、データベースの結果セットをキャッシュすることをお勧めします。ただし、状況に応じて最適なキャッシュ戦略を決定するのは難しい場合があります。たとえば、最新のデータベース結果セットを使用することが重要なアプリケーションの場合、時間トリガーのキャッシュ手法 (有効期限のタイムスタンプに達するたびにキャッシュが再生成されることを前提とするキャッシュ システムで一般的に使用されます) は満足のいく解決策ではない可能性があります。 。この場合、アプリケーションがキャッシュに必要なデータベース データが変更されるたびにアプリケーションに通知し、キャッシュされた期限切れデータとデータベースの一貫性をアプリケーションが保つようにするメカニズムが必要です。この場合、「データベース変更通知」(Oracle Database 10g Release 2の新機能)を使用すると非常に便利です。
データベース変更通知の概要
データベース変更通知機能の使用法は非常に簡単です。通知に対して実行する通知ハンドラ (PL/SQL ストアド プロシージャまたはクライアント OCI コールバック関数) を作成します。 。次に、変更通知を受け取りたいデータベース オブジェクトに対するクエリを登録します。これにより、トランザクションがその中のオブジェクトを変更してコミットするたびに通知ハンドラーが呼び出されます。通常、通知ハンドラーは、クライアント アプリケーションが応答で適切なアクションを実行できるように、変更されたテーブルの名前、行われた変更の種類、およびオプションで変更された行の行 ID をクライアント リスナーに送信します。
データベース変更通知機能がどのように動作するかを理解するために、次の例を考えてみましょう。 PHP アプリケーションが OE.ORDERS テーブルに格納されている注文と OE.ORDER_ITEMS に格納されている品目を注文するとします。発注された注文に関する情報がほとんど変更されないことを考慮すると、アプリケーションで ORDERS テーブルと ORDER_ITEMS テーブルの両方に対するクエリの結果セットをキャッシュすることができます。古いデータへのアクセスを回避するには、データベース変更通知を使用します。これにより、上記の 2 つのテーブルに格納されているデータの変更をアプリケーションに簡単に通知できます。
ORDERS テーブルと ORDER_ITEMS テーブルのクエリを登録する前に、通知を受信して、行われた DML または DDL 変更に応答するには、まず CHANGE NOTIFICATION システム権限と EXECUTE ON DBMS_CHANGENOTIFICATION 権限を OE ユーザーに付与する必要があります。これら 2 つのテーブル。これを行うには、SQL*Plus などの SQL コマンド ライン ツールから次のコマンドを実行します。
CONNECT / AS SYSDBA;
GRANT CHANGE NOTIFICATION TO oe;
GRANT EXECUTE ON DBMS_CHANGE_NOTIFICATION TO oe; PL/SQL 通知を受け取るための命令。または、次の ALTER SYSTEM コマンドを使用することもできます:
ALTER SYSTEM SET "job_queue_processes"=2; その後、OE/OE として接続した後、通知ハンドラーを作成できます。ただし、その前に、通知ハンドラーによって使用されるデータベース オブジェクトを作成する必要があります。たとえば、通知ハンドラーがレジストリの変更を記録するデータベース テーブルを 1 つ以上作成することができます。次の例では、変更が発生した日時、変更されたテーブルの名前、および通知ハンドラーがクライアントに通知メッセージを正常に送信したかどうかを示すメッセージを記録する nfresults テーブルを作成します。
CONNECT oe/oe;
CREATE TABLE nfresults (
operdate DATE,
tblname VARCHAR2(60),
rslt_msg VARCHAR2(100)
);実際には、通知イベントや変更された行の行 ID などの情報を記録するためにさらにテーブルを作成する必要がある場合がありますが、この記事の目的では、nfresults テーブルで十分です。
UTL_HTTP を使用してクライアントに通知を送信します
より保守しやすく柔軟なソリューションを実現するために、1 つ以上の PL/SQL ストアド プロシージャを作成し、通知ハンドラからこれらのストアド プロシージャを呼び出すこともできます。たとえば、クライアントへの通知メッセージを実装するストアド プロシージャを作成するとします。 「リスト 1」は、PL/SQL プロシージャ sendNotification です。このプロセスでは、UTL_HTTPPL パッケージを使用して、クライアント アプリケーションに変更通知を送信します。
リスト 1. UTL_HTTP を使用してクライアントに通知を送信します
コードをコピーします コードは次のとおりです。
CREATE OR REPLACE PROCEDURE sendNotification(url IN VARCHAR2,tblname IN VARCHAR2, order_id IN VARCHAR2) IS
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP; 100);
tbl VARCHAR(60);
BEGIN
tbl:=SUBSTR(tblname, INSTR(tblname, '.', 1, 1) 1, 60); req := UTL_HTTP.BEGIN_REQUEST(url||order_id||'&'||'table='||tbl);
resp := UTL_HTTP.GET_RESPONSE(req);
INSERT INTO nfresults(SYSDATE, tblname、resp.reason_phrase ; 🎜>END
/
「リスト 1」に示すように、sendNotification は、UTL_HTTP.BEGIN_REQUEST 関数によって発行された HTTP リクエストの形式でクライアントに通知メッセージを送信します。この URL には、ORDERS テーブル内の変更された行の order_id が含まれています。次に、UTL_HTTP.GET_RESPONSE を使用して、クライアントから送信された応答情報を取得します。実際、sendNotification はクライアントから返された応答全体を処理する必要はなく、RESP レコードのreason_phrase フィールドに格納されている短いメッセージ (ステータス コードを説明する) を取得するだけです。
通知ハンドラーの作成
これで、上記の sendNotification プロシージャを使用してクライアントに変更通知を送信する通知ハンドラーを作成できます。リスト 2 の PL/SQL プロシージャ order_nf_callback を見てみましょう。
リスト 2. OE.ORDERS テーブルへの変更の通知を処理する通知ハンドラー
コードをコピー コードは次のとおりです。 :
orders_nf_callback (ntfnds IN SYS.CHNF$_DESC) の作成または置換
tblname VARCHAR2(60);
numtables NUMBER; VARCHAR2 (20);
numrows NUMBER;
url VARCHAR2(256) := 'http://webserverhost/phpcache/dropResults.php?order_no='; BEGIN
event_type := ntfnds.event_type;
numtables := ntfnds.numtables;
IF (event_type = DBMS_CHANGE_NOTIFICATION.EVENT_OBJCHANGE) THEN
FOR i IN 1..numtables LOOP
tblname := ntfnds .table_desc_array(i).table_name;
IF (bitand(ntfnds.table_desc_array(i).opflags,
DBMS_CHANGE_NOTIFICATION.ALL_ROWS) = 0) THEN
numrows := ntfnds.table_desc_array(i).numrows ;
ELSE
numrows :=0;
IF (tblname = 'OE.ORDERS') THEN
FOR j IN 1..numrows LOOP
row_id := ntfnds .table_desc_array(i).row_desc_array(j).row_id;
SELECT order_id INTO ord_id FROM 注文 WHERE rowid = row_id;
END LOOP; IF ;
END LOOP;
END IF;
END;
ハンドル プログラムは SYS.CHNF$_DESC オブジェクトをパラメータとして受け取り、そのプロパティを使用して変更の詳細を取得します。この例では、この通知ハンドラーは、登録されたオブジェクトに対する DML または DDL の変更に応じてデータベースによってポストされた通知のみを処理し (つまり、通知タイプが EVENT_OBJCHANGE の場合のみ)、インスタンスの起動やインスタンスなどの他のデータベース イベントに関する情報は無視します。シャットダウン)通知。上記のバージョン以降、ハンドラーは、OE.ORDERS テーブル内の影響を受ける各行に対して発行された変更通知を処理できるようになりました。この記事の後半の「既存の登録へのテーブルの追加」セクションで、ハンドラーに数行のコードを追加して、OE.ORDER_ITEMS テーブル内の変更された行の通知を処理できるようにします。
変更通知の登録を作成する
通知ハンドラーを作成したら、それに対するクエリ登録を作成する必要があります。この例では、登録プロセス中に OE.ORDER テーブルに対してクエリを実行し、orders_nf_callback を通知ハンドラーとして指定する必要があります。通知メッセージで ROWID レベルの粒度を有効にするには、 DBMS_CHANGE_NOTIFICATION パッケージの QOS_ROWIDS オプションを指定する必要もあります。 「リスト 3」は、orders_nf_callback 通知ハンドラのクエリ登録を作成する PL/SQL ブロックです。
リスト 3. 通知ハンドラーのクエリ登録を作成する
コードをコピー
コードは次のとおりです。
DECLARE
REGDS SYS.CHNF$_REG_INFO;
regid NUMBER; qosflags NUMBER; REGDS := SYS.CHNF$_REG_INFO; ', qosflags, 0,0,0); regid := DBMS_CHANGE_NOTIFICATION.NEW_REG_START (REGDS); SELECT order_id INTO ord_id FROM order WHERE ROWNUM
END;/
この例では、ORDERS テーブルの登録を作成し、orders_nf_callback を通知ハンドラーとして使用します。ここで、DML または DDL ステートメントを使用して ORDERS テーブルを変更し、トランザクションをコミットすると、orders_nf_callback 関数が自動的に呼び出されます。たとえば、ORDERS テーブルに対して次の UPDATE ステートメントを実行し、トランザクションをコミットします。
UPDATE ORDERS SET order_mode = 'direct' WHERE order_id=2421;
UPDATE ORDERS SET order_mode = 'direct' WHERE order_id=2422 ;
COMMIT;
上記のトランザクションに応じてデータベースが通知を送信したことを確認するには、次のように nfresults テーブルを確認します。 mon-yy hh:mi: ss') operdate,
tblname, rslt_msg FROM nfresults;
結果は次のようになります:
OPERDATE TBLNAME RSLT_MSG
------ ------- ------ ----------- ---------
02-mar-06 04:31:28 OE.ORDERS ではありませんFound
02-mar -06 04:31:29 OE.ORDERS Not Found
上記の結果から、orders_nf_callback は正常に動作していることが明らかですが、クライアント スクリプトが見つかりませんでした。この例では、URL で指定された DropResults.php スクリプトを作成していないため、これは予期せぬことではありません。
既存の登録へのテーブルの追加
前のセクションでは、変更通知サービスを使用して、登録オブジェクト (上の例では ORDERS テーブル) が変更されたときにデータベースに通知させる方法を示しました。ただし、パフォーマンスの観点から、クライアント アプリケーションは、ORDERS テーブル自体ではなく、ORDER_ITEMS テーブルのクエリ結果セットをキャッシュすることを好む場合があります。これは、注文にアクセスするたびに ORDERS テーブルから 1 行だけを取得する必要があるためです。同時に複数の行を ORDER_ITEMS テーブルから取得する必要があります。実際には、注文には数十、場合によっては数百の項目が含まれる場合があります。
ORDERS テーブルのクエリはすでに登録されているため、ORDER_ITEMS テーブルのクエリを登録するために別の登録を作成する必要はありません。代わりに、既存の登録を使用できます。これを行うには、まず既存の登録の ID を取得する必要があります。これを実現するには、次のクエリを実行できます:
SELECT regid, table_name FROM user_change_notification_regs; 結果は次のようになります:
REGID TABLE_NAME
----- ---- -- --------
241 OE.ORDERS
登録 ID を取得した後、次に示すように DBMS_CHANGE_NOTIFICATION.ENABLE_REG 関数を使用して登録に新しいオブジェクトを追加できます。
コードをコピー コードは次のとおりです。
DECLAREord_id NUMBER
BEGIN
DBMS_CHANGE_NOTIFICATION.ENABLE_REG( 241);
SELECT order_id INTO ord_id FROM order_items
DBMS_CHANGE_NOTIFICATION.REG_END;
完了しました。今後、データベースは、ORDERS および ORDER_ITEMS に対する変更に応じて通知を生成し、orders_nf_callback プロシージャを呼び出して通知を処理します。したがって、次の手順では、ORDER_ITEMS テーブルの DML 操作によって生成された通知を処理できるように、orders_nf_callback を編集します。ただし、orders_nf_callback プロシージャを再作成する前に、更新プロセス中に参照される次のテーブル タイプを作成する必要があります。
CREATE TYPE rdesc_tab AS TABLE OF SYS.CHNF$_RDESC; 次に、リストに戻ります。 、次のコード行の後に:
コードをコピー
コードは次のとおりです: IF (tblname = 'OE. ORDERS') THEN FOR j IN 1..numrows LOOP
row_id := ntfnds.table_desc_array(i).row_desc_array(j).row_id;SELECT order_id INTO ord_id FROM 注文 WHERE rowid = row_id; 🎜>sendNotification(url, tblname, ord_id) ;
END LOOP;
次のコードを挿入します:
code
コードは次のとおりです。
IF (tblname = 'OE.ORDER_ITEMS') THEN FOR rec IN (SELECT DISTINCT(o.order_id) o_id FROM TABLE(CAST(ntfnds.table_desc_array(i).row_desc_array AS rdesc_tab)) t, orders o, order_items d WHERE t.row_id = d.rowid AND d.order_id=o.order_id)
LOOPsendNotification(url、tblname、rec.o_id);
END LOOP
orders_nf_callback を再作成した後、正しく動作するかどうかをテストする必要があります。これを行うには、ORDER_ITEMS テーブルに対して次の UPDATE ステートメントを実行し、トランザクションをコミットします。
UPDATE ORDER_ITEMS SETquantity = 160 WHERE order_id=2421 AND line_item_id=1; WHERE order_id= 2421 AND line_item_id=2;
COMMIT;
次に、次のように nfresults テーブルを確認します。 operdate,
rslt_msg FROM nfresults WHERE tblname = 'OE.ORDER_ITEMS'; 出力は次のようになります:
OPERDATE RSLT_MSG
-------------- - --------------
03-mar-06 12:32:27 Not Found
結局のところ、なぜ 1 行だけが nfresults テーブルに挿入されたのか疑問に思われるかもしれません。 、ORDER_ITEMS テーブル内の 2 つの行を更新しました。実際、更新された 2 つの行は同じ order_id を持っています。つまり、同じ注文に属しています。ここでは、クライアント アプリケーションが 1 つのステートメントを使用して注文のすべての明細を選択すると想定しているため、注文のどの明細が変更されたかを正確に知る必要はありません。代わりに、クライアントは、少なくとも 1 つの明細項目が変更、削除、または挿入された注文 ID を知る必要があります。
クライアントの構築
ORDERS テーブルと ORDER_ITEMS テーブルの登録を作成したので、これらのテーブルに格納されている注文とその品目にアクセスするクライアント アプリケーションによって変更通知がどのように使用されるかを見てみましょう。これを行うには、上記のテーブルに対するクエリの結果をキャッシュし、これらのテーブルへの変更に関する通知 (データベース サーバーから受信する) に応じて適切なアクションを実行する PHP アプリケーションを構築できます。簡単な方法は、キャッシュ データを最新の状態に保つための信頼できるメカニズムを提供する PEAR::Cache_Lite パッケージを使用することです。特に、Cache_Lite_Function クラス (PEAR::Cache_Lite パッケージの一部) を使用すると、関数呼び出しをキャッシュできます。
たとえば、データベース接続を確立し、データベースに対して選択ステートメントを実行し、検索結果を取得し、最後に結果を配列として返すというタスクを実行する関数を作成できます。その後、Cache_Lite_Function インスタンスの call メソッドを通じて関数から返された結果配列をキャッシュし、バックエンド データベースではなくローカル キャッシュから読み取れるようにすることで、アプリケーションのパフォーマンスを大幅に向上させることができます。その後、キャッシュされたデータへの変更が通知されたら、Cache_Lite_Function インスタンスのdrop メソッドを使用して、期限切れのデータをキャッシュから削除します。
この記事の例を振り返ると、アプリケーションがデータベースと対話するために 2 つの関数を作成するとよいでしょう。最初の関数は ORDERS テーブルにクエリを実行し、指定された ID を持つ注文を返します。もう 1 つの関数は、 ORDER_ITEMS テーブルをクエリして、その注文の品目を返します。リスト 4 は、getOrderFields 関数を含む getOrderFields.php スクリプトを示しています。この関数は注文 ID を受け取り、取得した注文のフィールドの一部を含む連想配列を返します。
リスト 4. 指定された順序のフィールドを取得します
コードをコピーします
コードは次のとおりです: < ;?php
//File:getOrderFields.phprequire_once 'connect.php';
function getOrderFields($order_no) {
if (!$rsConnection = GetConnection( )){
return false;
}
$strSQL = "SELECT TO_CHAR(ORDER_DATE) ORDER_DATE、CUSTOMER_ID、
ORDER_TOTAL FROM ORDERS WHERE order_id =:order_no"; $rsConnection,$strSQL) ;
oci_bind_by_name($rsStatement, ":order_no", $order_no, 12);
if (!oci_execute($rsStatement)) {
$err = oci_error(); 🎜>print $err[ 'message'];
trigger_error('Query failed:' . $err['message']);
return false;
$results = oci_fetch_assoc($) rsStatement);
return $results;
}
?>
「リスト 5」は getOrderItems.php スクリプトです。スクリプトには getOrderItems 関数が含まれており、この関数は注文 ID を受け取り、注文の品目を表す行を含む 2 次元配列を返します。
リスト 5. 指定された順序の品目を取得します
コードをコピーします
コードは次のとおりです。
//File:getOrderItems.php require_once 'connect.php'; function getOrderItems($order_no) {
if (!$rsConnection = GetConnection ()){return false;
}
$strSQL = "SELECT * FROM ORDER_ITEMS WHERE
order_id =:order_no ORDER BY line_item_id"; strSQL);
oci_bind_by_name($rsStatement, ":order_no", $order_no, 12);
if (!oci_execute($rsStatement)) {
$err = oci_error(); 'クエリが失敗しました:' . $err['message']);
return false;
$nrows = oci_fetch_all($rsStatement, $results);結果);
}
?>
上記の 2 つの関数には connect.php スクリプトが必要であることに注意してください。このスクリプトには、データベース接続を返す GetConnection 関数が含まれている必要があります。リスト 6 は connect.php スクリプトです。
リスト 6. データベース接続の取得
コードをコピー コードは次のとおりです。
//File:connect.php
function GetConnection() {
$dbHost = "dbserverhost"
$dbHostPort="1521"; ;
$dbServiceName = "orclR2";
$pswd = "oe";
$dbConnStr = "(説明=(プロトコル=TCP) HOST=". $dbHost.")
(PORT=".$dbHostPort."))(CONNECT_DATA=(SERVICE_NAME=".$dbServiceName.")))";
if(!$dbConn = oci_connect ($usr, $pswd,$dbConnStr)) {
$err = oci_error();
trigger_error('接続に失敗しました ' .$err['message']);
return false; >}
return $dbConn;
}
?>
データベースとの通信に必要な関数をすべて作成したので、次はその方法を見てみましょう。 Cache_Lite_Function クラスが機能します。リスト 7 は、Cache_Lite_Function クラスを使用して上記の関数の結果をキャッシュする testCache.php スクリプトです。
リスト 7. PEAR::Cache_Lite を使用したキャッシュ
コードのコピー コードは次のとおりです。
//File:testCache.phprequire_once 'getOrderItems.php';
require_once 'getOrderFields.php';
require_once 'キャッシュ/ライト/関数。 php';
$options = array(
'cacheDir' => '/tmp/',
'lifeTime' => 86400
); _GET['order_no' ])) {
die('order_no パラメータは必要です');
$order_no=$_GET['order_no'];
$cache = new Cache_Lite_Function( $options);
if ($orderfields = $cache->call('getOrderFields', $order_no)){
print "
ORDER #$order_no
n"; >print "DATE: | ".$orderfields['ORDER_DATE']." | gt;" ;
CUST_ID: | gt;".$orderfields['CUSTOMER_ID']." | gt;
TOTAL: | ".$orderfields['ORDER_TOTAL']." |
} else {
print "注文フィールドの取得中に問題が発生しました!n";
$cache->drop('getOrderFields', $order_no );
}
if (list($nrows, $orderitems) = $cache->call('getOrderItems', $order_no)){
//print "
LINE ITEMS IN ORDER #$order_no";
print "
$key | n";"; /td>"; print " |
".$orderitems['LINE_ITEM_ID'][$i]." | ";".$orderitems[ 'PRODUCT_ID'][ $i]." | ";".$orderitems['UNIT_PRICE'][$i]." | "; >print "".$orderitems['QUANTITY'][$i]."";
---|
} else {
print "注文品目の取得中に問題が発生しました";
$cache->drop('getOrderItems', $order_no);
}
?>
「リスト 7」の testCache.php スクリプトは、order_no URL パラメーター (OE.ORDER テーブルに格納されている注文 ID を表す) を使用して呼び出す必要があります。たとえば、ID 2408 の注文に関連する情報を取得するには、ブラウザに次の URL を入力する必要があります:
http://webserverhost/phpcache/testCache.php?order_no=2408 結果、参照機器は次の出力を生成します:
Order #2408
Date: 29-JUN-99 06.59.31.333617 AM
Cust_id: 166
Total: 309
Order_id line_id propuct_id_id IT_price Quantity
2408 1 2751 61 3
2408 2 2761 26 1
2408 3 2783 10 10
ここで、ブラウザの再読み込みボタンをクリックしても、testCache.php スクリプトは読み込まれません。もう一度 getOrderFields 関数と getOrderItems 関数を呼び出します。代わりに、ローカル キャッシュから結果を読み取ります。したがって、order_no=2108 を指定したすべての getOrderFields または getOrderItems 呼び出しは、今から 24 時間以内にローカル キャッシュによって満たされます (lifeTime が 86400 秒に設定されているため)。ただし、Cache_Lite_Function クラスは、指定されたパラメーターを使用して指定された関数でキャッシュが使用できるかどうかをテストする API を提供しないことに注意してください。したがって、アプリケーションが実際にキャッシュを読み取るのか、それとも同じパラメーターで呼び出されるたびに関数を実行するのかを判断するのは少し難しい場合があります。たとえば、上記の例では、キャッシュ メカニズムが正しく動作することを確認するために、connect.php スクリプトで指定された接続情報を一時的に変更して、データベース接続を確立できないようにすることができます。たとえば、間違ったデータベース サーバーのホスト名を指定します。 2108 testCache.php スクリプトを実行します。キャッシュが適切に機能している場合、ブラウザの出力は以前と同じになるはずです。
さらに、cacheDir オプション (この例では /tmp) の値として Cache_Lite_Function クラスのコンストラクターに渡されるキャッシュ ディレクトリを確認することもできます。そのディレクトリには、cache_7b181b55b55aee36ad5e7bd9d5a091ec_3ad04d3024f4cd54296f75c92a359154 のような名前で作成した 2 つのキャッシュ ファイルがあります。 Windows ユーザーの場合は、%SystemDrive%temp ディレクトリを使用してキャッシュ ファイルを保存することをお勧めします。その場合、cacheDir オプションを /temp/ に設定する必要があります。
キャッシュ メカニズムが適切に動作していることを確認したら、データベース サーバーから受信した変更通知を処理するための PHP を作成できます。 「リスト 8」は、dropResult.php スクリプトです。データベース サーバーは、ORDERS テーブルと ORDER_ITEMS テーブルへの変更に応じてこのスクリプトを呼び出します。
リスト 8. データベース・サーバーから受信した変更通知の処理
コードをコピー コードは次のとおりです:
//File:dropResults.php
require_once 'Cache/Lite/Function.php';
$options = array(
'cacheDir' => '/ tmp/'
);
$cache = new Cache_Lite_Function($options)
if (isset($_GET['order_no'])&& isset($_GET['table']); {
if($_GET['table']=='ORDER_ITEMS'){
$cache->drop('getOrderItems', $_GET['order_no']);
if ( $_GET['table']=='ORDERS'){
$cache->drop('getOrderFields', $_GET['order_no']);
}
}
?>
dropResult.php スクリプトを作成した後、通知ハンドラー (リスト 2 を参照) で指定された URL が正しいことを確認してください。次に、SQL*Plus または同様のツールで OE/OE として接続し、このセクションの前半で testCache.php スクリプトを使用してアクセスしたのと同じ順序 (ここでは ID 2408 の順序) に影響を与える UPDATE ステートメントを実行します。 🎜>UPDATE ORDERS SET order_mode = 'direct' WHERE order_id=2408;
UPDATE ORDER_ITEMS SET 数量 = 3 WHERE order_id=2408 AND line_item_id=1;
UPDATE ORDER_ITEMS SET 数量 = 1 WHERE order_id=2408 AND line_item_id =2 ;
COMMIT;
上記の更新に応じて、この記事で説明した通知ハンドラーは、次の URL を使用して、dropResults.php スクリプトを 2 回実行します。 phpcache/dropResults.php?order_no=2408&table=ORDERS
http://webserverhost/phpcache/dropresults.php?order_no=2408&table=ORDER_ITEMS
「リスト 8」から、dropResult.php スクリプトが以下であることが明確にわかります。データベース サーバーから変更通知を受信した後、キャッシュはフラッシュされませんでした。期限切れのデータを含むキャッシュ ファイルを削除するだけです。ここでキャッシュ ディレクトリを確認すると、order_no=2408 を指定して testCache.php スクリプトを実行したときに作成されたキャッシュ ファイルが消えていることがわかります。これが本質的に意味するのは、次回 testCache.php が注文 ID 2408 に関連するデータをリクエストするときに、ローカル キャッシュではなくバックエンド データベースからそのデータを取得するということです。
このメソッドは、アプリケーションが要求した結果セットがアプリケーションで使用される前に変更される可能性がある状況で役立つ場合があります。この記事の例では、これは、testCache.php がその注文にアクセスする前に、特定の注文に関連するデータが複数回変更される可能性があることを意味します。このように、アプリケーションはデータベース サーバーから変更通知を受信した直後にキャッシュをフラッシュすることで、多くの不必要な作業を実行します。
ただし、dropResult.php スクリプトで変更通知を受け取った直後にキャッシュをフラッシュしたい場合は、drop メソッドを呼び出した後に Cache_Lite_Function インスタンスの call メソッドを呼び出し、両方の呼び出しに同じパラメーターを指定できます。 。この場合、dropResults.php が getOrderFields 関数と getOrderItems 関数を呼び出してキャッシュを更新できるように、getOrderFields.php スクリプトと getOrderItems.php スクリプトも必ず含める必要があります。 「リスト 9」は、変更されたdropResult.phpスクリプトです。
リスト 9. 変更通知を受信した直後にキャッシュを更新する
コードをコピー
コードは次のとおりです: //File:dropResults.php
require_once 'Cache/Lite/Function.php';require_once 'getOrderItems.php';
require_once 'getOrderFields.php ' ;
$options = array(
'cacheDir' => '/tmp/',
'lifeTime' => 86400
);オプション );
if (isset($_GET['order_no'])&& isset($_GET['table'])) {
if($_GET['table']=='ORDER_ITEMS'){
$cache->drop('getOrderItems', $_GET['order_no']);
$cache->call('getOrderItems', $_GET['order_no']);
if ($_GET['table']=='ORDERS'){
$cache->drop('getOrderFields', $_GET['order_no']); call ('getOrderFields', $_GET['order_no']);
}
}
?>
ORDERS テーブルと ORDER_ITEMS テーブルに格納されたデータがほとんど変更されない場合アプリケーションが頻繁にアクセスする場合、上記の方法が役立つ可能性があります。
概要

团队在Outlook中有一个非常有用的加载项,当您在使用Outlook2013或更高版本的应用程序时安装以前的应用程序时,它会自动安装。安装这两个应用程序后,只需打开Outlook,您就可以找到预装的加载项。但是,一些用户报告了在Outlook中找不到Team插件的异常情况。修复1–重新注册DLL文件有时需要重新注册特定的Teams加载项dll文件。第1步-找到MICROSOFT.TEAMS.ADDINLOADER.DLL文件1.首先,您必须确保

地址解析协议 (ARP) 用于将 MAC 地址映射到 IP 地址。网络上的所有主机都有自己的 IP 地址,但网络接口卡 (NIC) 将有 MAC 地址而不是 IP 地址。ARP 是用于将 IP 地址与 MAC 地址相关联的协议。所有这些条目都被收集并放置在 ARP 缓存中。映射的地址存储在缓存中,它们通常不会造成任何损害。但是,如果条目不正确或 ARP 缓存损坏,则会出现连接问题、加载问题或错误。因此,您需要清除 ARP 缓存并修复错误。在本文中,我们将研究如何清除 ARP 缓存的不同方法。方法

根据几位Windows10和Windows11用户的说法,他们在尝试安装Windows更新时遇到了错误0x80070246。此错误阻止他们升级PC并享受最新功能。值得庆幸的是,在本指南中,我们列出了一些最佳解决方案,可帮助您解决Windows0PC上80070246x11的Windows更新安装错误。我们还将首先讨论可能引发问题的原因。让我们直接进入它。为什么我会收到Windows更新安装错误0x80070246?您可能有多种原因导致您在PC上收到Windows11安装错误0x80070246。

如何在Mac上清除和重置图标缓存警告:因为您将使用终端和rm命令,所以在继续执行任何操作之前,最好使用TimeMachine或您选择的备份方法备份您的Mac。输入错误的命令可能会导致永久性数据丢失,因此请务必使用准确的语法。如果您对命令行不满意,最好完全避免这种情况。启动终端并输入以下命令并按回车键:sudorm-rfv/Library/Caches/com.apple.iconservices.store接下来,输入以下命令并按回车键:sudofind/private/var

尝试在其设备上启动 Microsoft Teams 桌面客户端的用户在空白应用页面中报告了错误代码 caa70004。错误代码说:“我们很抱歉——我们遇到了问题。”以及重新启动 Microsoft Teams 以解决问题的选项。您可以尝试实施许多解决方案并再次加入会议。解决方法——1. 您应该尝试的第一件事是重新启动 Teams 应用程序。只需在错误页面上点击“重新启动”即可。

Windows操作系统使用缓存来存储DNS条目。DNS(域名系统)是用于通信的互联网核心技术。特别是用于查找域名的IP地址。当用户在浏览器中键入域名时,加载站点时执行的首要任务之一是查找其IP地址。该过程需要访问DNS服务器。通常,互联网服务提供商的DNS服务器会自动使用,但管理员可能会切换到其他DNS服务器,因为这些服务器可能更快或提供更好的隐私。如果DNS用于阻止对某些站点的访问,则切换DNS提供商也可能有助于绕过Internet审查。Windows使用DNS解

什么是缓存?缓存(发音为ka·shay)是一种专门的高速硬件或软件组件,用于存储经常请求的数据和指令,这些数据和指令又可用于更快地加载网站、应用程序、服务和系统的其他部分。缓存使最常访问的数据随时可用。缓存文件与缓存内存不同。缓存文件是指经常需要的文件,如PNG、图标、徽标、着色器等,多个程序可能需要这些文件。这些文件存储在您的物理驱动器空间中,通常是隐藏的。另一方面,高速缓存内存是一种比主内存和/或RAM更快的内存类型。它极大地减少了数据访问时间,因为与RAM相比,它更靠近CPU并且速度

vue缓存数据有4种方式:1、利用localStorage,语法“localStorage.setItem(key,value)”;2、利用sessionStorage,语法“sessionStorage.setItem(key,value)”;3、安装并引用storage.js插件,利用该插件进行缓存;4、利用vuex,它是一个专为Vue.js应用程序开发的状态管理模式。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

AI Hentai Generator
AIヘンタイを無料で生成します。

人気の記事

ホットツール

MantisBT
Mantis は、製品の欠陥追跡を支援するために設計された、導入が簡単な Web ベースの欠陥追跡ツールです。 PHP、MySQL、Web サーバーが必要です。デモおよびホスティング サービスをチェックしてください。

mPDF
mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ホットトピック









