Como todos sabemos, el caché de resultados de la consulta de bases de datos pueden acortar significativamente el tiempo de ejecución del script, y reducir al mínimo la carga en el servidor de base de datos. Si desea manejar los datos es esencialmente estático, entonces la tecnología será muy eficaz. Esto se debe a que muchos de los datos sobre las solicitudes de base de datos remota podría llegar a ser cubiertos por el caché local, evitando así la necesidad de conectarse a la base de datos, ejecutar una consulta y obtener resultados.
Pero cuando se utiliza la base de datos y el servidor Web se encuentran en equipos diferentes, la base de datos de caché de resultados es generalmente una buena idea. Sin embargo, dependiendo de su situación para determinar la estrategia óptima de almacenamiento en caché es un problema difícil. Por ejemplo, con el resultado más reciente base de datos establecida para las aplicaciones más importantes, los métodos de caché ha disparado el tiempo-(sistema de almacenamiento en caché de uso común método, se supone que cada marca de tiempo de llegada cuando el fracaso para volver a generar la caché) podría no ser una satisfactoria solución. Este caso, es necesario utilizar un mecanismo, siempre que la aplicación necesita para almacenar en caché los cambios de base de datos de datos, el sistema informará de la aplicación para que la aplicación expirará en caché de datos que la base de datos. Este caso, utilice la notificación base de datos de "cambio" será muy conveniente.
"Notificación de Cambio de base de datos" Primeros pasos
"Base de datos de notificación de cambio" característica del uso es muy simple: crear un aviso para la aplicación de los procedimientos de notificación - a PL / SQL o procedimientos almacenados cliente OCI función de devolución de llamada. Entonces, para recibir las notificaciones de cambio de la base de datos objeto de registro de una consulta a fin de cambiar cualquiera de ellos siempre que el objeto de transacción y presentar el aviso cuando el controlador de llamada. Por lo general, los procedimientos de notificación serán modificados nombre de la tabla, el tipo de los cambios y las modificaciones de la línea de ID (opcional) para enviar a la escucha del cliente a la aplicación cliente puede realizar la respuesta adecuada el tratamiento.
Para entender la notificación base de datos "cambio" modo de un juego de acción, por favor considere el siguiente ejemplo. Suponga que su aplicación PHP para acceder a la tabla OE.ORDERS almacenados en el orden de almacenamiento y artículos OE.ORDER_ITEMS solicitud. Vista de la muy pocos cambios a las órdenes de la información, es posible que desee aplicar al tanto caché y tabla ORDERS ORDER_ITEMS de un conjunto de resultados de la consulta. Para evitar el acceso a los datos obsoletos, puede utilizar la "Base de datos de notificación de cambio", que le permite aprender fácilmente la aplicación de las dos tablas almacenadas en los cambios de datos.
Usted debe privilegiar NOTIFICACIÓN CAMBIO primer sistema y ejecutar permisos DBMS_CHANGENOTIFICATION OE usuarios a registrarse en la tabla Pedidos y consultas ORDER_ITEMS de recibir notificación y responder a estas dos tablas de hacer cambios DML o DDL. Esto podría ser de la herramienta de línea de comandos SQL (como SQL * Plus) para ejecutar el siguiente comando.
CONNECT / AS SYSDBA;
NOTIFICACIÓN DE SUBVENCIÓN PARA EL CAMBIO oe;
GRANT EXECUTE ON DBMS_CHANGE_NOTIFICATION a OE;
Asegúrese de que el parámetro init.ora job_queue_processes establece en cero el valor a recibir PL / SQL notificación. Si lo prefiere, puede utilizar el siguiente comando ALTER SYSTEM:
ALTER SISTEMA "job_queue_processes" = 2;
Luego, con el fin de la OE / OE conexión, puede crear un controlador de notificación. Pero primero, usted debe notificar al controlador se utiliza para crear los objetos de base de datos. Por ejemplo, usted puede necesitar para crear una o más tablas de bases de datos con el fin de notificar al controlador de cambios en el registro a la misma. En el siguiente ejemplo, creará la tabla nfresults para registrar la siguiente información: fecha y cambio de hora se produce, el nombre de la tabla es modificada y un mensaje (Yue Ming Cheng proceso de notificación Xu para informar el mensaje es enviado al cliente).
oe CONNECT / oe;
CREAR UN CUADRO nfresults (
operdate FECHA,
tblname VARCHAR2 (60),
VARCHAR2 rslt_msg (100)
);
En realidad, es posible que necesite crear más tabla para registrar los eventos de notificación y el cambio de la línea de ID y otra información, pero en este caso la tabla nfresults responden plenamente a las necesidades.
Utilice UTL_HTTP enviar una notificación al cliente
Usted también puede crear uno o más de PL / SQL los procedimientos almacenados, y notificar al controlador de llamar a estos procedimientos almacenados, con el fin de lograr una solución más fácil de mantener y flexible. Por ejemplo, es posible que desee crear una implementación del mensaje de notificación enviado al procedimiento almacenado del cliente. "Lista 1" es el PL / SQL sendNotification procedimiento. El proceso utiliza el paquete UTL_HTTPPL a la aplicación cliente para enviar las notificaciones de cambios.
Listado 1. Utilice UTL_HTTP enviar una notificación al cliente
CREATE OR REPLACE PROCEDURE sendNotification (URL en VARCHAR2,
tblname EN VARCHAR2, order_id EN VARCHAR2) IS
req UTL_HTTP.REQ;
resp UTL_HTTP.RESP;
VARCHAR2 err_msg (100);
TBL VARCHAR (60);
EMPEZAR
TBL: = SUBSTR (tblname, INSTR (tblname, '.', 1, 1) 1, 60);
EMPEZAR
REQ: = UTL_HTTP.BEGIN_REQUEST (url | | order_id ||'&'||' tabla = '| | TBL);
resp: = UTL_HTTP.GET_RESPONSE (req);
INSERT INTO nfresults VALUES (SYSDATE, tblname, resp.reason_phrase);
UTL_HTTP.END_RESPONSE (resp);
EXCEPTO CUANDO OTROS ENTONCES
err_msg: = SUBSTR (SQLERRM, 1, 100);
INSERT INTO nfresults VALUES (SYSDATE, tblname, err_msg);
END;
COMMIT;
END;
/
Tales como la "Lista 1" como se muestra, a sendNotification UTL_HTTP.BEGIN_REQUEST función de las peticiones HTTP emitidas en forma de mensajes de notificación se envía al cliente. Esta dirección contiene la tabla ORDERS se ha cambiado order_id líneas. Luego, utiliza UTL_HTTP.GET_RESPONSE obtener el cliente para emitir un mensaje de respuesta. De hecho, sendNotification no es necesario tratar con el cliente para devolver toda la respuesta, pero sólo para grabar un mensaje reason_phrase PRAE corto almacenada en el campo (descritas en el código del estado).
Crear un controlador de notificación
Ahora, usted puede crear un controlador de notificación, que ayudará al proceso descrito anteriormente sendNotification enviar notificaciones de cambio para el cliente. Para ver la lista de "2" en el PL / SQL orders_nf_callback procedimiento.
Listado 2. Lidiar con los cambios en los procedimientos de mesa OE.ORDERS una notificación,
CREATE OR REPLACE orders_nf_callback PROCEDIMIENTO (ntfnds EN SYS.CHNF $ _DESC) ES
tblname VARCHAR2 (60);
numtables NÚMERO;
event_type NÚMERO;
VARCHAR2 row_id (20);
numrows NÚMERO;
VARCHAR2 ord_id (12);
Url VARCHAR2 (256): = 'http://webserverhost/phpcache/dropResults.php?order_no =';
EMPEZAR
event_type: = ntfnds.event_type;
numtables: = ntfnds.numtables;
IF (= event_type DBMS_CHANGE_NOTIFICATION.EVENT_OBJCHANGE) ENTONCES
FOR i IN 1 .. numtables LOOP
tblname: = ntfnds.table_desc_array (i). table_name;
SI (bitand (ntfnds.table_desc_array (i). Opflags,
DBMS_CHANGE_NOTIFICATION.ALL_ROWS) = 0) ENTONCES
numrows: = ntfnds.table_desc_array (i). numrows;
ELSE
numrows: = 0;
END IF;
SI (tblname = 'OE.ORDERS') THEN
PARA j IN 1 .. numrows LOOP
ntfnds.table_desc_array row_id: = (i). row_desc_array (j). row_id;
SELECCIÓN EN order_id ord_id FROM pedidos WHERE ROWID = row_id;
sendNotification (url, tblname, ord_id);
END LOOP;
END IF;
END LOOP;
END IF;
COMMIT;
END;
/
Tales como "venta 2" muestra, esta notificación se SYS.CHNF objeto $ _DESC controlador como parámetro, a continuación, utilizar sus propiedades para obtener más información sobre los cambios. En este ejemplo, el controlador de notificación se refiere solamente a la base de datos en respuesta a los objetos registrados tuvo que DML o DDL cambio (es decir, sólo si el tipo de notificación para el momento EVENT_OBJCHANGE) y emitió el aviso, y pasar por alto los eventos de base de datos (por ejemplo, Iniciar una instancia o instancias finaliza) previo aviso. A partir de lo anterior, el controlador puede manejar OE.ORDERS tabla para cada línea afectada de la notificación del cambio. Más adelante en este artículo "se sumará a un formulario de registro existente" sección, añadir algunas líneas del código del controlador de manera que puede manejar por fila de la tabla se modifica OE.ORDER_ITEMS notificación.
Para crear una notificación de cambios de registro
Crear un controlador de notificación, usted debe registrarse para crear una consulta. Para este ejemplo, el proceso de registro debe llevar a cabo consultas sobre la mesa y OE.ORDER orders_nf_callback designado como el proceso de notificación. También es necesario especificar el paquete en la opción DBMS_CHANGE_NOTIFICATION QOS_ROWIDS para que los datos ROWID en el nivel de notificación de granularidad. "Lista 3" es un bloque PL / SQL, controlador de notificación orders_nf_callback para crear consultas de registro.
Listado 3. Para crear un registro de cheques controlador de notificación
DECLARAR
SYS.CHNF Regds $ _REG_INFO;
regid NÚMERO;
ord_id NÚMERO;
qosflags NÚMERO;
EMPEZAR
qosflags: = + DBMS_CHANGE_NOTIFICATION.QOS_RELIABLE
DBMS_CHANGE_NOTIFICATION.QOS_ROWIDS;
Regds: = $ SYS.CHNF _REG_INFO ('orders_nf_callback, qosflags, 0,0,0);
regid: = DBMS_CHANGE_NOTIFICATION.NEW_REG_START (Regds);
SELECCIÓN EN order_id ord_id FROM pedidos WHERE ROWNUM 2;
DBMS_CHANGE_NOTIFICATION.REG_END;
END;
/
La muestra para la tabla ORDERS para crear un registro y procedimientos de notificación para orders_nf_callback. Ahora, si utiliza DML o DDL declaraciones modificar la tabla PEDIDOS y compromete a la transacción, se llamará automáticamente a la función orders_nf_callback. Por ejemplo, es posible que PEDIDOS mesa para la siguiente sentencia UPDATE y presentar la operación:
UPDATE intimaciones order_mode = 'directa' WHERE order_id = 2421;
UPDATE intimaciones order_mode = 'directa' WHERE order_id = 2422;
COMMIT;
Emitió un comunicado para asegurar que la base de datos para responder a los servicios antes mencionados, se puede comprobar nfresults tabla:
SELECCIONAR TO_CHAR (operdate, 'dd hh-mon-aa: mi: ss') operdate,
tblname, rslt_msg nfresults DE;
Los resultados deben ser las siguientes:
OPERDATE TBLNAME RSLT_MSG
--------------------- ----------- ---------
02-mar-06 04:31:28 OE.ORDERS No se ha encontrado
02-mar-06 04:31:29 OE.ORDERS No se ha encontrado
De los resultados anteriores se desprende que, orders_nf_callback tienen que trabajar, pero no encontró la secuencia de comandos de cliente. En este ejemplo, esta situación no es sorprendente, ya que no creó la dirección URL especificada en el guión dropResults.php. La secuencia de comandos dropResults.php, más adelante en este artículo algunos de los clientes de la construcción.
Añadir a una mesa de registro existentes
La primera parte se describe cómo utilizar los servicios de cambio de base de datos de la notificación en el objeto de registro (en la tabla Pedidos para el ejemplo anterior) los cambios cuando se le notifique. Sin embargo, el punto de vista del rendimiento, la aplicación cliente lo desea, puede la tabla de caché en lugar de la tabla Pedidos se ORDER_ITEMS consulta del conjunto de resultados, ya que los pedidos en cada visita, sólo había recuperado de la fila de la tabla PEDIDOS, pero debe recuperar varias filas de mesa ORDER_ITEMS. En realidad, el orden puede contener docenas o incluso cientos de órdenes de entrada.
Como ya se ha registrado en la consulta de tabla ORDERS, por lo que hay necesidad de crear un registro para registrar una consulta sobre la mesa ORDER_ITEMS. En su lugar, puede utilizar el registro existente. Para ello, primero tiene que recuperar el registro actual de identificación. Se puede realizar la siguiente consulta para llevar a cabo este trabajo:
regid SELECT table_name FROM user_change_notification_regs;
Los resultados pueden ser las siguientes:
REGID TABLE_NAME
----- --------------
241 OE.ORDERS
Obtener ID de registro, puede utilizar DBMS_CHANGE_NOTIFICATION.ENABLE_REG función de un objeto nuevo se agrega al registro, según se indica:
DECLARAR
ord_id NÚMERO;
EMPEZAR
DBMS_CHANGE_NOTIFICATION.ENABLE_REG (241);
SELECCIÓN EN order_id ord_id order_items DE DONDE ROWNUM 2;
DBMS_CHANGE_NOTIFICATION.REG_END;
END;
/
Hecho! A partir de ahora, la base de datos generará un aviso para responder a las órdenes y de cualquier cambio hecho ORDER_ITEMS y el proceso para manejar las llamadas orders_nf_callback aviso. Por lo tanto, el siguiente paso es editar orders_nf_callback, de manera que puede manejar la ejecución de las operaciones de DML en la tabla generada ORDER_ITEMS previo aviso. Sin embargo, volver a crear orders_nf_callback proceso, es necesario crear la siguiente referencia en el proceso de actualización de los tipos de tabla:
CREATE TYPE rdesc_tab AS DE LA MESA DE SYS.CHNF $ _RDESC;
A continuación, volver a la lista 2, después de la siguiente línea de código:
SI (tblname = 'OE.ORDERS') THEN
PARA j IN 1 .. numrows LOOP
ntfnds.table_desc_array row_id: = (i). row_desc_array (j). row_id;
SELECCIÓN EN order_id ord_id FROM pedidos WHERE ROWID = row_id;
sendNotification (url, tblname, ord_id);
END LOOP;
END IF;
Inserte el siguiente código:
SI (tblname = 'OE.ORDER_ITEMS') THEN
Para REC IN (SELECT DISTINCT (o.order_id) DE o_id
MESA (CAST (ntfnds.table_desc_array (i). Row_desc_array rdesc_tab AS)) t,
o pedidos, order_items d = d.rowid t.row_id DONDE Y d.order_id o.order_id =)
LOOP
sendNotification (url, tblname, rec.o_id);
END LOOP;
END IF;
Vuelva a crear orders_nf_callback, necesita para probar si puede funcionar. Usted puede hacer esto para la siguiente instrucción UPDATE forma ORDER_ITEMS y presentar la operación:
UPDATE ORDER_ITEMS en cantidades = 160 = 2421 WHERE order_id line_item_id Y = 1;
UPDATE ORDER_ITEMS en cantidades = 160 = 2421 WHERE order_id line_item_id Y = 2;
COMMIT;
A continuación, compruebe nfresults mesa, de la siguiente manera:
SELECCIONAR TO_CHAR (operdate, 'dd hh-mon-aa: mi: ss') operdate,
rslt_msg nfresults DESDE DONDE tblname = 'OE.ORDER_ITEMS;
La salida puede ser como sigue:
OPERDATE RSLT_MSG
------------------- --------------
03-mar-06 12:32:27 No Encontrado
Usted se estará preguntando por qué la mesa sólo para insertar una fila nfresults - después de actualizar la tabla ORDER_ITEMS dos líneas. De hecho, las dos filas actualizadas tienen la misma order_id - que pertenecen al mismo orden. En este caso, suponemos que la aplicación de cliente se utiliza una instrucción para seleccionar la opción para que todos los pedidos, por lo que no necesita saber exactamente lo que ha cambiado una orden que los artículos pedidos. En cambio, los clientes necesitan saber por lo menos modificar, eliminar o insertar una orden de entrada identificación de la orden.
Construcción del cliente
Ahora que ha creado para la tabla Pedidos y ORDER_ITEMS el registro, visite el siguiente vamos a ver los cuadros almacenados en el orden y el tema para la aplicación de cliente de cómo utilizar las notificaciones de cambios. Para hacer esto, usted puede construir una aplicación PHP, se almacenarán en caché los resultados de consulta para la tabla anterior, y tomará las medidas adecuadas para responder a los cambios introducidos en el anuncio de estas tablas (desde el servidor de base de datos en la recepción de dicha notificación). Una forma sencilla es utilizar PEAR:: Paquete Cache_Lite, que le provee de un mecanismo fiable para datos de la caché hasta la fecha. En particular, puede utilizar la clase Cache_Lite_Function (PEAR:: Cache_Lite parte del paquete), por la clase que usted puede almacenar en caché la función llamada.
Por ejemplo, puede crear una función para realizar las siguientes tareas: establecer una conexión de base de datos, la aplicación de la instrucción SELECT en la base de datos para obtener resultados de búsqueda y en última instancia a una matriz devuelve los resultados. A continuación, puede llamar a los métodos a través de caché ejemplo Cache_Lite_Function los resultados devueltos por la matriz de función, de modo que pueda de la caché local en vez de la base de datos de back-end para leer estas matrices, esto puede mejorar significativamente el rendimiento de aplicaciones. Luego, una vez recibida la notificación de cambios en los datos almacenados en caché, utilizará ejemplo Cache_Lite_Function método de la gota para borrar la caché de datos de vencimiento.
Cuando vea los ejemplos de este artículo, es posible que desee crear dos funciones, para la aplicación y la interacción de bases de datos: La primera función de la consulta y devuelve la tabla de pedidos con el ID específico de la orden, y otra función para consultar la tabla y volver ORDER_ITEMS El orden de los artículo de la orden. "Lista 4" muestra incluye la función getOrderFields (la función de aceptar una identificación de la orden y devuelve los autos recuperados contienen algún campo de matriz asociativa) de la escritura getOrderFields.php.
Listado 4. El acceso a los campos especificados en orden
/ / Archivo: getOrderFields.php
require_once 'connect.php;
getOrderFields función ($ order_no) (
if (! $ rsConnection = getConnection ()) (
return false;
)
StrSQL = $ "TO_CHAR SELECT (ORDER_DATE) ORDER_DATE, customer_id,
ORDER_TOTAL from pedidos where = order_id: order_no ";
$ RsStatement oci_parse = ($ rsConnection, $ strSQL);
oci_bind_by_name ($ rsStatement ": order_no", order_no $, 12);
if (! oci_execute ($ rsStatement)) (
$ Error = oci_error ();
print $ err mensaje ['];
trigger_error ('consulta falló:'. $ err mensaje [']);
return false;
)
Resultados $ = oci_fetch_assoc ($ rsStatement);
return $ resultado;
)
?
"Lista 5" es getOrderItems.php script. El guión contiene getOrderItems función, la función de aceptar pedidos para ID y devuelve una matriz de dos dimensiones, la matriz contiene la orden, dijo que la línea de entrada de pedidos.
Listado 5. Para obtener una orden los elementos que se especifica
/ / Archivo: getOrderItems.php
require_once 'connect.php;
getOrderItems función ($ order_no) (
if (! $ rsConnection = getConnection ()) (
return false;
)
$ StrSQL = "SELECT conf bin copia de seguridad de configuración bin_old crawler_bin.tar.gz crawler.tar.gz datos eshow google.html generate.sh eshow_sitemap.html google.html.md5 noticias maint registro: 10 noticias: 11 noticias: 12 noticias: 13 noticias: 14 noticias: 15 noticias: 16 noticias: 17 noticias: 18 noticias: 2 noticias: 3 noticias: 4 noticias: 5 noticias: 6 noticias: 7 noticias: 8 noticias: 9 tareas semillas outboundLinksMgr.sql sitemap.html svn tmp xml2dict-2008.6-tar.gz xml2dict-de sólo lectura de ORDER_ITEMS WHERE
order_id =: POR ORDEN order_no line_item_id ";
$ RsStatement oci_parse = ($ rsConnection, $ strSQL);
oci_bind_by_name ($ rsStatement ": order_no", order_no $, 12);
if (! oci_execute ($ rsStatement)) (
$ Error = oci_error ();
trigger_error ('consulta falló:'. $ err mensaje [']);
return false;
)
$ NRows oci_fetch_all = ($ rsStatement, $ resultados);
matriz de retorno ($ nRows, $ resultados);
)
?
Tenga en cuenta que estas dos funciones necesitan connect.php script, el script debe incluir la función getConnection para devolver la conexión de base de datos. Listado de 6 es el guión connect.php:
Listado 6. Para obtener una conexión de base de datos
/ / Archivo: connect.php
función getConnection () (
$ Dbhost = "dbserverhost";
DbHostPort $ = "1521";
DbServiceName $ = "orclR2";
Usr $ = "oe";
$ Pswd = "oe";
DbConnStr $ = "(DESCRIPTION = (ADDRESS = (= PROTOCOLO TCP) (HOST =". $ Dbhost ".)
(PUERTO = ". $ DbHostPort ."))( CONNECT_DATA = (= SERVICE_NAME". .")))"; DbServiceName $
if (! $ dbConn oci_connect = ($ usr, PSWD $, $ dbConnStr)) (
$ Error = oci_error ();
trigger_error ('No se pudo conectar. $ err mensaje [']);
return false;
)
return $ dbConn;
)
?
Ahora que ha creado todas las comunicaciones necesarias con la función de base de datos, la siguiente clase vamos a ver en el trabajo Cache_Lite_Function. Listado de 7 es secuencia de comandos utilizando testCache.php caché Cache_Lite_Function clase los resultados de estas funciones.
Listado 7. Utilice el PEAR:: cache Cache_Lite
/ / Archivo: testCache.php
require_once 'getOrderItems.php;
require_once 'getOrderFields.php;
require_once 'Cache / Lite / function.php;
$ Opciones = array (
"CacheDir '= ' / tmp / ',
'Vida' = 86400
);
if (! isset ($ _GET order_no ['])) (
die ('El parámetro order_no es obligatorio');
)
$ Order_no = $ _GET ['order_no'];
$ Cache = Cache_Lite_Function nueva ($ opciones);
if ($ orderfields = llamada $ cache- ('getOrderFields', $ order_no)) (
de impresión "
ORDEN # $ order_no
";
print "";
orderfields impresión "FECHA:". $ ORDER_DATE '[']. "
";
print "id_cli:". $ orderfields ['customer_id']. "
";
print "Total:". $ orderfields ORDER_TOTAL '[']. "
";
print "";
) Else (
print "Algunos problema se produjo al obtener los campos de orden!
";
caída de $ cache- ('getOrderFields, order_no $);
)
if (list ($ nRows, $ orderitems) = llamada $ cache- ('getOrderItems', $ order_no)) (
/ / Imprimir "
LÍNEA DE ARTÍCULOS EN ORDEN # $ order_no
";
print "";
de impresión "
";
while (list ($ clave, $ valor) = each ($ orderitems)) (
print "$ key
";
)
de impresión "
";
for ($ i = 0; $ i $ nRows; $ i + +) (
print "";
orderitems "imprimir". $ order_id '['] [$ i ]."";
orderitems "imprimir". $ LINE_ITEM_ID '['] [$ i ]."";
orderitems "imprimir". $ PRODUCT_ID '['] [$ i ]."";
orderitems "imprimir". $ UNIT_PRICE '['] [$ i ]."";
orderitems "imprimir". $ CANTIDAD '['] [$ i ]."";
de impresión "
";
)
print "";
) Else (
print "Algunos problema se produjo al obtener líneas de pedido";
caída de $ cache- ('getOrderItems, order_no $);
)
?
"Lista de 7" en testCache.php script debe order_no parámetros de URL (almacenada en la tabla, en nombre del orden OE.ORDER ID), así se llama. Por ejemplo, para recuperar el identificador para el 2408 los pedidos y la información relacionada con la necesidad de introducir en el navegador la dirección siguiente:
http://webserverhost/phpcache/testCache.php?order_no=2408
Resultado, el navegador genera el siguiente resultado:
ORDEN # 2408
FECHA: 29-junio-99 06.59.31.333617 AM
Id_cli: 166
TOTAL: 309
Order_id LINE_ITEM_ID PRODUCT_ID CANTIDAD UNIT_PRICE
240812751613
240822761261
2408327831010
Ahora bien, si hace clic en el botón de recarga del navegador, la escritura testCache.php no se volvió a llamar y getOrderFields getOrderItems función. En cambio, los lee de la caché local de los resultados. Por lo tanto, las 24 horas a partir de ahora (porque establece de por vida a 86.400 segundos) en el caché local puede ser utilizado para satisfacer cada order_no getOrderFields = 2108 o llamar a getOrderItems necesidades. Nótese, sin embargo, la clase Cache_Lite_Function no proporciona API para poner a prueba con los parámetros determinados de una función dada si se dispone de búfer. Por lo tanto, cada vez con los mismos parámetros para determinar cuando la aplicación llama a la función es en realidad para leer la memoria caché sigue siendo la aplicación de la función puede ser un poco complicado. Por ejemplo, en el ejemplo anterior, para asegurar que el mecanismo de caché para trabajar, puede cambiar temporalmente la secuencia de comandos connect.php se especifica en la información de conexión, por lo que no puede establecer una conexión de base de datos; ejemplo, especificar un servidor incorrecto base de datos de nombre de host, y luego otra vez order_no = 2108 testCache.php ejecutar secuencias de comandos. Si la función de caché correctamente, el navegador de salida debe ser la misma que la anterior.
Además, usted puede consultar el directorio de caché, el directorio como el valor cacheDir opción (en este ejemplo es / tmp) pasa al constructor Cache_Lite_Function clase. En el directorio, usted encontrará dos nuevos archivos creados por el caché que tienen nombres similares a: cache_7b181b55b55aee36ad5e7bd9d5a091ec_3ad04d3024f4cd54296f75c92a359154. Tenga en cuenta que si usted es un usuario de Windows, es posible que desee utilizar% SystemDrive% directorio temporal para guardar el archivo caché. Si es así, debe cacheDir opción se establece en / temp /.
El almacenamiento en caché mecanismo funcione, a continuación, puede crear un PHP para manejar los cambios desde el servidor de base de datos recibe una notificación. "Lista 8" es dropResult.php script. servidor de bases de datos llamará a la secuencia de comandos para responder a los cambios en la tabla Pedidos y ORDER_ITEMS.
Listado de 8. Lidiar con los cambios desde el servidor de base de datos recibe una notificación
/ / Archivo: dropResults.php
require_once 'Cache / Lite / function.php;
$ Opciones = array (
"CacheDir '= ' / tmp / '
);
$ Cache = Cache_Lite_Function nueva ($ opciones);
if (isset ($ _GET order_no [''])&& isset ($ _GET tabla ['])) (
if ($ tabla _GET ['']==' ORDER_ITEMS ») (
caída de $ cache- ('getOrderItems, order_no $ _GET [']);
)
if ($ tabla _GET ['']==' PEDIDOS ») (
caída de $ cache- ('getOrderFields, order_no $ _GET [']);
)
)
?
Crear secuencias de comandos dropResult.php, asegúrese de que los procedimientos de notificación que figura en la URL (como se muestra en el listado 2) correctamente. A continuación, en SQL * Plus o herramienta similar para la OE / conexión de la OE, y la aplicación de la instrucción UPDATE, estas declaraciones se afectará a la parte del guión previamente acceder a través de testCache.php mismo orden (en este caso es el ID para el 2408 órdenes):
UPDATE intimaciones order_mode = 'directa' WHERE order_id = 2408;
UPDATE ORDER_ITEMS cantidad SET = 3 cuando order_id = 2408 y line_item_id = 1;
UPDATE ORDER_ITEMS en cantidades = 1 WHERE order_id = 2408 y line_item_id = 2;
COMMIT;
En respuesta a la actualización anterior, se ha descrito anteriormente en este artículo por los procedimientos de notificación utilizará el siguiente URL para ejecutar secuencias de comandos dropResults.php dos veces: http://webserverhost/phpcache/dropResults.php?order_no=2408&table=ORDERS
http://webserverhost/phpcache/dropresults.php?order_no=2408&table=ORDER_ITEMS
Desde la lista "8" se puede ver claramente, los cambios dropResult.php script desde el servidor de base de datos recibe el anuncio no vaciar la caché. Sólo se elimina el archivo de caché que contiene los datos obsoletos. Por lo tanto, si se comprueba el directorio de caché, verá el uso de order_no = 2408 testCache.php script de ejecución para crear el archivo de caché se ha ido. Este hecho significa que, testCache.php la siguiente solicitud y la identificación de la orden para el 2408 los datos relacionados con el caché local en vez de la base de datos de back-end para obtener los datos.
Usted encontrará que la aplicación solicita un conjunto de resultados es probable que la utilicen en una aplicación para cambiar la situación antes de que el método podría ser útil. En este ejemplo, esto significa que los datos asociados a un orden específico para acceder a la orden puede cambiar testCache.php muchas veces antes. Esta aplicación se traducirá en la notificación de cambios recibidos del servidor de base de datos para actualizar su caché inmediatamente y hecho un montón de trabajo innecesario.
Pero si quieres dropResult.php secuencia de comandos inmediatamente después de recibir la notificación de cambio de vaciar la caché, puede llamar a la llamada al método se reducen después de instancia Cache_Lite_Function método de llamada, tanto para llamar a los mismos parámetros especificados. En este caso, también deben asegurarse de que el script contiene getOrderFields.php y getOrderItems.php a dropResults.php getOrderFields y getOrderItems función puede ser llamada para vaciar la caché. "Lista de secuencia de comandos dropResult.php 9" se modifica.
Listado 9. Inmediatamente después de recibir la notificación para cambiar la actualización de la caché
/ / Archivo: dropResults.php
require_once 'Cache / Lite / function.php;
require_once 'getOrderItems.php;
require_once 'getOrderFields.php;
$ Opciones = array (
"CacheDir '= ' / tmp / ',
'Vida' = 86400
);
$ Cache = Cache_Lite_Function nueva ($ opciones);
if (isset ($ _GET order_no [''])&& isset ($ _GET tabla ['])) (
if ($ tabla _GET ['']==' ORDER_ITEMS ») (
caída de $ cache- ('getOrderItems, order_no $ _GET [']);
llamar a $ cache- ('getOrderItems, order_no $ _GET [']);
)
if ($ tabla _GET ['']==' PEDIDOS ») (
caída de $ cache- ('getOrderFields, order_no $ _GET [']);
llamar a $ cache- ('getOrderFields, order_no $ _GET [']);
)
)
?
Si se almacena en las órdenes y los datos ORDER_ITEMS pocos cambios en la tabla y la solicitud para acceder a ella con frecuencia, entonces el método anterior puede ser útil.
Resumen
Si las aplicaciones PHP con Oracle Database 10g Release 2 interacción, puede usar el "cambio de base de datos característica de notificación," a través de la aplicación de la función pueden recibir y enviar una notificación al responder a las peticiones de objetos relacionados con el cambio LMD. Utilice esta función, no se actualizan en un período de tiempo específico en el caché de la aplicación. Por el contrario, sólo si el conjunto resultado de la consulta social ha cambiado cuando la ejecución de la operación.