Firebird + php 7: Bug im connect

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

Moderator: martin.koeditz

vr2
Beiträge: 214
Registriert: Fr 13. Apr 2018, 00:13

Hallo Martin,

cool, danke, können wir so machen. Meine Testumgebung:

1. PHP-Version: 7.3.0 - apache 2.4.37 (Win32)
2. FB-Client-Version und "Bittigkeit" 3.0.4 33054 64 Bit
3. Betriebssystem und "Bittigkeit" Win7 / 64 und Win10 / 64

Der xampp-apache 32 Bit nutzt die 64-Bit fbclient ohne Probleme.
Und eine dll, die unter Win7 läuft, läuft doch auch unter Win10.

Grüße, Volker
vr2
Beiträge: 214
Registriert: Fr 13. Apr 2018, 00:13

Hallo Martin,

hast Du schon was zum Testen?

Ich will nicht stressen, wir haben nur erste Nachfragen, wo security audits gemacht wurden und php 5.6.nn bemängelt wurde. Das war nur eine Zeitfrage.

Viele Grüße, Volker
Benutzeravatar
martin.koeditz
Beiträge: 443
Registriert: Sa 31. Mär 2018, 14:35

Hi Volker,

habe noch nichts fehlerfreies. Musste mich erstmal intensiv in die PHP-Extension-Entwicklung einarbeiten. Alles habe ich noch immer nicht verstanden. Sobald ich aus dem Urlaub zurück bin kann ich dir aber sicherlich was anbieten. Also etwa zwei Wochen.

Gruß
Martin
Martin Köditz
it & synergy GmbH
vr2
Beiträge: 214
Registriert: Fr 13. Apr 2018, 00:13

Hi Martin,

alles klar, kein Stress. Ich baue übergangsweise doch unsere Anwendungen mit workarounds für php 7 um, so dass der Zeitdruck raus ist. Es kann gut sein, dass es mehr als 2 Wochen werden, bis der neue Treiber voll getestet ist und läuft.

noch schönen Urlaub

Grüße, Volker
Benutzeravatar
martin.koeditz
Beiträge: 443
Registriert: Sa 31. Mär 2018, 14:35

Hallo Volker,

ich denke, das Problem habe ich gelöst. Allerdings habe ich es noch nicht geschafft eine funktionierende Windows-Build-Umgebung zu bauen. Unter Linux ist das recht einfach, aber Windows ist da spezieller. Aber ich denke, dass ich das auch im Laufe der Woche schaffe, sodass du dann zum Wochenende hin eine passende Extension haben solltest.

Nutzt ihr auch persistente Verbindungen oder nur temporäre?

Gruß
Martin
Martin Köditz
it & synergy GmbH
vr2
Beiträge: 214
Registriert: Fr 13. Apr 2018, 00:13

Hallo Martin,

cool die Perspektive! Nee, wir nutzen nur die Einwegconnects (ibase_connect statt ibase_pconnect).

Die persistenten wären zwar super, wenn sie wirklich persistent wären, aber sind sie nicht, da der Webserver nur ähnliche Connects recycelt und meist neu connectet. Er hält eben nicht eine bestimmte connection offen, anders als bei desktop-Anwendungen. Dadurch kann man leider temp tables über Skriptlebensdauer hinaus nicht nutzen, also bei mehreren Requests der selben user/client-Session nutzlos.

Grüße, Volker
Benutzeravatar
martin.koeditz
Beiträge: 443
Registriert: Sa 31. Mär 2018, 14:35

Guten Morgen Volker,

ich habe eine ZIP-Datei mit zwei DLLs angehängt. Eine Thread-Safe, eine ohne. Bitte teste die passende mal.

Das folgende Skript habe ich zum Testen verwendet:

Code: Alles auswählen

<?php

// Abfrage des aktuellen Zeichensatzes mittels SELECT 
// auf der übergebenen Verbindung
function testQuery($conn, $name) {

    echo "<br/>Starte Test für $name auf $conn \n<br/>";
    $stmt = 'SELECT RDB$CHARACTER_SET_NAME AS CHARSET FROM rdb$database';
    $sth = ibase_query($conn, $stmt);
    while ($row = ibase_fetch_object($sth)) {
        echo 'Hole Charset mittels Select für Verbindung: ' . $row->CHARSET, "\n<br/>";
    }
    ibase_free_result($sth);
    ibase_close($conn);
    echo "Test für $name abgeschlossen\n<br/>";
}

// Verbindungen
$alias = "10.1.12.200:test.fdb";
$aliasAlt = "10.1.12.200:test.fdb";
$usr = "sysdba";
$pw = "masterkey";
$charset = "utf-8";
$role = null;

// 1. Verbindung erstellen
$conn1 = ibase_connect($alias, $usr, $pw, $charset, 0, 3, $role);
if($conn1) {
    print "Conn1 erfolgreich!\n<br/>";
}
else {
    print "Conn1 fehlgeschlagen!\n<br/>";
    echo ibase_errmsg();
}
testQuery($conn1, "Verbindung 1\n<br/>");

// 2. Verbindung erstellen
$conn2 = ibase_connect($aliasAlt, $usr, $pw, $charset, 0, 3, $role);
if($conn2) {
    print "Conn2 erfolgreich!\n<br/>";
}
else {
    print "Conn2 fehlgeschlagen!\n<br/>";
    echo ibase_errmsg();
}

// 2. Verbindung testen
testQuery($conn2, "Verbindung 2");

// 1. Verbindung erneut testen
testQuery($conn1, "Verbindung 1 - erneut");

// 2. Verbindung erneut testen
testQuery($conn2, "Verbindung 2 - erneut");
?>
Ausgabe mit Original-DLL:

Code: Alles auswählen

Conn1 erfolgreich!

Starte Test für Verbindung 1
auf Resource id #2
Hole Charset mittels Select für Verbindung: UTF8
Test für Verbindung 1
abgeschlossen
Conn2 erfolgreich!

Starte Test für Verbindung 2 auf Resource id #4
Hole Charset mittels Select für Verbindung: UTF8
Test für Verbindung 2 abgeschlossen

Starte Test für Verbindung 1 - erneut auf Resource id #2

Warning: ibase_query(): supplied resource is not a valid Firebird/InterBase link resource in C:\xampp\htdocs\ibase\index.php on line 8

Warning: ibase_fetch_object() expects parameter 1 to be resource, bool given in C:\xampp\htdocs\ibase\index.php on line 9

Warning: ibase_free_result() expects parameter 1 to be resource, bool given in C:\xampp\htdocs\ibase\index.php on line 12
Test für Verbindung 1 - erneut abgeschlossen

Starte Test für Verbindung 2 - erneut auf Resource id #4
Hole Charset mittels Select für Verbindung: UTF8
Test für Verbindung 2 - erneut abgeschlossen 
Hier sieht man das fehlerhafte Verhalten. Das Connection-Objekt $conn1 enthält eine nicht mehr gültige Referenz, weshalb es zum Fehler kommt.

Mit der neuen DLL sieht die Ausgabe so aus:

Code: Alles auswählen

Conn1 erfolgreich!

Starte Test für Verbindung 1
auf Resource id #2
Hole Charset mittels Select für Verbindung: UTF8
Test für Verbindung 1
abgeschlossen
Conn2 erfolgreich!

Starte Test für Verbindung 2 auf Resource id #4
Hole Charset mittels Select für Verbindung: UTF8
Test für Verbindung 2 abgeschlossen

Starte Test für Verbindung 1 - erneut auf Resource id #2
Hole Charset mittels Select für Verbindung: UTF8
Test für Verbindung 1 - erneut abgeschlossen

Starte Test für Verbindung 2 - erneut auf Resource id #4
Hole Charset mittels Select für Verbindung: UTF8
Test für Verbindung 2 - erneut abgeschlossen 
Das ist m.E. sehr vielversprechend. Also einfach mal prüfen und bitte kurze Rückmeldung.

Dank und Gruß
Martin
Dateianhänge
php_interbase.zip
Firebird-Extension für PHP 7.3.0-x86 VC15
TS und NTS
(60.25 KiB) 961-mal heruntergeladen
Martin Köditz
it & synergy GmbH
vr2
Beiträge: 214
Registriert: Fr 13. Apr 2018, 00:13

Hallo Martin,

vielen Dank, teste sofort los.

Achtung! Schau Dir bitte auf firebird-devel den Thread vom 22.3.2019

[PHP-DEV] [RFC] Unbundle ext/interbase

an. Die php-Leute wissen anscheinend gar nicht, dass Du da schon länger dran bist. Bitte sag denen Bescheid, bevor das noch mehr anbrennt.

Viele Grüße, Volker
Benutzeravatar
martin.koeditz
Beiträge: 443
Registriert: Sa 31. Mär 2018, 14:35

Hallo Volker,

danke für den Hinweis. Bin da auch gerade drüber gestolpert. Habe nun einen "Brandbrief" geschickt. Mal sehen, was hier nun passiert.

Gruß
Martin
Martin Köditz
it & synergy GmbH
vr2
Beiträge: 214
Registriert: Fr 13. Apr 2018, 00:13

Hallo Martin,

habe die TS-Version getestet, sieht gut aus!
Bisher lief alles, parallele gleiche connections, auch alles andere, keine Äuffälligkeiten. Am neuen Treiber steht zwar 7.3.0 dran, er läuft aber auch in einem 7.3.2er xampp.

Jetzt: Es gibt neuerdings xampp in 64-Bit, könntest Du bitte noch die Versionen TS/NTS in 64-Bit erzeugen?

Vielen Dank schon mal. Ich feier das!

Grüße, Volker

ps: die zwei hier (nikic von php und Lester von Firebird, 22. und 23.3.2019) wissen auch nichts von Deinem neuen Treiber und Bugfix: https://bugs.php.net/bug.php?id=72175 und werkeln an eigenen Versionen. Kannste die zwei im Ticket mal aufklären bitte ;-)

Einem der php-Leute (Kalle, der mit dem RFC zum unbundeln) hab ich vorhin gemailt. Im Moment scheints darum zu gehen, dass alle mal auf den aktuellen Stand kommen.
Antworten