
Ich programmiere eine PHP-Webseite und mir fiel auf, dass mein Computer ein merkwürdiges Verhalten zeigte. An einem bestimmten Punkt dauerte es zu lange, bis Apache/PHP die Webseite im Browser anzeigte (8 Sekunden). Zuerst dachte ich, meine Anwendung hätte einen Fehler und erstellte eine Debug-Funktion, um die Zeit im Auge zu behalten, die zum Beenden meines Skripts benötigt wurde. Als ich jedoch die Seite mehrere Male neu lud (durch Drücken von F5), bemerkte ich, dass es nicht mein Skript war, sondern ein anderer Prozess, der Apache (oder PHP oder MySQL) anhielt und dann freigab, weil das mehrmalige Drücken von F5 zeigte, dass das Skript manchmal schnell fertig wird und manchmal lange dauert:
[time_start] => Array
(
[0] => 1446841239.1471
[1] => 0.0581
[2] => 0.0589
[3] => 0.0564
[4] => 8.0531
[5] => 0.0574
[6] => 0.0621
[7] => 8.0582
[8] => 0.0548
[9] => 8.0457
[10] => 0.0755
[11] => 8.0555
[12] => 0.0512
[13] => 8.0447
[14] => 0.062
[15] => 8.0905
[16] => 0.0602
[17] => 8.0556
[18] => 0.0582
[19] => 8.0492
[20] => 0.0551
)
Jeder Schritt ist das gleiche Skript, das nach dem Drücken von F5 ausgeführt wird, und es sollte immer die gleiche Zeit dauern, aber manchmal dauert es 8 Sekunden, bis es fertig ist, und das nervt mich, denn wenn es ins Stocken gerät, dauert es IMMER etwa 8 Sekunden
Die Frage ist also: Gibt es Ideen, wie ich den Prozess finden kann, der mein Skript blockiert?
P.S.: Da es mein persönlicher Computer ist, lasse ich viele Dinge im Vordergrund laufen, aber selbst wenn ich nur den Browser verwende und keine andere Anwendung laufe, bleibt es immer noch hängen. Es muss also etwas sein, das im Hintergrund läuft. Wie kann ich es finden?
Antwort1
Konstante 8 Sekunden bedeuten, dass für einen möglicherweise lang andauernden Vorgang ein Timeout festgelegt wurde. Ohne zu wissen, was der PHP-Code macht, gehe ich davon aus, dass Sie eine DNS-Zeit haben. Wenn PHP Netzwerk-E/A oder etwas Ähnliches durchführt, löst es wahrscheinlich eine DNS-Suche aus. Hin und wieder sehen Sie, dass eine DNS-Abfrage ein Timeout aufweist und PHP in diesem Fall weitermacht, was auch immer es tut.
Der einzige Ort, an dem ich sehen kann, dass DNS-Timeouts festgelegt werden /etc/resolv.conf
, ist in oder vielleicht, wenn der resolver(3)
Code in GNU libc kompiliert wird. Leider behauptet die Manpage für, resolv.conf
dass ein Timeout von 5 Sekunden der kompilierte Standard ist, also kann ich nur sagen, dass ich das nur vermute.