Slaughter: Installation OCI8 unter Internet Information Server 6.0

Hallo,

ich soll eine bestehende Webanwendung auf meinen Webserver übernehmen. Die Anwendung ist komplett in PHP geschrieben und verbindet sich in der alten Umgebung über OCI8 mit einer ORACLE Datenbank.

Der neue Server ist eine Windows 2003 Server mit einer Internet Information Server 6.0 Installation.

Ich habe den IIS soweit konfiguriert, dass PHP 5.2.8. läuft. Allerdings bekomme ich das OCI8 nicht eingerichtet. Ich habe mir den Oracle Instant Client heruntergeladen(aktuellste Version).

Da ich ein Anfänger bin, was PHP angeht, hoffe ich, dass jemand mir hier helfen kann, dass ich die Konfiguration hinbekomme.

Danke im Voraus

Slaughter

  1. echo $begrüßung;

    Allerdings bekomme ich das OCI8 nicht eingerichtet.

    Es wäre für Hilfeleistungen extrem hilfreich, das Problem genau geschildert zu bekommen. Ein "funktioniert nicht" kann man mit allen möglichen nicht zielführenden Antworten beantworten.

    Ich habe mir den Oracle Instant Client heruntergeladen(aktuellste Version).

    Und weiter? Installiert und konfiguriert oder nach dem Download gleich wieder gelöscht?

    echo "$verabschiedung $name";

    1. Hallo,

      ich kann leider nicht genau sagen, was das Problem ist, da mir die Erfahrung mit PHP fehlt.

      Es wäre für Hilfeleistungen extrem hilfreich, das Problem genau geschildert zu bekommen. Ein "funktioniert nicht" kann man mit allen möglichen nicht zielführenden Antworten beantworten.

      Fange wir mal von vorne an, bei dem, was mir bekannt ist:
      Wenn ich die PHPInfo() aufrufe, bekomme ich in bei "Configure Command" unter anderem die Option: "--with-oci8=D:\php-sdk\oracle\instantclient10\sdk,shared" angezeigt. Ich vermute, dass bedeutet, dass ein entsprechender Pfad vorhanden sein muss, in welchem sich die dlls aus dem Oracle Instant Client liegen müssen.

      Kann ich diesen Pfad auch konfigurieren, oder bedeutet dies, dass PHP.exe mit dieser Einstellung kompiliert ist und nicht veränderbar ist?

      Und weiter? Installiert und konfiguriert oder nach dem Download gleich wieder gelöscht?

      Die dlls des aktuellsten Oracle Instant Client habe ich in das o.g. Verzeichnis kopiert.

      IM PHP Logfile bekomme ich diese Fehlermeldungen:
      [19-Jan-2009 11:19:19] PHP Warning:  PHP Startup: Unable to load dynamic library 'D:\PHP\ext\php_oci8.dll' - Die angegebene Prozedur wurde nicht gefunden.

      in Unknown on line 0

      [19-Jan-2009 11:19:19] PHP Warning:  PHP Startup: Unable to load dynamic library 'D:\PHP\ext\php_pdo_oci.dll' - Die angegebene Prozedur wurde nicht gefunden.

      in Unknown on line 0

      [19-Jan-2009 11:19:19] PHP Warning:  PHP Startup: Unable to load dynamic library 'D:\PHP\ext\php_pdo_oci8.dll' - Die angegebene Prozedur wurde nicht gefunden.

      in Unknown on line 0

      Obwohl dort die dlls vorhanden sind.

      Ich habe noch den Oracle Client 9.2 installiert und eine funktionsfähig NET8 Verbindung zur Datenbank aufgebaut.

      Mehr kann ich leider nicht beisteuern, um dem Problem auf die Schliche zu kommen.

      Ich hoffe es gibt noch ein paar Ideen, die mir weiterhelfen.

      Gruß

      Slaughter

      1. echo $begrüßung;

        [19-Jan-2009 11:19:19] PHP Warning:  PHP Startup: Unable to load dynamic library 'D:\PHP\ext\php_oci8.dll' - Die angegebene Prozedur wurde nicht gefunden.

        Wenn eine DLL-Datei nicht geladen werden kann, kann die Ursache auch sein, dass von dieser DLL benötigte DLLs nicht gefunden oder geladen werden konnten. Es gibt Tools, mit denen man sich anzeigen lassen kann, was eine DLL noch benötigt. Einfacherweise reicht ein (Hex)Editor und eine Suche nach ".dll". Sorge dafür, dass diese nachzuladenden Dateien im Pfad liegen. Das tun sie dann auf alle Fälle, wenn sie im Verzeichnis der php.exe oder im windows\system32-Verzeichnis liegen.

        echo "$verabschiedung $name";

        1. Hallo,

          Wenn eine DLL-Datei nicht geladen werden kann, kann die Ursache auch sein, dass von dieser DLL benötigte DLLs nicht gefunden oder geladen werden konnten. Es gibt Tools, mit denen man sich anzeigen lassen kann, was eine DLL noch benötigt. Einfacherweise reicht ein (Hex)Editor und eine Suche nach ".dll". Sorge dafür, dass diese nachzuladenden Dateien im Pfad liegen. Das tun sie dann auf alle Fälle, wenn sie im Verzeichnis der php.exe oder im windows\system32-Verzeichnis liegen.

          Ich habe nun die drei DLLs

          • php_oci8.dll
          • php_pdo_oci.dll
          • php_pdo_oci8.dll
            direkt ins Verzeichnis D:\PHP kopiert, wo auch die php.exe liegt.

          Ich habe jetzt die folgende Fehlermeldung erhalten.
          [19-Jan-2009 16:30:21] PHP Warning:  oci_error() [<a href='function.oci-error'>function.oci-error</a>]: OCIError: unable to find error handle in D:\TestPHP\test.php on line 23

          Ich habe diesen Code verwendet:

            
           $conn = @OCILogon("xxx", "xxx", "//10.1.1.1:1521/sid");  
           if (!$conn) {  
            print "Verbindung: $conn";  
            $e = oci_error();  
            print htmlentities($e['message']);  
            exit;  
           }  
           else  
           {  
            print "<p>Verbindung hergestellt</p>";  
           }  
          
          

          Gruß

          Slaughter

          1. Hallo,

            hier noch ein paar Infos aus der phpinfo():

              
            <h2><a name="module_oci8">oci8</a></h2>  
            <table border="0" cellpadding="3" width="600">  
            <tr><td class="e">OCI8 Support </td><td class="v">enabled </td></tr>  
            <tr><td class="e">Version </td><td class="v">1.2.5 </td></tr>  
            <tr><td class="e">Revision </td><td class="v">$Revision: 1.269.2.16.2.43 $ </td></tr>  
            <tr><td class="e">Active Persistent Connections </td><td class="v">0 </td></tr>  
            <tr><td class="e">Active Connections </td><td class="v">0 </td></tr>  
            <tr><td class="e">Temporary Lob support </td><td class="v">enabled </td></tr>  
            <tr><td class="e">Collections support </td><td class="v">enabled </td></tr>  
            </table><br />  
            <table border="0" cellpadding="3" width="600">  
            <tr class="h"><th>Directive</th><th>Local Value</th><th>Master Value</th></tr>  
            <tr><td class="e">oci8.default_prefetch</td><td class="v">10</td><td class="v">10</td></tr>  
            <tr><td class="e">oci8.max_persistent</td><td class="v">-1</td><td class="v">-1</td></tr>  
            <tr><td class="e">oci8.old_oci_close_semantics</td><td class="v">0</td><td class="v">0</td></tr>  
            <tr><td class="e">oci8.persistent_timeout</td><td class="v">-1</td><td class="v">-1</td></tr>  
            <tr><td class="e">oci8.ping_interval</td><td class="v">60</td><td class="v">60</td></tr>  
            <tr><td class="e">oci8.privileged_connect</td><td class="v">Off</td><td class="v">Off</td></tr>  
            <tr><td class="e">oci8.statement_cache_size</td><td class="v">20</td><td class="v">20</td></tr>  
            </table>  
              
            
            

            Gruß

            Slaughter

          2. echo $begrüßung;

            Ich habe nun die drei DLLs

            • php_oci8.dll
            • php_pdo_oci.dll
            • php_pdo_oci8.dll
              direkt ins Verzeichnis D:\PHP kopiert, wo auch die php.exe liegt.

            Wenn damit die ursprünglich Meldung weg ist, scheint mir dein extension_dir nicht richtig konfiguriert zu sein.

            [19-Jan-2009 16:30:21] PHP Warning:  oci_error() [<a href='function.oci-error'>function.oci-error</a>]: OCIError: unable to find error handle in D:\TestPHP\test.php on line 23

            Ist das die Ausgabe des Rückgabewerts von oci_error()? Wenn nicht, solltest du zur Fehlersuche

            $conn = @OCILogon("xxx", "xxx", "//10.1.1.1:1521/sid");

            keine Meldungen unterdrücken. Zur Meldung kann ich nichts weiter sagen. Versuch es mit einer Suche nach dem releventen Teil der Meldung.

            echo "$verabschiedung $name";

            1. Hallo,

              Wenn damit die ursprünglich Meldung weg ist, scheint mir dein extension_dir nicht richtig konfiguriert zu sein.

              In der PHP.ini steht:
               extension_dir ="D:\PHP\ext"
              darin liegen ebenfalls die drei DLLS, sollte also richtig konfiguriert sein.

              [19-Jan-2009 16:30:21] PHP Warning:  oci_error() [<a href='function.oci-error'>function.oci-error</a>]: OCIError: unable to find error handle in D:\TestPHP\test.php on line 23

              Ist das die Ausgabe des Rückgabewerts von oci_error()? Wenn nicht, solltest du zur Fehlersuche

              $conn = @OCILogon("xxx", "xxx", "//10.1.1.1:1521/sid");

              keine Meldungen unterdrücken.

              Wie kann ich dafür sorgen, dass keine Meldungen unterdrückt werden?

              Gruß

              Slaughter

              1. echo $begrüßung;

                $conn = @OCILogon("xxx", "xxx", "//10.1.1.1:1521/sid");
                Wie kann ich dafür sorgen, dass keine Meldungen unterdrückt werden?

                Indem du den Meldungsunterdrückungsoperator @ weglässt.

                echo "$verabschiedung $name";

                1. Hallo,

                  Indem du den Meldungsunterdrückungsoperator @ weglässt.

                  jetzt bekomme ich diese Meldung zusätzlich zur o.g.:
                  [20-Jan-2009 10:24:41] PHP Warning:  ocilogon() [<a href='function.ocilogon'>function.ocilogon</a>]: OCIEnvNlsCreate() failed. There is something wrong with your system - please check that PATH includes the directory with Oracle Instant Client libraries in D:...\test.php on line 27

                  Ich setze am Anfang des Scriptes den Pfad um und bekomme in $retval auch ein "0" zurück, also gehe ich davon aus, dass es klappt. Ich kann den Pfad leider nicht global setzen, da ich noch Oracle 9.2 installiert habe.

                    
                  $last_line = system('set PATH="D:\PHP\instantclient_11_1;%PATH%"', retval);  
                    
                  PutEnv("ORACLE_HOME=D:\PHP\instantclient_11_1");  
                  PutEnv("TNS_ADMIN=D:\PHP\instantclient_11_1");  
                  PutEnv("NLS_LANG=german_germany.WE8ISO8859P1");  
                  
                  

                  Muss ich eventuell noch andere Parameter setzen?

                  Um nochmal auf die DLLs zurückzukommen: Kann es eventuell ein Berechtigungsproblem sein, warum die DLLs in D:\PHP\ext nicht gefunden werden?

                  Gruß

                  Slaughter

                  1. echo $begrüßung;

                    Ich setze am Anfang des Scriptes den Pfad um und bekomme in $retval auch ein "0" zurück, also gehe ich davon aus, dass es klappt.

                    Der dürfte sich nur für den einen system()-Aufruf geändert haben. Die Umgebung des laufenden Programms dürfte sich damit nicht ändern. Aber das solltest du nachprüfen.

                    $last_line = system('set PATH="D:\PHP\instantclient_11_1;%PATH%"', retval);
                    PutEnv("ORACLE_HOME=D:\PHP\instantclient_11_1");

                    Warum nimmst du nicht auch putenv() für den PATH? Das liest sich doch so, als ob das den Server auch beeinflusst. Kontrollieren und den alten PATH-Wert holen geht mit getenv().

                    Muss ich eventuell noch andere Parameter setzen?

                    Keine Ahnung. Ich müsste auch googlen. Gibts nicht bei Oracle eine Anleitung?

                    Um nochmal auf die DLLs zurückzukommen: Kann es eventuell ein Berechtigungsproblem sein, warum die DLLs in D:\PHP\ext nicht gefunden werden?

                    Da kann ich nur mit "ja" antworten. Nachsehen, ob es ein ist, musst du schon selbst.

                    echo "$verabschiedung $name";