Lars: (WAMP) - MySQLi läuft nicht, PhpMyAdmin meldet Fehler

Hallo zusammen,

zunächst zum Server: Aufgrund der limitierten Resourcen meines Virtual Servers habe ich den IIS 6.0 deaktiviert und Apache 2.2.6, PHP 5.2.0, MySQL 5.0.51a und PhpMyAdmin 2.11.4 installiert. Alles also zum Großteil aktuelle Versionen.

Nun habe ich in PhpMyAdmin mysqli aktiviert - das stach mir so ins Auge und ich dachte, ich könnte das ja mal aktivieren und wenns läuft meine Scripte anpassen. Aber PHP will mir die Arbeit wohl ersparen: Läuft nicht.

PhpMyAdmin meldet: "Die Erweiterung mysqli kann nicht geladen werden. Bitte überprüfen Sie Ihre PHP-Konfiguration."

Ich hab schon gegoogelt und bin alle Schritte durchgegangen:

1. Hab die neuesten MySQL-Binaries libmysql.dll und php_mysqli.dll von mysql.com heruntergeladen und ins PHP-Verzeichnis bzw. auch ins PHP-ext-Dir kopiert. Die von PHP mitgelieferten Dateien hatten zwar ein neueres Datum... aber damit hatte es ja auch nicht funktioniert, also ist ihr Existenzrecht verwirkt. Jetzt laufen die Binaries von mysql.com.

2. In der php.ini hab ich die Extension php_mysqli.dll aktiviert.

3. Geprüft ob die php.ini auch wirklich von PHP verwendet wird, und nicht irgend eine andere im Windows-Verzeichnis oder so (es wird die richtige verwendet).

4. Den Apache und den MySQL Dienst neu gestartet.

5. Die mysql dll-dateien auch mal nach Windows und Windows\System32 kopiert... wäre aber unnötig gewesen, da das PHP-Verzeichnis auch in den Umgebungsvariablen eingetragen ist. Hat also nix gebracht.

Nun weiß ich nicht mehr weiter... hat noch jemand eine Idee?

Grüße
Lars

  1. echo $begrüßung;

    Ich hab momentan auch keine zündende Idee, nur ein paar kleine Tipps.

    PhpMyAdmin meldet: "Die Erweiterung mysqli kann nicht geladen werden. Bitte überprüfen Sie Ihre PHP-Konfiguration."

    Nimm doch erst einmal ein phpinfo()-Script zum Testen, was alles geladen ist, bzw. zum Nachsehen, ob mysqli geladen wurde.

    1. Geprüft ob die php.ini auch wirklich von PHP verwendet wird, und nicht irgend eine andere im Windows-Verzeichnis oder so (es wird die richtige verwendet).

    Welche php.ini-Datei und welche zusätzlichen Dateien verwendet werden, zeigt phpinfo() im oberen Bereich an.

    1. Die mysql dll-dateien auch mal nach Windows und Windows\System32 kopiert... wäre aber unnötig gewesen, da das PHP-Verzeichnis auch in den Umgebungsvariablen eingetragen ist. Hat also nix gebracht.

    Weiß denn der Apache auch von dem Pfad? Das kann phpinfo() im unteren Bereich beantworten, $_SERVER["Path"]. Wenn der Apache als Dienst läuft, gelten vielleicht andere Einstellungen als für den Start unter deinem angemeldeten Nutzer.

    1. Den Apache und den MySQL Dienst neu gestartet.

    Gegebenenfalls muss für den geänderten Path der Rechner neu gestartet werden, sonst ist er vielleicht nicht an allen Stellen verfügbar, an denen er gebraucht wird.

    Weitere Stellen, die eventuell noch Informationen hergeben können, wären die üblichen Apache-Logs und der Event Viewer (z.B: eventvwr über Start->Ausführen)

    echo "$verabschiedung $name";

    1. Hallo,

      Nimm doch erst einmal ein phpinfo()-Script zum Testen, was alles geladen ist, bzw. zum Nachsehen, ob mysqli geladen wurde.

      Nein, die wurde nicht geladen.

      Welche php.ini-Datei und welche zusätzlichen Dateien verwendet werden, zeigt phpinfo() im oberen Bereich an.

      Genau. Es gibt nur eine php.ini, die befindet sich im PHP-Installationsverzeichnis (bei mir:  C:\Web\Software\PHP). Die wird laut phpinfo() auch verwendet.

      Weiß denn der Apache auch von dem Pfad? Das kann phpinfo() im unteren Bereich beantworten, $_SERVER["Path"]. Wenn der Apache als Dienst läuft, gelten vielleicht andere Einstellungen als für den Start unter deinem angemeldeten Nutzer.

      Ich greife ja nur per Remote-Desktop auf den Server zu, mit dem Administrator-Konto. Jedenfalls verwende ich das Konto zum Konfigurieren. Ich habe grad mal nachgeschaut:

      Im Abschnitt "Apache Environment" gibt es einmal die Angabe PATH. Dort steht mein PHP-Verzeichnis auch drin. Dann gibt es noch einmal weiter unten den Abschnitt "Environment", dort ist die von dir beschriebene Angabe _SERVER["PATH"]. Auch dort steht das PHP-Verzeichnis drin.

      Gegebenenfalls muss für den geänderten Path der Rechner neu gestartet werden, sonst ist er vielleicht nicht an allen Stellen verfügbar, an denen er gebraucht wird.

      Ja, das hab gleich relativ zu Beginn gemacht. Als geübter Windows-Nutzer ist das ja so ziemlich das erste, was einem einfällt... ;-)

      Weitere Stellen, die eventuell noch Informationen hergeben können, wären die üblichen Apache-Logs und der Event Viewer (z.B: eventvwr über Start->Ausführen)

      Im Event Viewer waren viele Errors drin, die hingen mit einer InnoDB-Datenbank zusammen. Die wurde von meinem Mailserver eingerichtet, der komplett MySQL-basiert ist, und dem seine Tabellen scheinen alle irgendwie ein Problem zu haben (incorrect information in file datenbank/table.frm). Aber dass das jetzt mit mysqli zusammen hängt, bezweifle ich mal stark, auch wenn ich mich darum noch kümmern werde.

      Also vielen Dank erstmal für deine Hinweise! Das Problem bleibt leider... ist schon merkwürdig. Vielleicht hat ja noch jemand eine Idee?

      Grüße
      Lars

  2. Hallo,

    nun hab ich zum Schluss ganz vergessen, die Meldung aus der error.log des Apache zu kopieren:

    PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\Web\Software\PHP\ext\php_mysqli.dll' - The specified procedure could not be found.\r\n in Unknown on line 0

    Das ist sie - also eindeutig ein Fehler. Die Datei existiert aber, das ist die Version, die bei PHP 5.2.5 dabei war (hab zwischendurch PHP mal aktualisiert, weil ich nicht weiter wusste)... *grübel*

    Grüße
    Lars

    1. echo $begrüßung;

      PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\Web\Software\PHP\ext\php_mysqli.dll' - The specified procedure could not be found.\r\n in Unknown on line 0

      Diese Meldung kommt nicht nur, wenn eine php_*.dll nicht geladen werden kann, sie kommt auch, wenn diese DLL-Datei weitere DLLs nachladen will aber nicht findet. Nimm dir mal das "zip package", da sind einige DLL-Dateien im Hauptverzeichnis. Irgendeine davon fehlt bestimmt in deinem PHP-Verzeichnis (die php5apache*.dll und php5*api.dll kannst du ignorieren, bzw. da sollte schon die passende vorhanden sein).

      Es gibt bestimmt irgendein Tool, das DLL-Ladevorgänge (oder Dateiöffnungsvorgänge im Allgemeinen) überwachen kann, und dir genau sagen kann, auf was da zuzugreifen versucht wird.

      echo "$verabschiedung $name";

      1. Hey,

        Diese Meldung kommt nicht nur, wenn eine php_*.dll nicht geladen werden kann, sie kommt auch, wenn diese DLL-Datei weitere DLLs nachladen will aber nicht findet.

        Hmmm...

        Nimm dir mal das "zip package", da sind einige DLL-Dateien im Hauptverzeichnis. Irgendeine davon fehlt bestimmt in deinem PHP-Verzeichnis (die php5apache*.dll und php5*api.dll kannst du ignorieren, bzw. da sollte schon die passende vorhanden sein).

        Ja, das Zip-Package hatte ich ja auch verwendet. Hab eben nochmal alle aus dem Zip-Package über meine jetzigen drüber kopiert, aber hat nichts gebracht.

        Es gibt bestimmt irgendein Tool, das DLL-Ladevorgänge (oder Dateiöffnungsvorgänge im Allgemeinen) überwachen kann, und dir genau sagen kann, auf was da zuzugreifen versucht wird.

        Danach werd ich mal suchen, vielleicht bringts ja Licht ins Dunkel! :D

        Grüße
        Lars

      2. Hi,

        PHP Warning:  PHP Startup: Unable to load dynamic library 'C:\Web\Software\PHP\ext\php_mysqli.dll' - The specified procedure could not be found.\r\n in Unknown on line 0

        Diese Meldung kommt nicht nur, wenn eine php_*.dll nicht geladen werden kann, sie kommt auch, wenn diese DLL-Datei weitere DLLs nachladen will aber nicht findet.

        Und auch dann, wenn die vorliegende DLL-Version nicht zur PHP-Version bzw. API "passt".

        MfG ChrisB

        1. Und auch dann, wenn die vorliegende DLL-Version nicht zur PHP-Version bzw. API "passt".

          Was muss denn da passen? Muss das zur verwendeten MySQL Version passen, also kann es sein dass es Probleme gibt, weil ich Version 5.0.52a verwende?

          Oder muss das nur für PHP passen? Dann reicht ja die integrierte DLL, die im Zip-Package von PHP 5.2.5 dabei ist.

          Grüße
          Lars

          1. echo $begrüßung;

            Und auch dann, wenn die vorliegende DLL-Version nicht zur PHP-Version bzw. API "passt".
            Was muss denn da passen? Muss das zur verwendeten MySQL Version passen, also kann es sein dass es Probleme gibt, weil ich Version 5.0.52a verwende?

            Nein, die Version des MySQL-Servers spielt nur eine untergeordnete Rolle, wenn überhaupt eine. Es muss ja von PHP aus prinzipiell möglich sein, sich (gleichzeitig) mit verschiedenen Servern unterschiedlicher Versionsstände zu verbinden, ohne dass man dazu spezielle PHP-Instanzen verwenden muss.

            Oder muss das nur für PHP passen? Dann reicht ja die integrierte DLL, die im Zip-Package von PHP 5.2.5 dabei ist.

            Die zusätzlichen DLLs müssen nur zur PHP-Version passen.

            Du kannst ja mal einen neuen Versuch starten: Nimm das Zip Package und pack es in einem neuen Ordner aus. Pass die php.ini in diesem Verzeichnis an (kopieren von der php.ini-recommended; extension_dir und mysql(i)-extension einstellen sowie display_errors und display_startup_errors auf On). Erstelle eine phpinfo()-Datei und ruf die mit der php.exe auf. Beim zweiten Versuch lenk die Ausgabe in eine Datei um, die du dir dann mit einem Texteditor oder Browser ansehen kannst. Dieser Versuch müsste eigentlich problemlos eine eingebundene mysql(i)-Extension anzeigen.

            echo "$verabschiedung $name";

            1. Hallo zusammen,

              jetzt hab ich es - und zwar durch reinen Zufall entdeckt, als ich eigentlich wegen einem anderen Problem auf Suche war:

              Das Windows ist ein 64 Bit Windows - das hatte ich so hier nicht geschrieben, aber ich denke bei Windows Server 2003 geht man in den meisten Fällen davon aus.

              Wie auch immer: Dort gibt es einen Ordner Windows\SysWOW64 - und darin hab ich noch eine libmysql.dll entdeckt. Die war datiert auf Juni 2006 und etwa 900KB kleiner als die von PHP mitgelieferte. Ich konnte sie auch nicht umbenennen - sie war also in Verwendung. Nachdem ich den Apachen und MySQL-Dienste beendet hab, konnt ich sie umbenennen und die passende libmysql.dll aus dem PHP-Verzeichnis ins SysWOW64-Verzeichnis kopieren.

              Und es geht :D

              Ich weiß gar nicht, wieso die Datei bei meinem ersten Suchvorgang nicht entdeckt wurde... ob da vielleicht Systemdateien noch ausgeblendet wurden, oder ob ich sie einfach übersehen habe? Keine Ahnung - aber als ich heute nochmal auf dem gesamten System nach *mysql*.dll gesucht habe, wurde sie gefunden.

              Also vielen Dank für eure Bemühungen - schön, dass es doch noch geklappt hat.

              Grüße
              Lars

  3. Hallo,

    leider reichen meine PHP/MySQL-Kenntnisse nicht so weit, dass ich folgende Frage beantworten könnte:

    Wenn man sich mein Problem anschaut, und auch die Error-Meldung des Apache-Servers berücksichtigt (C:\Web\Software\PHP\ext\php_mysqli.dll - The specified procedure could not be found.\r\n in Unknown on line 0)...

    Liegt der Fehler eher an PHP oder eher an MySQL? Könnte es helfen, wenn ich statt der aktuellen Version 5.0.51a vielleicht eine ältere probiere... 5.0.45 vielleicht? Vielleicht gibt es irgend einen Versionskonflikt...?

    Grüße
    Lars

    1. Hi Lars,

      Liegt der Fehler eher an PHP oder eher an MySQL? Könnte es helfen, wenn ich statt der aktuellen Version 5.0.51a vielleicht eine ältere probiere... 5.0.45 vielleicht? Vielleicht gibt es irgend einen Versionskonflikt...?

      Weder noch, wie dir hier ja bereits gesagt wurde - es liegt ganz einfach daran, dass eine benötigte DLL nicht gefunden wurde, und zwar (wie dedlfix) sagte, nicht zwangsläufig die in der Fehlermeldung genannte DLL, sondern irgendeine weitere DLL. (Sofern der Pfad zur benannten DLL korrekt ist, was du ja gesagt hast.)

      Zuerst mal lädst du dir bitte PHP noch mal neu von php.net herunter, nachdem du bereits verschiedene Dateien von php.net und mysql.com heruntergeladen und beliebig zusammen gemixt hast, kann man nicht mehr so genau sagen, ob die in dieser Kombination funktionsfähig sind. Hingegen sollte es mit den DLLs, welche du beim Download von PHP bekommst problemlos funktionieren.

      Als nächstes wäre die Konfiguration deines Apaches interessant - bindest du Apache als Modul ein? Dann müsstest du die libmysql.dll (und eventuell auch noch libeay32.dll und ssleay32.dll) aus dem PHP-Ordner in den „bin”-Ordner deines Apache kopieren. Bei einer Verwendung von PHP über CGI müsste meines Wissens der Pfad zu den DLLs in der PATH-Umgebungsvariable enthalten sein.

      Viele Grüße,
        ~ Dennis.

    2. Yerf!

      Wenn man sich mein Problem anschaut, und auch die Error-Meldung des Apache-Servers berücksichtigt (C:\Web\Software\PHP\ext\php_mysqli.dll - The specified procedure could not be found.\r\n in Unknown on line 0)...

      Geh doch mal mit dem DependencyWalker auf die DLL los, evtl. sieht man dann, was fehlt.

      Gruß,

      Harlequin

      --
      <!--[if IE]>This page is best viewed with a webbrowser. Get one today!<![endif]-->