Hansjoerg Lipp
2021-11-30 21:37:30 UTC
Hallo miteinander,
ich versuche gerade verzweifelt einen Bug in einem Script zu verstehen:
Mehrere php-Scripte brechen manchmal mit Status 500 ab, wenn diese mit
mail() eine Mail versenden sollen. Im Log steht dann etwas wie
Testumgebung kann ich das Problem nicht reproduzieren. Einfache Scripte,
die mail() aufrufen, funktionieren aber auch beim Hoster einwandfrei.
Ich habe also eines der betroffenen Scripte nach und nach verkleinert,
inklusive 3rd-Party-Geraffel und komme zu folgendem Minimalbeispiel:
-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----
<?php
$GLOBALS['USER']=array();
$user =& $GLOBALS['USER'];
$script_name =& $_SERVER['PHP_SELF'];
if (mail("***@invalid.invalid", "s", "b", "From: ***@invalid.invalid")) {
trigger_error("<-1->", E_USER_WARNING);
}
trigger_error("<-2->", E_USER_WARNING);
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<title>test mail</title>
</head>
<body>
ok
</body>
-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----
Dieses Script reproduziert den Fehler zuverlässig, allerdings mit der
weiteren Merkwürdigkeit, dass es beim ersten Aufruf fehlerfrei
funktioniert, um dann bei allen folgenden Aufrufen abzustürzen (hängt
das mit OPCache zusammen?).
Der Fehler tritt nur auf, wenn mindestens die beiden enthaltenen
Referenzen vorkommen. Ersetzt man allerdings z.B. die Referenz auf
$_SERVER['PHP_SELF'] durch eine auf ein anderes Element von $GLOBALS,
verschwindet der Bug.
Eine weitere Auffälligkeit: Die Größe des Speicherbereichs, den mail()
allozieren möchte, variiert - allerdings nicht in den niederen 32 Bits:
beispielsweise
2338326353679483218 = 0x2073676e00000152
7526676551241302354 = 0x6874207200000152
139835545223506 = 0x00007f2e00000152
7308304393684648274 = 0x656c502000000152
6718605744721101138 = 0x5d3d485400000152
Hat jemand von Euch so etwas schon mal gesehen? Ist das ein bekannter
php-Bug? Hat da der Hoster etwas komisches reingepatcht? Hat jemand eine
Idee, wie das Problem zu lösen ist? In welche Richtung könnte ich den
Hoster eventuell schubsen, falls er nichts konstruktives zuwege bringen
sollte?
Viele Grüße
Hansjörg
ich versuche gerade verzweifelt einen Bug in einem Script zu verstehen:
Mehrere php-Scripte brechen manchmal mit Status 500 ab, wenn diese mit
mail() eine Mail versenden sollen. Im Log steht dann etwas wie
PHP Fatal error: Allowed memory size of 268435456 bytes exhausted (tried to allocate 2336086652788670802 bytes)
Das ganze passiert bei einem Hoster unter php 7.4. Auf meiner lokalenTestumgebung kann ich das Problem nicht reproduzieren. Einfache Scripte,
die mail() aufrufen, funktionieren aber auch beim Hoster einwandfrei.
Ich habe also eines der betroffenen Scripte nach und nach verkleinert,
inklusive 3rd-Party-Geraffel und komme zu folgendem Minimalbeispiel:
-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----
<?php
$GLOBALS['USER']=array();
$user =& $GLOBALS['USER'];
$script_name =& $_SERVER['PHP_SELF'];
if (mail("***@invalid.invalid", "s", "b", "From: ***@invalid.invalid")) {
trigger_error("<-1->", E_USER_WARNING);
}
trigger_error("<-2->", E_USER_WARNING);
?>
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" lang="en">
<head>
<title>test mail</title>
</head>
<body>
ok
</body>
-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----8<-----
Dieses Script reproduziert den Fehler zuverlässig, allerdings mit der
weiteren Merkwürdigkeit, dass es beim ersten Aufruf fehlerfrei
funktioniert, um dann bei allen folgenden Aufrufen abzustürzen (hängt
das mit OPCache zusammen?).
Der Fehler tritt nur auf, wenn mindestens die beiden enthaltenen
Referenzen vorkommen. Ersetzt man allerdings z.B. die Referenz auf
$_SERVER['PHP_SELF'] durch eine auf ein anderes Element von $GLOBALS,
verschwindet der Bug.
Eine weitere Auffälligkeit: Die Größe des Speicherbereichs, den mail()
allozieren möchte, variiert - allerdings nicht in den niederen 32 Bits:
beispielsweise
2338326353679483218 = 0x2073676e00000152
7526676551241302354 = 0x6874207200000152
139835545223506 = 0x00007f2e00000152
7308304393684648274 = 0x656c502000000152
6718605744721101138 = 0x5d3d485400000152
Hat jemand von Euch so etwas schon mal gesehen? Ist das ein bekannter
php-Bug? Hat da der Hoster etwas komisches reingepatcht? Hat jemand eine
Idee, wie das Problem zu lösen ist? In welche Richtung könnte ich den
Hoster eventuell schubsen, falls er nichts konstruktives zuwege bringen
sollte?
Viele Grüße
Hansjörg