PHP 7.xx: fbclient.dll bzw. gds32.dll wird nicht installiert.

Forum für Fragen rund um Firebird-Software von Drittanbietern.

Moderator: martin.koeditz

Hamburgo
Beiträge: 125
Registriert: Di 28. Mai 2019, 17:28

Hallo zusammen,

am Wochenende habe ich mir einen Test-Web-Server für PHP-7.xx und FireBird 3.xx frisch aufgesetzt.

Mein Problem: php findet/erkennt scheinbar nicht die fbclient.dll bzw. gds32.dll.

Woran kann liegen ?

Danke und viele Grüße
Bernd

Meine Umgebung:
OS: Windows 10 1903: Windows NT MAX 10.0 build 18362 (Windows 10) i586

Xampp-win32-7.3.0-0-VC15

Apache/2.4.37 (Win32) OpenSSL/1.1.1a PHP/7.3.0

Firebird-3.0.4.33054-0

PATH in PHP.ini:
C:\Windows\system32;
C:\Windows;
C:\Windows\System32\Wbem;
C:\Windows\System32\WindowsPowerShell\v1.0\;
C:\Windows\System32\OpenSSH\;
D:\WWW\Xampp\php;
D:\Grafik\ImageMagick;
C:\Users\Server\AppData\Local\Microsoft\WindowsApps;

Speicher-Ort: FireBird-Client

D:\WWW\Xampp\php\fbclient.dll
D:\WWW\Xampp\php\gds32.dll

Visual C++Redistributable:

2010 x64 10.0.30319
2010 x86 10.0.30319

2017 x64 14.16.27027
2017 x86 14.16.27027
Benutzeravatar
martin.koeditz
Beiträge: 440
Registriert: Sa 31. Mär 2018, 14:35

Hallo,

du nutzt die 32-Bit-Version von PHP, richtig?
Stelle sicher, dass
  • du eine 32-Bit fbclient.dll nutzt
  • die fbclient.dll im PATH liegt (scheint ja so zu sein)
  • die richtige Interbase-Erweiterung (ibase) verwendet wird (TS oder NTS)
Was sagen die Log-Dateien des Webservers?

Gruß
Martin
Martin Köditz
it & synergy GmbH
Hamburgo
Beiträge: 125
Registriert: Di 28. Mai 2019, 17:28

Hallo Martin,

zunächst erstmal danke, dass Du so zeitnah reagierst.

Das verstehe ich nicht so recht:
"die richtige Interbase-Erweiterung (ibase) verwendet wird (TS oder NTS)"

Was ist TS bzw. NTS ?

Und wo kann ich das nachschauen/prüfen und ggf. korriergieren ?

Gruß
Bernd
Benutzeravatar
martin.koeditz
Beiträge: 440
Registriert: Sa 31. Mär 2018, 14:35

Hallo Bernd,

ich kenne deine Vorkenntnisse nicht, deshalb versuche ich das Vorgehen in aller Kürze zu erläutern.

NTS / TS bedeutet schlicht Thread Safe / Non Thread Safe und gibt die Art der Parallelverarbeitung von PHP an.

Die fbclient.dll stellt die Kommunikation zwischen Client (in diesem Fall der Webserver) und DB-Server her. Die Erweiterung interbase setzt die PHP-Befehle um gibt diese über die fbclient an den DB-Server weiter.
  • XAMPP sollte im Verzeichnis ext eine Datei namens php_interbase.dll mitbringen. Dies ist bereits die richtige TS / NTS-Version.
  • In der php.ini von php muss die interbase-Erweiterung aktiviert werden. Dafür gibt es einen Eintrag extension=php_interbase.dll. Dieser ist entweder manuell zu setzen oder das Kommentarzeichen ist zu entfernen.
  • Danach den Webserver-Dienst neustarten
  • Wenn du nun die phpinfo() aufrufst, muss es einen eigenen Abschnitt interbase geben. Dies ist die Voraussetzung für den korrekten Zugriff.
    Sollte der Eintrag fehlen, prüfe, ob fbclient.dll geladen werden kann. Aus diesem Grund ist die Übereinstimmung der Bittigkeit (32 oder 64) zwischen fbclient.dll und php wichtig. Ein Blick in die Log-Dateien der Webserver ist auch sinnvoll.
Ich hoffe, das hilft dir erstmal weiter.

Gruß
Martin
Martin Köditz
it & synergy GmbH
Hamburgo
Beiträge: 125
Registriert: Di 28. Mai 2019, 17:28

Hallo Martin,

danke für die ausführliche und verständliche Antwort.

Was meine Vorkenntnisse angeht, stufe ich mich mal als Allrounder ein,
also in NICHTS wirklich Spezialist, aber von Allem in der Regel genug,
um ein relativ mächtiges ERP-Programm auf die Piste zu bringen.

Daher war mir das Meiste schon bekannt, aber mit TS und NTS konnte
ich nichts anfangen. Dank Dir habe ich jetzt so eine Ahnung, aber Wissen
kann man das nicht nennen.

Allerdings kenne ich nur die PHP.ini und keine application.ini.

Wo ist der Unterschied ?

Mein Produktions-Server läuft derzeit mit PHP 5.6.28 und FireBird 2.5,
auf 32 Bit unter Win10Prof 64 Bit. FireBird connecte ich mit Pear/Mdb2
mit CharSet: "iso-8859-1

Mein Ziel ist einen neuen Server aufzusetzen mit PHP 7.x und FireBird 3.0
unter CharSet: UTF-8, möglichst alles auf 64 Bit.

Auf Basis von 32 Bit habe ich es heute alles zum Laufen bekommen, nach-
dem ich einen Leichtsinns-Fehler httpd-xampp.conf behoben hatte.

Dabei habe ich wohl gelernt, dass FireBird 3.0 und Pear MDB2 keine Zukunft
mehr haben. Sehe ich das korrekt ?

Wenn ja, was empfiehlst Du mir stattdessen, wenn ich kein PDO möchte. ?


Bei meinem 64-Bit-Versuch scheitere ich derzeit an:

[31-May-2019 17:50:32 UTC] PHP Warning: PHP Startup: Unable to load dynamic library 'interbase' (tried: D:\WWW\Xampp\php\ext\interbase (Das angegebene Modul wurde nicht gefunden.), D:\WWW\Xampp\php\ext\php_interbase.dll (%1 ist keine zul�ssige Win32-Anwendung.)) in Unknown on line 0
[31-May-2019 17:50:32 UTC] PHP Warning: PHP Startup: Unable to load dynamic library 'php_interbase.dll' (tried: D:\WWW\Xampp\php\ext\php_interbase.dll (%1 ist keine zul�ssige Win32-Anwendung.), D:\WWW\Xampp\php\ext\php_php_interbase.dll.dll (Das angegebene Modul wurde nicht gefunden.)) in Unknown on line 0
[31-May-2019 17:50:33 UTC] PHP Warning: PHP Startup: Unable to load dynamic library 'interbase' (tried: D:\WWW\Xampp\php\ext\interbase (Das angegebene Modul wurde nicht gefunden.), D:\WWW\Xampp\php\ext\php_interbase.dll (%1 ist keine zul�ssige Win32-Anwendung.)) in Unknown on line 0
[31-May-2019 17:50:33 UTC] PHP Warning: PHP Startup: Unable to load dynamic library 'php_interbase.dll' (tried: D:\WWW\Xampp\php\ext\php_interbase.dll (%1 ist keine zul�ssige Win32-Anwendung.), D:\WWW\Xampp\php\ext\php_php_interbase.dll.dll (Das angegebene Modul wurde nicht gefunden.)) in Unknown on line 0


Ausgelöst durch die Zeilen:

extension=interbase
extension=php_interbase.dll

in der PHP.ini

Hast Du eine Ahnung warum ?

Danke und viele Grüße
Bernd
Benutzeravatar
martin.koeditz
Beiträge: 440
Registriert: Sa 31. Mär 2018, 14:35

Hallo Bernd,

mein Fehler, es gibt nur die php.ini. Habe ich korrigiert.
Dabei habe ich wohl gelernt, dass FireBird 3.0 und Pear MDB2 keine Zukunft
mehr haben. Sehe ich das korrekt ?
Den MDB2-Treiber kenne ich nicht. Aber es wird weiterhin eine native Firebird-Erweiterung für PHP geben (Derzeit heißt die php_interbase). Diese wird nun jedoch nicht mehr im Kern von PHP weiterentwickelt, sondern von uns (den Firebird-Entwicklern) im PECL-Zweig.

Wenn du direkt auf die Firebird-Funktionen zugreifst, kannst du auch schon die Firebird- statt der alten Interbase-Schreibweisen nutzen (statt fbird_connect statt ibase_connect, siehe auch ). Diese werden später zum Standard. Sobald ich eine Freigabe seitens des PHP-Dokumentationsteams habe, werden diese Funktionen auch vernünftig beschrieben. Siehe auch https://www.php.net/manual/de/book.ibase.php
extension=interbase
extension=php_interbase.dll
Früher wurde der komplette Dateiname verwendet, seit PHP 7.2 wird nur noch der Name der Erweiterung verwendet (siehe auch https://www.php.net/manual/de/install.pecl.windows.php. Die zweite Zeile solltest du also entfernen. Im ext-Verzeichnis sollte die Datei php_interbase.dll liegen. Wichtig ist aber, dass dann alles in 64 Bit vorliegt. Also sowohl PHP selbst, als auch die fbclient.dll (aus FB 3) sowie die php_interbase.dll (die ja von XAMPP mitgebracht wird). Irgendwo scheint noch auf eine 32Bit-Variante zugegriffen zu werden. Hast du den XAMPP 64 installiert? Normalerweise ist dies recht einfach aufgebaut. Ich nutze dies selbst um die Windows-Binaries für php_interbase zu bauen.

Gruß
Martin
Martin Köditz
it & synergy GmbH
Hamburgo
Beiträge: 125
Registriert: Di 28. Mai 2019, 17:28

Hallo Martin,

danke für die weiteren Erläuterungen. Bevor ich da aber weiter Kraft reinstecke
werde ich zunächst mal Eure native Firebird-Erweiterung testen, um eine Vor-
stellung davon zu bekommen, wie die Stratgie für die Umstellung von MDB2
aussehen könnte.

Und da fangen die Probleme schon beim Select an bzw. dem Ergebnis:

Der MDB2-Treiber oder bei Treibern für MySQL gibt es eine numRow-Funktion/Variable
in der die Anzahl der gefundenen Datensätze des letzten Select-Befehls stehen.

Soetwas habe ich bei Eurer FireBird-Erweiterung bisher nicht finden können, nur
umständliche Workarounds.

MIt ibase_affected_rows scheint es das für INSERT, UPDATE und DELETE wohl zu
geben, nur für SELECT nicht.

Habe ich da etwas übersehen ?

Danke und Gruß
Bernd
Benutzeravatar
martin.koeditz
Beiträge: 440
Registriert: Sa 31. Mär 2018, 14:35

Hi Bernd,

da hast du recht. Wenn du die Anzahl der Gesamtdatensätze aus einem SELECT ermitteln möchtest, kannst du das nur über eine Schleife (z.B. fbird_fetch_row) oder du musst ein SELECT COUNT(*) bauen und das Ergebnis mittels fbird_fetch_row holen. Ich meine letzteres tut die MDB2 intern auch.

Intern kennt Firebird die Anzahl der zu liefernden Datensätze auch nicht. Dies geschieht erst, wenn alle Datensätze zurückgegeben wurden.

Gruß
Martin
Martin Köditz
it & synergy GmbH
Hamburgo
Beiträge: 125
Registriert: Di 28. Mai 2019, 17:28

Hi Martin,

ok, dann muss ich mir da wohl ne Krücke bauen, weil ich diese Info sehr
häufig nutze und da bin ich wohl nicht alleine.

Einmal kurz gegoogelt und ich gewinne den Eindruck, dass recht viele
FireBird-Anwender eine solche Funktion vermissen.

Bitte nicht falsch verstehen, ich habe einen riesen Respekt vor der
Leistung, die ihr Entwickler für uns erbringt, aber wundere mich, warum
es eine solche Funktion nicht gibt, obwohl der Bedarf recht hoch zu
sein scheint, hingegen aber viel Energie und Zeit in so mache Funktion
investiert wird, wo ich mich frage:
Braucht das jemand und wenn ja, wie häufig ?

MySQL hats, PostgredSql hats, DB2 hats, MS-SQL-Server hats usw.

Es mag sein, dass FireBird derzeit die Anzahl der auszuliefernden Daten-
sätze nicht kennt, hege aber die Vermutung, dass FireBird diesen Wert mit
relativ wenig Aufwand sehr viel performanter ermitteln könnte, als der End-
Anwender mit einer Script-Sprache, wie PHP.

Ich zumindest wäre Euch sehr dankbar, wenn sich da jemand fände, der eine
solche Funktion baut.

Danke und viele Grüße
Bernd
Benutzeravatar
martin.koeditz
Beiträge: 440
Registriert: Sa 31. Mär 2018, 14:35

Guten Morgen Bernd,

Ich zumindest wäre Euch sehr dankbar, wenn sich da jemand fände, der eine
solche Funktion baut.
Ich werde das weitergeben. ;)

Gruß
Martin
Martin Köditz
it & synergy GmbH
Antworten