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

UniA

Aktives Mitglied
26. Februar 2024
6
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
674
231
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.
 

UniA

Aktives Mitglied
26. Februar 2024
6
1
Hi,

danke für die Info. Die Anpassung ist tatsächlich wichtig und gut, auch wenn diese Probleme in meiner Umgebung bereitet.

Ich kann an meiner Uni leider nur das nehmen, was angeboten wird, und das ist ein vHost samt Netzwerkspeicher per NFSv4.

Ich kann dein Argument mit dem "least-privilege"-Prinzip nachvollziehen - auf der anderen Seite wäre es vsl. nicht schlimm "r+b" zu benutzen, da man dann zwar einen Schreibzugriff hat, diesen aber nicht nutzen muss.

Ich wäre den Entwicklern auf jeden Fall sehr dankbar, wenn sie einen guten Mittelweg finden würden.

Danke im Voraus!
 

UniA

Aktives Mitglied
26. Februar 2024
6
1
Hallo,

kann bitte das Thema in "JTL-Shop - Fehler und Bugs" verschoben werden? Sonst geht es hier vsl. unter bzw. wird von Entwicklern übersehen.

Danke im Voraus.