sql >> Base de Datos >  >> RDS >> Mysql

¿Cada llamada a mysql_real_escape_string requiere otro viaje a la base de datos?

El hecho de que utilice la biblioteca mysql no significa que hace un viaje de ida y vuelta con el servidor.

Ejecuta el código de la biblioteca del cliente mysql, cargado en el mismo proceso que su intérprete de php. Sin embargo, necesita una conexión:esa función necesita conocer algunas configuraciones del servidor para funcionar correctamente. Pero esas configuraciones se almacenan en caché en la información de conexión en el lado de PHP.

Si desea verificar esto (y está en Linux), escriba un script simple como:

<?php
$link = mysql_connect('localhost', 'user', 'pass');
echo "Connection done\n";
echo mysql_real_escape_string("this ' is a test");
?>

Y ejecútalo a través de strace :

$ strace php t.php
....            # here comes the connection to mysql, socket fd == 3
connect(3, {sa_family=AF_FILE, path="/var/run/mysqld/mysqld.sock"}, 110) = 0
fcntl(3, F_SETFL, O_RDWR)               = 0
setsockopt(3, SOL_SOCKET, SO_RCVTIMEO, "\2003\341\1\0\0\0\0\0\0\0\0\0\0\0\0", 16) = 0
....            # talking with mysql here
poll([{fd=3, events=POLLIN}], 1, 60000) = 1 ([{fd=3, revents=POLLIN}])
read(3, "8\0\0\0\n5.1.58-log\0\3\0\0\0K-?4'fL+\0\377\367!"..., 16384) = 60
...
read(3, "\7\0\0\2\0\0\0\2\0\0\0", 16384) = 11
                # first php echo
write(1, "Connection done\n", 16Connection done    )       = 16
                # second php echo
write(1, "this \\' is a test", 17this \' is a test)      = 17
munmap(0x7f62e187a000, 528384)          = 0
....

Lo único importante ahí es que los dos write s causados ​​por el echo Las declaraciones no tienen otra llamada al sistema en el medio:no es posible la comunicación de red sin una llamada al sistema (desde el espacio de usuario en Linux de todos modos).