Sven Rautenberg: Persistente Verbindung und Funktionsaufrufe

Beitrag lesen

Moin!

ich habe mal eine verständnissfrage zu dem mysql_pconnect() befehl.

Was deutlich darauf hinweist, dass du die Nutzungsweise, Anwendungsgebiete und Gefahren dieses Befehls noch nicht wirklich erfaßt hast.

ich nutze in meinen scripten immer eine db_go() funktion die überall da aufgerufen wird wo ein db request nötig ist und folgendes macht:

Eine ziemlich unperformante Funktion. Üblicherweise stellt man EINMALIG am Skriptstart die Verbindung zur Datenbank her und nutzt diese dann jeweils für Requests.

function db_go(&$sql)
{
  if (!$link)

Da $link eine lokale Variable ist, wird sie bei jedem Funktionsaufruf undefiniert sein, also immer die Verbindung zur Datenbank neu herstellen - unnötiger Aufwand, auch mit pconnect.

{
    $link = mysql_pconnect('localhost', 'user', 'pass');
    $dbname="usr_web1_1";
    mysql_select_db($dbname, $link);
    }
   $result = mysql_query($sql, $link);
  return $result;
}

nun frage ich mich ob der 'vermeintliche' geschwindigkeitsvorteil
den pconnect bei vielen querys in einem script bringen soll so
überhaupt zur geltung kommt...

Du hast den Vorteil von pconnect nicht verstanden. pconnect bringt Vorteile genau dann, wenn VIELE Skripte mit VIELEN gleichzeitigen Aufrufen auf die Datenbank zugreifen sollen.

Die Bedingungen für das Funktionieren von pconnect sind: PHP läuft als Apache-Modul, alle Threads des Apache sind mit Skripten beschäftigt, die schon mit pconnect eine aktive DB-Verbindung hergestellt haben, und die MySQL-Datenbank erlaubt auch tatsächlich so viele Verbindungen zur Zeit.

In allen anderen Fällen (PHP als CGI-Modul, Apache wird nicht komplett oder überwiegend von den pconnect-Skripten benutzt) bringt mysql_pconnect() nahezu keinerlei Vorteil, sondern eher die Gefahr, dass durch immer mehr pconnect die verfügbaren Verbindungen zu MySQL komplett ausgelastet werden, und MySQL dadurch dann für alle anderen Skriptaufrufe unansprechbar wird.

Deshalb: Nutze mysql_pconnect() nur dann, wenn du weißt, dass es a) bei dir möglich ist, b) einen wirklichen Vorteil bringt und c) du dich gegen die mögliche DOS-Attacke des MySQL-Servers abgesichert hast.

In allen anderen Fällen ist mysql_connect() die sinnvollere Alternative.

- Sven Rautenberg

--
"Love your nation - respect the others."