¿Cómo implementar el estilo de llamada al método de la clase Db en thinkphp?
Echemos un vistazo a la descripción del monitoreo en el sitio web oficial: Si activa el modo de depuración de la base de datos, puede monitorear cualquier operación SQL ejecutada en la base de datos. Sin duda, esto nos brinda una gran comodidad para depurar adiciones, eliminaciones, modificaciones y consultas. Al mismo tiempo, también puede optimizar SQL de manera efectiva durante el tiempo de ejecución.
Recordatorio: el monitoreo de la base de datos debe escribirse antes de ejecutar. Declaraciones SQL, porque solo se escucharán las declaraciones SQL después de llamar a Db::listen y no se escucharán las declaraciones anteriores a la llamada.
¡Discutiremos por qué más tarde!
Utilice el siguiente método: 123456Db::listen(function($sql,?$time,?$explain){//?Record SQLecho?$sql.??' ?['.$time. ' s]';//?Ver el volcado de resultados del análisis de rendimiento($explain);});
Muchos amigos se preguntan dónde debería colocarse este método. ¿Por qué no hay ningún efecto después de usarlo? Probablemente se deba a lo que dice el mensaje, ¡así que analicemos brevemente el método!
1. Desde Db::listen(), podemos ver que listening es un método estático en Db, por lo que iremos a la clase db. class Este método no fue encontrado, pero podemos ver la introducción de la clase Connection desde think\db\Connection ¡Estamos en la clase! ¡Encuentra este método! 12345678910/**?*?¿Supervisar la ejecución de SQL? *?@access?public?*?@param?callable?$callback?@access?public?*?@param?callable?$callback?¿Método de devolución de llamada? @return?void?*/public?function?listen($callback){self::$event[]? =?$callback;}
3. /p> p>
4. Ver los siguientes 2 métodos 12345678910111213141516171819202122232425262728293031323334353637383940414243444546/**?*?¿Depuración de base de datos? ¿Registrar SQL actual y analizar el rendimiento? @access?@access?@param?boolean?$start?debug start flag?true?start?false?end?*start?false?end?@param?string?$sql?¿Instrucción SQL que se ejecutará? ¿Dejar en blanco para obtenerlo automáticamente? @return?if(!empty($this->config['debug']))?{//?Habilitar el modo de depuración de la base de datos if($start)?{Debug::remark('queryStartTime',?' time') ;} else?Registra la hora de finalización de la operaciónDebug::remark('queryEndTime',??' time');$runtime?=?Debug::getRangeTime('queryStartTime',??' queryEndTime');$sql? = ?$sql?:?$this->getLastsql();$log?=?$sql?[?RunTime:'?...? $runtime?...?' ? Análisis de rendimiento de SQL if($this->config['sql_explain']?&&?0?===?stripos(trim($sql),?' select'))?{$resultado?=?$this->getExplain ($sql);}//?SQL oyente$this->trigger($sql,? $runtime,? $resultado);}}}?protected?function?trigger($sql,? $runtime,? $explicar? =? []){if?{foreach(self::$evento?como?$devolución de llamada)? {si(is_callable($devolución de llamada))? {call_user_f
unc_array($callback,? [$sql,? $runtime,? $explain]);}}} else? Los oyentes no registrados se registrarán en el registro Log::record('[?SQL?]?' ? .? $ sql?..?' ? [?RunTime:'?..? $tiempo de ejecución?..?' s?]',? (!empty($explicar))?{Registro: :record( '[?EXPLAIN?:?' ?. ?var_export($explain, ?true)?,?');}}
5. Se llamará para escribir el registro de ejecución en el archivo de registro y se llamará al método de activación. Si pasamos el método de devolución de llamada al principio, es decir, 1self::$event
no es un. valor nulo (esto significa que ejecutamos la instrucción SQL antes de configurar el oyente), ¡llamaremos a nuestra función de devolución de llamada! 1call_user_func_array
Resumen: Necesitamos configurar el oyente antes de ejecutar la declaración SQL, por eso escribimos Db::listen() antes de ejecutar la declaración SQL.
La situación real es la siguiente: 1234567891011121314public?function?expo(){Db::listen(function($sql,?$time,?$explain){//?Record SQLecho?$sql. ['. $time.'s]';//? Ver el volcado de resultados del análisis de rendimiento($explain);});// Obtener datos basados en columnas y ejecutar la instrucción SQL foreach($channel?as?$v) $lista[$v[ 'id']]? =?GetData::getData('noticias', "channel_id?=?{$v['id']}?and?status?=?2",'id, título,autor,create_time, canal_id,ruta_archivo','order_by?desc','0,5');return?view('expo',['lista'? =>? $lista]);}
Imagen efectiva: