2014-10-10 6 views
6

Ich betreibe PHP über FCGI - das ist mein Webserver, der mehrere PHP-Prozesse hervorbringt und sie laufen für etwa 10.000 Anfragen, bis sie recycelt werden.

Meine Frage ist - wenn ich eine $mysqli->connect oben in meinem PHP-Skript habe, muss ich $mysqli->close in aufrufen, wenn ich im Begriff bin, das Skript zu beenden?

Da PHP-Prozesse für eine lange Zeit geöffnet sind, würde ich jedes $mysqli->connect 1 Verbindung verlieren, weil der Prozess läuft und niemand die Verbindung schließt.

Bin ich richtig in meinem Denken oder nicht? Soll ich $mysqli->close anrufen?

Antwort

7

Wenn PHP beendet wird, schließt es die Datenbankverbindungen ordnungsgemäß.

Der einzige Grund, die close-Methode zu verwenden, ist, wenn Sie eine Datenbankverbindung beenden möchten, die Sie nicht mehr verwenden, und Sie haben viele Dinge zu tun: wie die Daten verarbeiten und streamen, aber wenn das schnell ist Sie können die enge Aussage vergessen.

Wenn Sie am Ende eines Skripts stehen, bedeutet dies Redundanz, keine Leistung oder Speichergewinn.

+0

ja, aber PHP in meinem Fall nicht beendet. Der Webserver erzeugt sie und treibt sie dann weiter, ohne dass die Prozesse beendet werden. Die Prozesse bleiben für 10.000 Anfragen offen. (Zumindest verstehe ich das unter FCGI.) – bodacydo

+0

Soweit ich denken kann, wird GC diese klären. Der Prozess wird nicht beendet, aber der Speicher muss zwischen den Skriptausführungen gelöscht werden. Sonst wäre es ein echtes Sicherheitsproblem, da auch die öffentlichen Variablen etc. in Geltung bleiben würden. –

3

In etwas mehr Detail, speziell über FastCGI:

FastCGI hält PHP-Verarbeitung zwischen den Anforderungen ausgeführt wird. FastCGI ist gut darin, die CPU-Auslastung zu reduzieren, indem der verfügbare RAM-Speicher Ihres Servers genutzt wird, um PHP-Skripte im Speicher zu halten, anstatt für jede einzelne PHP-Anfrage einen eigenen PHP-Prozess starten zu müssen.

2

Ich habe FCGI nie vertraut, um meine Datenbankverbindungen für mich zu schließen. Eine Gewohnheit, die ich vor vielen Jahren in einem Anfängerbuch gelernt habe, ist, meine Datenbankverbindungen immer explizit zu schließen.

Schreiben Sie nicht sechzehn Tastenanschläge, die den möglichen Speicher- und Verbindungsleck wert sind? Soweit es mich betrifft, seine billige Versicherung.

+0

Warum ein Downvote? Ich verkaufe Versicherungen, oder? –

3

FastCGI startet einen Master-Prozess und so viele Gabeln dieses Master-Prozesses, wie Sie definiert haben, und diese gegabelten Prozesse könnten für eine lange Zeit leben. Dies bedeutet, dass der Prozess nicht jedes Mal den vollständigen PHP-Prozess starten muss, wenn er ein Skript ausführen muss. Aber es ist nicht so, dass du denkst, dass deine Skripte jetzt die ganze Zeit laufen. Es gibt immer noch eine Start- und Abschaltphase, wenn ein Skript ausgeführt werden muss. An diesem Punkt sind Dinge wie globale Variablen (z. B. $_POST und $_GET) usw. belegt. Sie können Funktionen jedes Mal ausführen, wenn Ihr Prozess über register_shutdown_function() heruntergefahren wird.

Wenn Sie keine dauerhaften Datenbankverbindungen verwenden und Datenbankverbindungen nicht schließen, wird nichts Schlimmes passieren. Wie Colin Schoen erklärte, wird PHP sie eventuell während des Herunterfahrens schließen.

Noch, ich hoch ermutigen Sie, Ihre Verbindungen zu schließen, weil ein korrekt gestaltetes Programm weiß, wann die Lebensdauer eines Objekts vorbei ist und sich selbst reinigt. Es könnte Ihnen genau die Milli- oder Nanosekunde geben, die Sie brauchen, um etwas rechtzeitig zu liefern.

einfach immer schaffen sich geschlossene Objekte, die auch nach oben reinigen, nachdem sie mit fertig sind alles, was sie taten.

2

Wenn Sie lange FastCGI-Prozesse über z. php-fpm, können Sie Leistung durch die Wiederverwendung Ihrer Datenbankverbindung in jedem Prozess und vermeiden die Kosten für die Eröffnung eines.

Da Sie höchstwahrscheinlich eine Verbindung zu einem bestimmten Zeitpunkt in Ihrem Code öffnen, sollten Sie sich darüber informieren, wie mysqli eine persistente Verbindung öffnet und diese bei nachfolgenden Anfragen, die von demselben Prozess verwaltet werden, an Sie zurücksendet.

http://php.net/manual/en/mysqli.quickstart.connections.php

http://php.net/manual/en/mysqli.persistconns.php

In diesem Fall Sie nicht wollen, um die Verbindung zu schließen, sonst sind Besiegen Sie den Zweck es offen zu halten. Beachten Sie auch, dass jeder PHP-Prozess eine separate Verbindung verwendet, sodass Ihre Datenbank mindestens die gleiche Anzahl von Verbindungen gleichzeitig öffnen kann.

1

Sie haben recht in Ihrer Art zu denken. Es ist weiterhin wichtig, die Verbindung zu schließen, um Speicher-/Datenlecks und Beschädigungen zu vermeiden.

Sie können auch die Anzahl der pro Zyklus recycelten Scripte verringern, um die Verbindung zu beenden.

Zum Beispiel: jedes 2500 Skript läuft, zu stoppen und zu schließen und die Verbindung wieder zu öffnen.

Auch empfohlen: Daten häufig sichern.

Ich hoffe, ich half. Phantom