2009-05-21 18 views
1

Ich entwickle eine Anwendung, wo ich eine Anforderung, die ich mehrere Dateien enthalten haben, wie folgt:Einschließlich Datei in PHP?

File1.php will include File2.php 

File2.php will include File3.php 

File3.php will include File4.php 

Nun, was die beste und optimiert werden Art und Weise diese zu tun. Ich habe versucht mit include(), aber ich denke, es verlangsamt meinen Server als meine Server Grafik laden geht ca. 3-5 mal höher als normale Serverlast.

Diese alle Dateien sind have Mittel 50 KB für jede Datei. Also kann mir bitte jemand vorschlagen, was die beste Option sein wird, um diese Dateien einzuschließen, so dass es die Geschwindigkeit der Seite nicht beeinflusst,

Welches wird am besten sein?

require() 

require_once() 

include() 

include_once() 

ODER wenn jemand eine andere Option hat dann erklären Sie mir bitte,

Dank

Antwort

2

Sie sollten Ihre Dateien neu organisieren. Habe eine "common.php" -Datei, die alle benötigten Dateien enthält. Du solltest keine solche Kette haben.

Ich bezweifle ernsthaft, dass ein paar Includes Ihren Server verlangsamen. Die meisten Web-Anwendungen haben Dutzende, vielleicht sogar Hunderte von PHP-Dateien. Es gibt keine Möglichkeit, dass 3 zusätzliche Dateien Ihre Anwendung so sehr verlangsamen.

Auch die Geschwindigkeitsdifferenz zwischen den genannten Funktionen Sie ist zu vernachlässigen, obwohl Sie include_once/require_once statt ihre Kollegen nutzen sollten, um sicherzustellen, dass Sie nicht die gleiche Datei mehrfach enthalten.

+0

Ich denke Dateiorganisation ist OK, caz Wenn ich common.php verwenden werde, um andere Dateien einzuschließen, wird File1 common.php enthalten und die common.php wird die reuiqred-Datei bekommen. Fast gleich mache ich schon .... – Prashant

+0

Überall im Netz habe ich gelesen, dass "include_once/require_once" langsamer sind als "include/require" und reuire langsamer ist als include ?? Ich bekomme nicht genau wer schreibt und wer ist falsch ??? – Prashant

+0

@Parshant: Ja, aber mein Weg wird viel besser organisiert sein und es wird in Zukunft besser zu warten sein. Ehrlich gesagt, hören Sie auf, sich über den sehr kleinen Geschwindigkeitsunterschied zwischen den Funktionen Sorgen zu machen. 0.000002 Sekunden langsamer wird dir nicht schaden. ;) –

0

Ihre Antwort wird auf Ihre Bedürfnisse ab, meistens. Punkte zu beachten sind:

  1. gehören ist schneller als erfordern.
  2. Wenn eine Datei "eingeschlossen" ist, aber nicht gefunden wird, führt dies nicht zu einem schwerwiegenden Fehler. Das Skript wird weiter ausgeführt.
  3. Wenn eine Datei "angefordert" wird, aber nicht gefunden wird, wird die Skriptausführung sofort gestoppt.

jedoch eine Randnotiz: , wenn Ihre Anwendung file4 in file3 file3 in Datei2 und Datei2 in Datei1 ist inklusive, dann würde ich sagen, dass Sie Ihre Datei Organisation überdenken sollen. Ich bin sicher, dass Sie eine bessere Möglichkeit finden, Ihren Code in Dateien zu organisieren.

ZUSATZ: Der Geschwindigkeitsunterschied zwischen enthalten und erfordern ist ziemlich gering. Require_once() ist jedoch wesentlich schwerer als require(). Gleiches gilt für include_once() und include().

prost,

JRH

+4

Haben Sie eine Quelle für die Geschwindigkeitsunterschiede zwischen include und require? Ich würde das gerne irgendwo testen sehen. – jergason

+0

In beiden Fällen wird die Geschwindigkeitsdifferenz einige Mikrosekunden betragen; nichts, worüber man sich ärgern könnte. –

+0

Nun, ich habe den Quellcode nicht. Aber ich erinnere mich genau, dass ich es in einer Dokumentation gelesen habe. Aber ja, die paar Mikrosekunden Differenz ist es kaum wert, sich darüber zu ärgern. – jrharshath

3

Der Unterschied zwischen include() und require(), ob Sie eine Warnung oder einen fatalen Fehler (jeweils) zu bekommen. Die PHP-Dokumente erwähnen keinen Leistungsunterschied.

Die Verwendung der _once() - Varianten ist nützlich, wenn Sie den Inhalt der enthaltenen Dateien nicht duplizieren möchten. Vom PHP docs für include_once:

include_once() kann in Fällen verwendet werden, wo die gleiche Datei enthalten sein können und mehr als einmal während einer bestimmten Ausführung eines Skripts ausgewertet, so dass in diesem Fall es solche Probleme vermeiden helfen kann als Funktionsredefinitionen, Neuzuweisungen von Variablenwerten usw.

0

Ich spalte lieber alles in so viele Dateien, wie es für mich praktisch ist, um es zu entwickeln, aber dann flacht alles in eine Datei ab, bevor ich es auf den Server hochlade.

PHP String und Regex-Funktionen machen es sehr einfach, ein Skript zu schreiben, das alle Include 'somefile.php' ersetzen wird; mit dem tatsächlichen Inhalt dieser Datei (Stripping <?>> falls erforderlich).

+0

Haben Sie die Beschleunigung davon gemessen? Ich würde gerne wissen, ob das sichtbare Auswirkungen auf die Leistung hat. –

+0

Kannst du es bitte an mich weitergeben, indem du irgendein Beispiel dieser Art gibst ??? – Prashant

0

Wählen Sie auf jeden Fall include() oder require() über die '*_once()' Varianten. Sie benötigen wahrscheinlich eine Art von opcode cache, um Ihre Leistung zu verbessern.

2

Jusn eine Anmerkung zu wissen. In einem meiner Projekte musste ich eine Art Fabrik für viele Klassen einrichten (ca. 50). Ich habe eine Datei für jede Klasse erstellt und sie eingeschlossen war dramatisch langsam. Ich beschloss, sie in eine Datei zu verbinden. Diese erhöhte Leistung ist sehr spürbar.

Ich denke, es ist mit Dateisystem Verlangsamungen verbunden, wenn es viele Einträge gibt ... Nicht sicher, warum es so ist, aber Fakt - enthalten von 1 großen Datei viel schneller als 50 kleine.

+0

Wahr, aber der Unterschied zwischen 1 Datei und 4 wird viel kleiner sein. –

+0

Auch wahr, aber wenn Sie 4 statt 1 verwenden und tun dies 10 mal in einem Projekt ... 4 * 10 = 40 statt 10 ... Nun, das ist nur eine Anmerkung und, möglicherweise, offtopic. Ich meine nur "behalte dieses Problem im Hinterkopf". – Jet

0

Ich würde vorschlagen, mit xdebug PHP extention, um Ihr Skript zu benchmarken und zu profilieren. Es wird Ihnen sagen, wie lange jede Funktion dauerte. Sie finden weitere Informationen zur Installation und was es hier tun kann: http://www.xdebug.org/

2

Ein Artikel auf Tech Your Universe spricht über die require vs require_once issue. In essense, wenn Absolute Pfaderequire() ist definitiv schneller als require_once() und include() ist definitiv schneller als include_once(). Ihre genauen Ansprüche, wenn sie die einmal ersetzt Anrufe mit der sans-einmal ruft:

Zuerst Strace ergab, dass es 2848 syscalls war, eine Seite zu dienen, nach unten von 4782 (-40%). Als nächstes ging ich zu für mehr Tests, und festgestellt, dass die durchschnittliche Seitenanforderung Zeit sank auf 36,5, von 46,5ms (-22%), und der Server konnte 27,1 Anfragen pro Sekunde, ab 21.4 (+% 22).

Nach comment 90017 by Konstantin Rozinov on the require_once page on php.net, der Unterschied zwischen require() und require_once() ist winzig klein und macht nur einen Unterschied zu großen Web-Anwendungen. Ich persönlich würde gerne eine Definition von groß, aber ich denke, wir bekommen die Idee. Der Kommentator behauptet auch, dass "bei der Verwendung von APC-Opcode-Caching der Geschwindigkeitsunterschied zwischen den beiden völlig irrelevant ist." In Bezug auf die tatsächliche Implementierung von require und require_once: "Dies zeigt, dass entweder das Betriebssystem (Ubuntu Linux in meinem Fall) oder Apache" caching "oder kennt die Ergebnisse der vorherigen stat() -Aufrufe, so dass es nicht die Mühe macht, sie zu wiederholen . " Nimm das für das, was es wert ist.

Meine persönliche Summe:

  • Wenn Sie require_once, Versuch verwenden werden absolute Pfade zu verwenden.
  • Achten Sie darauf, Opcode-Caching von irgendeiner Art zu verwenden.
+0

+1 für die Angabe absoluter Pfade! – powtac