Zeitüberschreitung und php.ini

Schumiel

Erfahrenes Mitglied
Hallo,

auf meiner Webseite kommt immer wieder Zeitüberschreitung. Wohl zu viele User auf der Webseite?

Wo und welchen Wert muss ich in der php.ini anpassen?
 
Der Wert heißt: max_execution_time

Das zuviele User auf der Seite sind führt eher zu einem 500er Server Error, weil der Webserver der Last nicht mehr gewachsen ist.
Wenn PHP das Handtuch wirft hat es meist mit einem Skriptproblem zu tun.
 
An dieser Stelle möchte ich einmal ein bisschen Eigenwerbung für mein Tutorial im Footer machen:

Programm-Flaschenhälse in PHP mit xdebug finden

Um dein Problem aber akut zu erkennen, solltest du vielleicht einen Blick in deine Server-Logs werfen, wenn log_errors auf 1 ist, werden da zumindest die Zeilen geloggt, wo der Timeout aufgetreten ist.

Ein paar der möglichen Ursachen, die du untersuchen könntest:

- Zugriff auf die Datenbank mit kostspieligen SQL-Statements, hier kannst du mit EXPLAIN untersuchen
- Zugriff auf Dateien mit flock
- Zugriff auf externe Quellen (bspw. Webservices) also Datenquellen, die nicht auf deinem Server liegen, Google-API oder ähnliches

Einfach die max_execution_time zu erhöhen halte ich für gewagt. In der Default-Einstellung sind das immerhin 30 Sekunden, eine verdammt lange Zeit für den Aufruf einer Internet-Seite. Länger würde ich den User dann auch nicht auf ein Timeout warten lassen. Wenn da wirklich eins extern geschuldet ist, kannst du an der Ursache auch nichts ändern.
 
Danke saftmeister.

Das hört sich alles schlüssig und plausibel an. Ich schaue mir das morgen alles mal an. Heute dröhnt mein Kopf zu sehr.

Übrigens, mein Wert der max_execution_time liegt derzeit bei 700.
 
Oder ich frag mal direkter.

Bei Linux Eingabe Befehl "top":


12840 www-data 20 0 247m 18m 5484 S 7 0.5 0:04.68 apache2
12069 www-data 20 0 244m 16m 6196 S 5 0.4 0:13.44 apache2
12104 www-data 20 0 245m 16m 6184 R 5 0.4 0:12.32 apache2

Warum 13 Sekunden und manchmal 4? 13 Sekunden ist doch zu lang. Unten links in der Taskleiste steht auch immer "Warten auf Domain.de" und das eben einige Sekunden. Was läuft da schief?
 
Die Ausgabe von top zeigt IMHO die verbrauchte System-Zeit (CPU) und nicht die reelle Laufzeit.

top ist für deine Zwecke auch erstmal ungeeignet, da Apache in der regel threaded läuft. Das bedeutet, du hast eine gewisse Anzahl von Workern (Haupt-Threads) und die können Child-Threads erzeugen. Jeder Child-Thread stellt dann eine Verbindung Browser <-> Webserver dar. Du müsstest wenn überhaupt, die Thread-Anzeige in top einblenden.

Wie auch schon Felix schrieb, ist die Ursache, denk ich, nicht beim Webserver sondern in den Scripten zu suchen.

Edit: Mir ist grad noch eine well-known-Ursache eingefallen: mysql_connect(). Verwendest du persistente Verbindungen oder machst du die Connection jedes Mal neu auf?
 
Zuletzt bearbeitet:
Heute geht mein Server wieder ganz gut. Kann das auch damit zusammenhängen, das massig Bilder nicht auf dem Server hinterlegt werden, obwohl darauf tausende User zugreifen wollen? Wird ja alles in der error.log geschrieben.

Zu SQL:
Nutze ich diesen Befehl ... der bei jedem Seitenaufruf aufgerufen wird. Ich arbeite zum Teil nur mit PHP4.

// Datenbankverbindung
...DB Daten ...
$db = @mysql_connect ($db_host, $db_user, $db_pass) or die ('Fehler');
@mysql_select_db($db_name,$db) or die ("Die Datenbank konnte nicht ausgewählt werden. Bitte versuchen Sie es später nochmal.");
 
Mach da evtl. schon mal pconnect draus. Das kann deine Performance schon mal etwas verbessern:

PHP Manual hat gesagt.:
mysql_pconnect() verhält sich sehr ähnlich zu mysql_connect(), weist aber zwei wesentliche Unterschiede auf.

Erstens: vor dem Verbindungsaufbau wird zunächst versucht eine offene (persistente) Verbindung zum gleichen Host, mit dem gleichen Benutzernamen und Benutzerkennwort zu finden. Wenn das gelingt, wird die Verbindungskennung dieser Verbindung zurückgeliefert anstatt eine neue Verbindung aufzubauen.

Zweitens: die Verbindung zum SQL Server wird beim Beenden des PHP-Skripts nicht geschlossen. Sie bleibt zur zukünftigen Verwendung bestehen. (mysql_close() schließt keine von mysql_pconnect() geöffneten Verbindungen).

Der optionale Parameter client_flags steht seit PHP 4.3.0 zur Verfügung.

Deshalb wird dieser Verbindungstyp 'persistent' genannt.

Es erklärt aber den Timeout nicht, wenn ich so drüber nachdenke. mysql_connect() sollte auch nach einer gewissen Zeit einfach einen Fehler werfen und nicht bis zum St.-Nimmerleinstag versuchen, sich zu verbinden (in diesem Falle würde max_execution_time dafür sorgen).

Ich tippe auf eine externe Quelle. Hast du irgendwelche curl-Sachen? Hast du Webservices integriert?

Edit: Massig Bilder, von welchen Größenordnungen sprechen wir denn?

Edit2: Erklär doch mal bitte folgenden Satz:

ganz gut. Kann das auch damit zusammenhängen, das massig Bilder nicht auf dem Server hinterlegt werden, obwohl darauf tausende User zugreifen wollen?

Je öfter ich ihn lese, um so weniger versteh ich ihn.
 
Zuletzt bearbeitet:
Ich habe es in mysql_pconnect geändert. Mal schauen, wie es in Stoßzeiten aussieht. Danke.

Ich habe keine Webservices integriert oder ich nutze auch keine externe Quellen.

Zu beiden Edits:
Es geht um Userbars, die in vielen externen Foren aufgerufen werden. Aber diese Userbars sind erst seit heute 0 Uhr zur Verfügung. Die error.log quillte wegen den fehlenden Bildern über, weil sie nicht gefunden wurden. Daher meine Frage, ob das eine Ursache sein kann.

Noch eine Frage:
Was passiert denn, wenn ich max_execution_time von 700 auf 30 runtersetze? Ich habe ca. bis zu 400 User gleichzeitig online. Was erwartet mich?
 
Das könntest du simulieren, benutze das Tool ab (Apache Benchmark), und versuche 400 gleichzeitige Verbindungen (oder auch mehr) auf deinen Server zu starten.

Das funktioniert ungefähr so:

Code:
$ ab -k -n 500 -c 20 http://www.mysite.de/somespecialscript.php

Das bedeutet, es werden 500 Verbindungen bei 20 gleichzeitigen zu deiner Seite gestartet.

Es finden normalerweise nie 400 Verbindungen richtig gleichzeitig statt. Du kannst ja versuchen, was passiert, wenn du die 20 suksessive erhöhst.

Eine Frage hätte ich gern noch beantwortet. Wie sieht das im Browser aus, wenn der Timeout fliegt? Bekommst du ein Fehlercode 503 oder wie genau sieht das aus?
 
Zurück