Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Cada chamada para mysql_real_escape_string requer outra viagem ao banco de dados?


O fato de usar a biblioteca mysql não significa que ele faz uma viagem de ida e volta com o servidor.

Ele executa o código da biblioteca cliente mysql, carregado no mesmo processo que seu interpretador php. Você precisa de uma conexão - essa função precisa conhecer algumas configurações do servidor para operar corretamente. Mas essas configurações são armazenadas em cache nas informações de conexão no lado do PHP.

Se você quiser verificar isso (e estiver no linux), escreva um script simples como:
<?php
$link = mysql_connect('localhost', 'user', 'pass');
echo "Connection done\n";
echo mysql_real_escape_string("this ' is a test");
?>

E execute-o através do 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
....

A única coisa importante é que os dois write s causados ​​pelo echo instruções não têm outra syscall no meio - nenhuma comunicação de rede é possível sem uma syscall (de qualquer maneira, do espaço do usuário no linux).