Oracle mit PHP verwenden
Kommentare

Richtig verbunden: Um aus PHP heraus eine Verbindung zu Oracle zu öffnen, gibt es drei Möglichkeiten. Wir können eine Standardverbindung, eine unabhängige oder eine persistente Verbindung öffnen. Wie beim Connection Pooling bereits erläutert, wird beim Aufbau einer einfachen Verbindung zuerst ein neuer Prozess gestartet und eine Authentifizierung durchgeführt, nach Skriptende oder durch explizites Beenden der Verbindung wird der Prozess wieder zerstört.

Wenn ich an einer anderen Stelle im Skript erneut eine Verbindung mit denselben Daten aufbauen möchte, wird ein Zeiger auf die bereits offene Verbindung zurückgegeben. Es handelt sich hier also um ein Singleton. In PHP erfolgt ein einfacher Verbindungsaufbau durch den Befehl oci_connect($username, $passwort, $db). Für den Fall, dass man eine weitere Verbindung mit den gleichen Zugangsdaten benötigt, diese aber unabhängig von der bereits geöffneten Verbindung sein soll, kann man das mit folgendem Befehl bewerkstelligen: oci_new_connect($username, $passwort, $db). Da einfache Verbindungen, wie bereits erwähnt, bei wiederholten Verbindungen nicht performant sind, sollte man in diesem Fall auf persistente Verbindungen bauen, die nach Skriptende nicht automatisch geschlossen, sondern in einem Cache vorgehalten werden: oci_connect($username, $passwort, $db).

In den oben genannten Beispielen sind die Parameter $username und $passwort selbsterklärend. $db bedarf gerade bei Oracle jedoch weiterer Erklärungen, da es hier vielfältige Varianten gibt. $db kann als Easy Connect String, als Connect Descriptor String oder als Connect Name angegeben werden. Ein Easy Connect kann verwendet werden, wenn Oracle und PHP auf dem gleichen System laufen, und wird nach folgendem Schema aufgebaut: [//]host_name[:port][/service_name][:server_type][/instance_name]. In der Standardinstallation von Oracle wäre das //localhost:1521/ORCL:DEDICATED/ORCL. Da hier Standard-Port und -servername verwendet werden und der Instanzname dem Servicenamen entspricht, kann der Connect String vereinfacht werden: localhost/ORCL. Kommt ein Easy Connect nicht in Frage, kann die Datenbank mittels Connect Descriptor String angegeben werden:
(DESCRIPTION= 
(ADDRESS=(PROTOCOL=TCP)(HOST=)(PORT=))
  (CONNECT_DATA=
    (SERVER = )
    (SERVICE_NAME=))
In der Standardinstallation von Oracle wäre das:
$tns = '(DESCRIPTION =
        (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
          (CONNECT_DATA =
            (SERVER = DEDICATED)
            (SERVICE_NAME = ORCL)))';
Will man es sich besonders einfach machen, kann man die Datenbank mittels Connect Name angeben, was aber unter Umständen einige Vorarbeit erfordert. Die Vorarbeit besteht daraus, den Connector String in einer Datei namens tnsnames.ora zu speichern. Diese Datei findet man unter $ORACLE_HOME/NETWORK/ADMIN/tnsnames.ora. Ist PHP nicht auf dem gleichen System wie Oracle installiert ist, sondern greift z. B. über den Instant Client auf Oracle zu, müssen wir diese Datei unter Umständen neu erstellen. Egal, wie tnsnames.ora auf das System gekommen ist, PHP muss in der Lage sein, diese Datei zu finden, um den Connect Namen auflösen zu können. Ist die Datei verfügbar, können wir dort den Conector String eingeben und einen Namen vergeben:
FOOBAR =
  (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    (CONNECT_DATA =
      (SERVER = DEDICATED)
      (SERVICE_NAME = orcl)))
Nun können wir ganz problemlos mit oci_pconnect($username, $passwort, 'FOOBAR'); auf die Datenbank zugreifen. Ich persönlich ziehe diese Methode, wenn möglich, den anderen Methoden vor. Man spart sich Tipparbeit, verringert die Fehleranfälligkeit und hat den enormen Vorteil, dass man bei Änderungen am Datenbanksystem lediglich die tnsnames.ora anpassen muss, anstatt in allen Applikationen, die möglicherweise auf diese Datenbank zugreifen, die Parameter händisch anzupassen. Am Ende jedes Skripts werden mit oci_connect() oder oci_new_connect() geöffnete Verbindungen automatisch geschlossen, können aber auch explizit durch den Aufruf von oci_close() beendet werden. In beiden Fällen werden Transaktionen, die nicht committet wurden, zurückgesetzt; ein Rollback erfolgt auch bei persistenten Verbindungen am Ende eines Skripts. Weiter mit: Teil 5 Alle Teile: Teil 1, Teil 2, Teil 3, Teil 4, Teil 5, Teil 6
Unsere Redaktion empfiehlt:

Relevante Beiträge

Meinungen zu diesem Beitrag

X
- Gib Deinen Standort ein -
- or -