Cómo utilizar PHP DTrace en Oracle Linux
En Oracle Linux, la utilidad DTrace requiere una suscripción a la red unbreakable Linux (ULN) de Oracle.
Instalar Oracle Linux y Oracle Unbreakable Enterprise Kernel versión 3.
Primero, instale Oracle Linux 6.4 a través de Oracle E-Delivery.
Después de instalar Oracle Linux 6.4, asegúrese de que la versión 3 del kernel empresarial irrompible para el último canal de Oracle Linux 6(x86_64) esté habilitada en ULN. Instale el kernel UEK3:
# yum install kernel-uek
Habilite el canal "Oracle Linux 6 DTrace User Space Tool (x86_64) -latest" en ULN e instale la utilidad DTrace:
# yum install dtrace-utils
Reinicie con el nuevo kernel UEK3 3.8.13.
Instalación de PHP
Necesita utilizar el parámetro -enable-dtrace para compilar PHP. Puede instalar algunos RPM de evaluación prediseñados con DTrace habilitado. Consulte el área de juegos "Paquetes prediseñados" de "DTrace PHP con Oracle Linux".
También puedes reconstruir PHP de la siguiente manera:
Descarga PHP 5.4.20 o PHP 5.5.4 o superior desde php.net y descomprime:
$ tar -xJf php-5.4.20.tar.bz2
$ cd php-5.4.20
Configurar PHP:
$ ./config \
- prefix=$HOME/p54 \
- enable-dtrace \
- desactivar-todos - desactivar-cgi \
-con- pear-enable-XML-enable-libxml-with-zlib
Esto creará una línea de comando PHP mínima con DTrace habilitado. Todas las extensiones innecesarias están deshabilitadas. Puede incluir otras extensiones según sea necesario.
La opción de prefijo significa instalar en un directorio local para que pueda ver fácilmente los archivos instalados. Después de usar instantáneas, es fácil limpiar el directorio.
Las opciones Pear, xml y zlib permiten comandos pecl.
Genera el binario PHP e instálalo:
$ make
$ para instalar
Copia php.ini-development a $ HOME /p54/lib/php.ini y edite el archivo para configurar la zona horaria, por ejemplo:
date.timezone=Americas/Los Angeles
Instale PHP OCI8 para la base de datos Oracle.
La versión de evaluación de PHP RPM incluye una extensión OCI8 que puede conectarse a la base de datos Oracle; consulte la publicación del blog mencionada anteriormente.
Sin embargo, si compila PHP usted mismo, deberá agregar PHP OCI8 manualmente como la extensión "* * *":
Habilite "software Oracle para Oracle Linux 6 (x86 _ 64 )” canal.
Instalar el cliente instantáneo de Oracle como usuario root:
# yum install Oracle-instant client 12.1-basic Oracle-instant client 12.1-devel
Como usuario normal, establezca la ruta a PHP:
$ export PATH = $ HOME/p54/bin:$ PATH
Si necesita acceder: 80/
Establezca el entorno variables PHP_DTrace para habilitar DTrace, luego instale PHP OCI8:
$ PHP_DTRACE = yes pecl install OCI 8-2.0.2
La sonda DTrace que se utilizará más adelante en este artículo La definición es Basado en PHP OCI8 2.0.2, por lo que es necesario instalar una versión explícita. Si desea instalar una versión posterior, verifique el detector y sus parámetros para ver si hay mejoras menores en la última versión.
Cuando se le solicite el directorio ORACLE_HOME, no es necesario ingresar texto, simplemente presione la tecla Retorno. La instalación detectará automáticamente los RPM de Oracle Instant Client. La configuración continuará y el resultado contendrá algo similar a:
[ . . ]
Verifique la compatibilidad con OCI8 de la base de datos Oracle... Sí, compartida
Verifique la versión de PHP... OK
Verifique la compatibilidad con OCI8 DTrace... Sí< / p>
[ .. . ]
Configuración: ADVERTENCIA: Extensión OCI8: ORACLE_HOME no configurada,
Buscando el cliente instantáneo de Oracle predeterminado
Verifique el directorio del cliente instantáneo de Oracle...
/usr/lib/Oracle/12.1/client 64/lib
Comprobando el directorio de encabezado del SDK de Oracle Instant Client...
/usr/include/ Oracle/12.1/ cliente 64
Comprobando la compatibilidad de la versión de la biblioteca del cliente instantáneo de Oracle...12.1
[ . . ]
Edite php.ini nuevamente y agregue PHP OCI8:
extension=oci8.so
Confirmar instalación:
$ php - ri oci8
oci8
Soporte OCI8=>habilitado
Soporte OCI8 DTrace=>habilitado
Versión OCI8=& desarrollo gt p>
Revisión= & gt$ Id:b 30 FB 4 bef 45d 9 F5 ce 8 a 56 b 736 f 1546 ea 0 CFF 08 ef $.
Versión de la biblioteca del cliente en tiempo de ejecución de Oracle = & gt12.1.0.1.0
Versión del cliente en tiempo de compilación de Oracle = & gt12.1
Instrucciones = & gt valor local = > valor primario
OCI 8. max_persistent = >-1 = >-1
OCI 8. persistente_time out = >- 1 = >-1
OCI 8. ping_interval = > 60 = >60
oci8.privileged_connect = >Off = >leave
oci8.statement _ cache _ size = & gt20 = >20
oci8.default_prefetch = >100 = >100
OCI 8 antiguo _ OCI _ close _ semantics = & gt;Off = & gtLeave
oci8.connection_class = >No value=>Sin valor
oci8.events = >Off = >Leave
Estadísticas = & gt
Conexiones persistentes activas = & gt0
Activas conexiones = & gt0
Instrucciones de instalación de PHP OCI8
Para admitir DTrace, es necesario instalar PHP OCI8 2.0 de PECL, ya que PHP 5.4 y PHP OCI8 1.4 incluidos en PHP 5.5 no lo hacen. tener un detector DTrace. Después del lanzamiento de PHP 5.6 en el futuro, podrá configurar PHP OCI8 que admita DTrace al compilar PHP.
Por supuesto, puede instalar PHP OCI8 a través del archivo zip de Oracle Instant Client, o simplemente puede instalarlo usando su ORACLE_HOME existente.
Puede instalar PHP OCI8 compatible con DTrace en una versión de PHP que no incluya o no esté configurada con DTrace. Esto incluye versiones anteriores de PHP. Podrá rastrear la sonda PHP OCI8, pero no la sonda PHP principal. Del mismo modo, puede instalar PHP OCI8 con DTrace deshabilitado además de PHP habilitado para DTrace.
Si usa phpize y configura en lugar de pecl para instalar PHP OCI8 2.0 de PECL, aún necesita configurar PHP_DTRACE=yes. Esto se debe a que el script de configuración limitada del paquete PECL ignorará la opción -enable-dtrace.
El script de configuración PHP OCI8 2.0 funciona con DTrace "real", pero Linux SystemTap no rastrea extensiones.
Tenga en cuenta que la salida generada por los archivos binarios optimizados de DTrace puede diferir del código que vemos.
Verificar la sonda PHP DTrace
Habilite DTrace como usuario root para permitir que los usuarios normales registren información de seguimiento:
# modprobe quick trap
# chmod 666 /dev/dtrace/helper
En lugar de usar el comando chmod, puede usar reglas del paquete ACL para restringir el acceso de usuarios específicos al dispositivo.
Ejecuta php como usuario normal, sin opciones. PHP se iniciará y esperará la entrada:
$ php
Enumere las sondas DTrace disponibles como raíz.
El detector central de PHP y el detector PHP OCI8 son los siguientes:
# dtrace -l -m php -m oci8.so
4 php9559 php dtrace_compile_file entrada de archivo compilado
5 php9559 php dtrace_compile_file compilación-archivo-retorno
6 php9559 php zend_error error
7 PHP 9559 PHP ZEND_CATCH_SPEC_CONST_CV_HANDLER excepción detectada
8 PHP 9559 PHP Zend _ throw _ excepción _ lanzamiento de excepción interna
9 php9559 php dtrace_execute_ex entrada de ejecución
10 PHP 9559 PHP dtrace _ ejecutar _ entrada de ejecución interna
11 PHP 9559 PHP dtrace_ejecutar_ex ejecución-retorno
12 PHP 9559 PHP dtrace_ejecutar_ejecución interna-retorno
13 PHP 9559 PHP dtrace_ejecutar_ex función - entrada
14 PHP 9559 PHP dtrace _ ejecutar _ ex función - regresar
15 PHP 9559 PHP _ solicitud _ cerrar solicitud de apagado
16 PHP 9559 PHP_request_startup solicitud para iniciar
p>17 PHP 9559 OCI 8. so PHP_OCI_dtrace_check_connection OCI 8-check-connection
18 PHP 9559 OCI 8. so PHP_OCI_do_connect OCI 8-connect-entry
19 PHP 9559 OCI 8. entonces PHP_OCI_persistent_helper OCI 8-connect-expiry
20 PHP 9559 OCI 8. entonces PHP_OCI_do_connect_ex OCI 8-connect-lookup
21 PHP 9559 OCI 8. entonces PHP_OCI_p connect_list_NP_ dtor OCI 8-connect-p-dtor-close
22 PHP 9559 OCI 8. entonces PHP _ OCI _ p conexión _ lista _ NP _ dtor OCI 8-connect-p-dtor-release
23 PHP 9559 OCI 8. entonces PHP_OCI_do_connect OCI 8-connect-return
24 PHP 9559 OCI 8. entonces PHP_OCI_do_connect_ex OCI 8- tipo de conexión
25 PHP 9559 OCI 8. entonces PHP_OCI_error OCI 8-error
26 PHP 9559 OCI 8. entonces PHP_OCI_statement_exec
ute OCI 8-modo de ejecución
27 PHP 9559 OCI 8 . Entonces PHP _ OCI _ create _ spool OCI 8-sess pool-create
28 PHP 9559 OCI 8 . OCI _ create _ session OCI 8-sess pool-stats
29 PHP 9559 OCI 8 , entonces PHP _ OCI _ create _ session OCI 8-sess pool-type
30 PHP 9559 OCI 8.so PHP_OCI_statement_create OCI 8-SQL text
Las sondas principales de PHP se detallan en el manual de PHP. El detector PHP OCI8 se describe a continuación.
En la terminal de usuario, use Ctrl-C para detener el archivo ejecutable php.
$ php
C
$
Descripción general del detector PHP OCI8 2.0 DTrace
Sondas PHP estáticas OCI8 2.0 Se puede dividir en sondas de "usuario" y sondas de "mantenedor". Este último es más útil para que los mantenedores de PHP OCI8 verifiquen la funcionalidad durante el desarrollo de la extensión. Todos los detectores devuelven datos como parámetros. La documentación oficial detalla el detector PHP OCI8 DTrace.
En OCI8 2.0.2, los detectores de usuario incluyen:
OCI 8-connect-entry - iniciado por oci_connect() y oci_new_connect(). Se dispara antes de que se establezca una conexión a la base de datos.
char * nombre de usuario-Nombre de usuario de conexión.
char * cadena de conexión nombrebd-base de datos.
char * charset: el conjunto de caracteres especificado.
Modo de sesión larga: OCI_SYSDBA (0x2), OCI_SYSOPER (0x4) y OCI_CRED_ext (1
int persistente: establecido en si oci_pconnect() se llama 1; de lo contrario, establecido en 0.
exclusivo de intex: se establece en 1 si se llama a oci_new_connect(); de lo contrario, se establece en 0.
OCI 8-connect-return: se activa cuando <. /p>
conexión nula *: la dirección de la estructura de conexión
OCI 8-comprobar-conexión-Iniciar cuando un error de Oracle puede provocar que la conexión falle. conexión void *: la dirección de la estructura de conexión
Int is_open - 0 si errcode o server_status indica que la conexión no es válida y debe volver a crearse
Código de error largo: error de Oracle. número
indicador de biblioteca server_status-Oracle largo sin firmar, que indica si la conexión no es válida. Si is_open es 0 porque el código de error indica que la conexión no es válida, server_status tiene su valor predeterminado de 1. >OCI 8-SQL. text-Inicio al ejecutar oci_parse().
void * conexión-La dirección de la estructura de conexión
Char * sql-El texto de la instrucción SQL ejecutada /p><. p>OCI 8-error-Iniciar cuando ocurre un error de Oracle.
Estado int: Oracle devuelve el estado de la llamada fallida a la biblioteca de Oracle. Por ejemplo, -1 indica el error de OCI de Oracle y 1 indica la información de éxito de OCI de Oracle. Consulte oci.h de Oracle para conocer todas las definiciones.
Código de error largo: número de error de Oracle.
OCI 8-execute-mode: indica el estado de envío de la llamada oci_execute().
conexión nula *: la dirección de la estructura de conexión.
Modo entero sin signo: el modo pasado a la biblioteca de Oracle, como OCI_NO_AUTO_COMMIT (0x00), OCI_DESCRIPTION_UNIQUE (0x10) u OCI_COMMIT_SUCCESS (0x20).
Nota: El último OCI8 2.0.6 incluye la sonda oci8-connection-close, y varias sondas ahora también tienen parámetros client_id y punteros a estructuras de oraciones.
A continuación se muestra el detector de mantenedor. Consulte el código fuente PHP OCI8 para obtener una descripción de los parámetros.
OCI 8-conectar-p-dtor-cerrar
void *connect
OCI 8-conectar-p-dtor-liberar
void *conexión
OCI 8-conexión-buscar
void *conexión
int is_stub
OCI 8-conexión-expire
conexión *void
int is_stub
long idle_expire
marca de tiempo prolongada
OCI 8 - tipo de conexión
int persistente
int exclusivo
void *conexión
long number_persistent
long Número de conexiones\ p>
Creación de grupo de 8 sesiones de OCI
void *session_pool
Estadísticas del grupo de 8 sesiones de OCI
sin firmar, largo y libre
ocupado durante mucho tiempo sin firmar
abierto durante mucho tiempo sin firmar
Tipo de grupo de 8 sesiones OCI
tipo int
void *session_pool p>
La sonda en PHP OCI8 2.0 reemplaza la traza oci_internal_debug() utilizada en PHP OCI8 1.4. Esta función se ha convertido en una instrucción vacía y no hace nada.
Usa PHP OCI8 y DTrace
Realiza los siguientes pasos.
Crea un archivo PHP simple oci8.php para consultar la base de datos:
& lt? Lenguaje de programación del lado del servidor (abreviatura de Preprocesador de hipertexto profesional)
Informe de errores (0
ini_set('display_errors ', ' Off '); Función do_query($c,$sql)
{
$s = oci_parse($c,$SQL);
if (!$) p >
Retorno;
$ r = OCI _ ejecutar($ s);
Si (!$r)
Retorno;
mientras(($ fila = OCI _ fetch _ fila $ s))! = false) {
foreach ($fila como $elemento) {
echo $elemento.
" ";
}
Echo "\n";
}
}
$c = oci_new_connect('hr ', ' bienvenido ', ' localhost/pdborcl ');
do_query($c, "de rownum & lt5 factorial 1");
do_query($ c , "Seleccione algo de Does_not_exist");
? & gt
Cree un script publicitario user_oci8.d para detectar la ejecución de oci8.php:
#!/usr/sbin/dtrace -Zs
# Esto El script es adecuado para OCI8 2.0.2
php*:::oci8-connect-entry
{
printf("PHP Connection-entry\n" );
printf("\tNombre de usuario %s\n ", arg0? copiar instr(arg 0):" ");
printf("\tNombre de base de datos % s\ n ", arg1? copiar instr(arg 1):" ");
printf("\t charset %s\n ", arg2? copiar instr(arg 2):" "); p>
printf("\t session_mode %ld\n ", (long)arg 3
printf("\t persistente %d\n ", (int)arg 4);
printf("\t exclusivo %d\n ", (int)arg 5);
}
php*:::oci8- connect- return
{
printf(" PHP OCI 8-connect-return \ n ");
printf("\tConnect 0x%p\ n ", (void *)arg 0);
}
PHP *:::OCI 8-Conexión-Cerrar
{
printf (" PHP OCI 8-connect-close \ n ");
printf("\tconnect 0x%p\n ", (void *)arg 0); /p>
PHP *:::OCI 8-error
{
printf(" PHP OCI 8-error \ n ");
printf("\t estado %d\n ", (int)arg 0);
printf("\t errorcode %ld\n ", (long)arg 1);
}
PHP *:::OCI 8-comprobar-conexión
{
printf(" PHP OCI 8-comprobar-conexión \ n ") ;
printf("\tConexión 0x%p\n ", (void *)arg 0);
printf("\t is_open %d\n ", arg 1) ;
printf("\t errorcode %ld\n ", (largo)arg 2);
printf("\t server_status %lu\n ", (sin firmar largo) arg 3);
}
php*:::oci8-sqltext
{
printf(" PHP OCI 8-SQL texto \n ");<
/p>
printf("\tconexión 0x%p\n ", (void *)arg 0);
printf("\t sql %s\n ", arg0? copiar instr ( arg 1):" ");
}
php*:::oci8-execute-mode
{
printf ( " PHP OCI 8-modo de ejecución \ n ");
printf("\tConnection 0x%p\n ", (void *)arg 0); \tMode 0x%x\n ", arg 1);
}
Utilizando OCI8 2.0.6, los valores de algunos parámetros deben ajustarse para cumplir con los requisitos de Se necesitan algunos parámetros nuevos.
Inicie el script d como usuario root. El script se detendrá hasta que se active el detector:
# chmod +x user_oci8.d
# ./user_oci8.d
(Después de experimentar PHP, puede Utilice Ctrl-C para cerrar esta terminal. )
Ejecute la línea de comando PHP en otra ventana.
Mostrar entrada para una consulta exitosa:
$ PHP oci8.php
Pekín
Berna
El nombre original de MUMBAI
Ginebra
En el terminal raíz que ejecuta el script d, se mostrarán las sondas activadas durante la ejecución de PHP:
# ./user_oci8.d
dtrace :Script "user_oci8.d" coincidió con 0 sondas
Función de ID de CPU:nombre
1 18 PHP_OCI_do_connect:OCI 8-connect-entry
p>Nombre de usuario hr
dbname localhost/pdborcl
Conjunto de caracteres
Modo de sesión 0
Persistente 0
Exclusivo 0
0 23 PHP_OCI_do_conectar:OCI 8-conectar-retorno PHP OCI 8-conectar-retorno
Conectar 0x7f64e112cff0
0 31 PHP_OCI _ declaración _ crear:Texto OCI 8-SQL PHP Texto OCI 8-SQL
Conexión 0x7f64e112cff0
SQL ordenado por 1 desde rownum & lt5
0 27 PHP _ OCI _ declaración _ ejecutar: OCI 8-modo de ejecución PHP OCI 8-modo de ejecución
Conexión 0x7f64e112cff0
Modo 0x20
0 31 PHP _ OCI _ declaración _ crear:Texto OCI 8-SQL Texto PHP OCI 8-SQL
Conexión 0x7f64e112cff0
sql selecciona algo de lo que no existe
0 27 Declaración PHP _ OCI _ _ ejecutar:OCI 8-modo de ejecución PHP OCI 8-modo de ejecución
Conexión 0x7f64e112cff0
Modo 0x20
0 26 PHP_OCI_error:OCI 8-Error PHP OCI 8 -Error
Estado-1
Código de error 942
0 17 PHP_OCI_dtrace_ check_connection:OCI 8-check-connect PHP OCI 8-check-connect
Conexión 0x7f64e112cff0
is_open 1
Código de error 942
server_status 1
0 25 PHP _ OCI _ conexión _ cerrar :OCI 8-connection-close PHP OCI 8-connection-close
Conexión 0x7f64e112cff0
(Agregar -q al parámetro /usr/sbin/dtrace de user_oci8.d ocultará el Detalles de CPU e ID. )
En máquinas con varias CPU, es posible que las sondas no aparezcan en orden, dependiendo de qué CPU las esté procesando.
Mostrar la marca de tiempo de la sonda ayudará a eliminar la confusión, por ejemplo:
php*:::oci8-connect-entry
{
printf(" PHP connect - entrada en % lld \n ", marca de tiempo del muro);
}
Desde la salida de user_oci8.d DTrace, puede ver lo siguiente:
Conexión iniciado (oci8-connect-entry). El usuario hr se conecta a la base de datos localhost/pdborcl. Debido a que exclusivo y persistente son ambos 0, esta es una llamada a oci_connect(). No se solicita ningún juego de caracteres explícito. Solicite el modo de sesión predeterminado (el quinto parámetro opcional de oci_connect).
Se analizan dos sentencias SQL (oci8-sqltext) y se ejecutan en modo 0x20 (oci-execute-mode).
Se generó el error de Oracle -ORA-942 (la tabla o vista no existe) (OCI 8-Error).
Este error hace que se verifique el estado de la conexión (oci8-check-connection). El valor de is_open es 1, lo que indica que la conexión es normal.
Con esta información, puede realizar un seguimiento de la ejecución de sentencias problemáticas y de los problemas de conexión.
Resumen
DTrace es una utilidad muy poderosa. Este artículo solo presenta brevemente su uso. Con el ejemplo anterior, el rastreo PHP OCI8 se puede integrar con el rastreo PHP principal. Puede configurar el tiempo de llamada de las funciones PHP y contar el número de llamadas. Puede obtener más información sobre las llamadas al sistema operativo realizadas por PHP. Bryan Cantrill ha publicado algunos ejemplos básicos de seguimiento de PHP en DTrace y PHP (demostración). (Tenga en cuenta que la actualización de la plataforma del blog provocó que una barra invertida apareciera como dos barras invertidas en sus publicaciones de blog. Además, ya no necesita una extensión PHP DTrace separada. El kit de herramientas DTrace de Brendan Gregg contiene muchos scripts DTrace útiles. También hay varios tipos de blog.
Recuerde, DTrace está diseñado para tener su funcionalidad siempre habilitada, adecuada para desarrollo y producción (el proceso donde DTrace es más necesario) para tener cero gastos generales cuando no monitorea los detectores.