Neu 5.8.0: HTTP 500 im letzten Checkout-Schritt durch Nummern-Lock

UniA

Aktives Mitglied
26. Februar 2024
4
1
Guten Tag,

seit dem Upgrade von JTL-Shop 5.7.2 auf 5.8.0 tritt bei uns beim letzten Schritt des Checkouts / Absenden der Bestellung reproduzierbar ein HTTP-500-Fehler auf.

Mit JTL- Shop 5.7.2 funktionierte der Shop mit derselben Umgebung problemlos.

Umgebung:
  • JTL-Shop 5.8.0
  • PHP 8.4.25
  • Apache 2.4.58 / Ubuntu
  • Shop-Dateisystem inkl. jtllogs: NFS4
  • Lock-Datei: jtllogs/nummern.lock

Fehlermeldung im Logbuch:
Code:
Routing error: Could not lock the thread-safe number provider

Die Exception wird in
Code:
includes/src/Checkout/Nummern.php:66
ausgelöst.

In JTL-Shop 5.8.0 wird die Lock-Datei folgendermaßen geöffnet:
Code:
$this->filePointer = \fopen(\NUMMERN_LOCKFILE, 'rb');
return $this->filePointer !== false && \flock($this->filePointer, \LOCK_EX);

Wir konnten das Problem direkt reproduzieren:
Code:
rb:   bool(false)
r+:   bool(true)
r+b:  bool(true)
c:    bool(true)
c+:   bool(true)

Das heißt: flock() schlägt bei nummern.lock fehl, wenn die Datei mit rb geöffnet wird. Mit r+b funktioniert der Lock.


Bestätigung durch Workaround:

Wir haben testweise
Code:
fopen(\NUMMERN_LOCKFILE, 'rb')
auf
Code:
fopen(\NUMMERN_LOCKFILE, 'r+b')
geändert.

Danach war der HTTP-500-Fehler im letzten Checkout-Schritt sofort behoben und Bestellungen konnten wieder abgeschlossen werden.

Da JTL-Shop 5.7.2 mit PHP 8.4.25 und derselben NFS4-Umgebung problemlos funktioniert hat, vermuten wir eine Änderung bzw. einen Fehler im Locking-Code von JTL-Shop 5.8.0.

Bitte prüfen Sie, ob die Verwendung von rb für NUMMERN_LOCKFILE in Checkout/Nummern.php beabsichtigt ist bzw. ob hierfür ein anderer Öffnungsmodus verwendet werden sollte.

Vielen Dank!
 

NoOne

Sehr aktives Mitglied
16. März 2024
663
229
Das gabs in 5.7 nicht. Das ist mit https://issues.jtl-software.de/issues/SHOP-6408 dazugekommen.

Das ist aber in der Tat ein Problem mit deiner NFS4 Umgebung. Nach dem "least-privilege"-Prinzip ist es nicht falsch hier nur rb zu benutzen, weil kein Schreibzugriff benötigt wird. Mit einem lokalen Dateisystem wäre das auch nicht nötig.