2009-11-18 19 views
13

Ich habe gelesen, dass beim Einbinden einer PHP-Datei, die absolute Pfade verwenden eine schnellere Verarbeitungszeit als relative Pfade hat.php relative und absolute Pfade

Was würden Sie vorschlagen zu verwenden?

include("includes/myscript.php"); 

oder

include("/home/ftpuser/public_html/includes/myscript.php"); 

oder sogar

set_include_path("/home/ftpuser/public_html/includes"); 
include("myscript.php"); 

Oder ist es etwas, das ich wirklich nicht kümmern sollte?

Antwort

15

ich eine Konstante in der Regel eingestellt, entweder manuell oder wie folgt aus:

define('ROOT', dirname(__FILE__)); 

Dann tun

require ROOT . '/include/file.php'; 
+0

Wenn Sie 'ROOT' haben, warum nicht' set_include_path (get_include_path(). PATH_SEPARATOR.ROOT) '? – chelmertz

+6

Da suchen Sie immer noch die Include-Pfade - auf diese Weise ist keine Suche erforderlich. – Greg

+0

Es ist eine ziemlich einfache/schnelle Suche, wenn Sie es zuerst setzen: 'set_include_path (ROOT.PATH_SEPARATOR.get_include_path())'. Außerdem könnte die Wartbarkeit beeinträchtigt werden, wenn viele Dateien enthalten sein müssen (in einer Antwort wird meine Meinung genauer ausgeführt.) – chelmertz

1

Wenn kein absoluter Pfad verwendet wird, versucht php, die Datei in allen Include-Pfaden zu finden, bis eine Übereinstimmung gefunden wird.

So viele Include-Pfade können hinzugefügt werden, wie Sie möchten, sodass dies in seltenen Fällen dazu führen kann, dass das Skript langsam ist.
Wenn Sie viele Dateien, einschließlich (zum Beispiel eines Rahmen zu initialisieren) mit absoluten Pfaden könnten das Skript ein wenig ...

Ich denke, es ist auch relativ Pfad/Dateiname pare mehr auftreten, wenn der gleiche Komplikationen verursachen beschleunigen könnte mal auf dem Dateisystem, und so wählt php das erste Vorkommen aus, wenn du vielleicht ein anderes Vorkommen brauchst.

0

Es wäre gut für dich, alle Methoden zu testen, indem du die Zeit für die Ausführung jedes einzelnen prüfst, persönlich habe ich mir nie darum gekümmert und benutzte nur relative Pfade.

Ich denke, absolute Pfade wären etwas schneller, es könnte sich lohnen zu fragen, was in einem Fehler passiert, wird es Ihren vollständigen Dateipfad zum Benutzerbildschirm ausspucken (offensichtlich error_reporting ausschalten) und wird dies ein Sicherheitsrisiko verursachen?

+1

Es spuckt vollständige Dateipfade aus, so weit ich weiß. Nur so kann man sicher sein, welche 'index.php' Sie meinen. –

3

Definiere deine Wege definitiv nicht, wie Option zwei. Eine gute Alternative ist:

define('BASE_DIR', '/home/ftpuser/public_html/includes'); 
include(BASE_DIR . '/myscript.php'); 
include(BASE_DIR . '/myscript2.php'); 
include(BASE_DIR . '/myscript3.php'); 
include(BASE_DIR . '/myscript4.php'); 

Betrachtet man wahrscheinlich irgendwo zwischen 5 und 50 enthalten (ich vermute) würde, würde mich nicht wirklich Sorgen. Gehe einfach mit relativen Pfaden. Der Include-Zeitunterschied wird nicht einmal bemerkbar sein. Wenn Sie eine große Webanwendung entwickeln und Hunderte davon haben, könnte das eine andere Geschichte sein ...

2

Ich neige dazu, meine Include-Verzeichnisse/Bibliotheken einzurichten, indem ich den Include-Pfad auf die Initialisierung meiner App setze.

set_include_path("/home/ftpuser/public_html/includes"); 
include("myscript.php"); 

Das zend-Framework tut etwas Ähnliches, um die Bibliotheksklassen zu laden.

8

Dies ist die beste Methode für die 99% der Fälle ist:

include(dirname(__FILE__)."/includes/myscript.php"); 

Dies endet als absoluter Pfad, was bedeutet, dass include_path ignoriert wird, was eine bekannte Quelle für einen ist eine große Anzahl von in Zusammenhang stehenden Bugs in meiner Erfahrung ...

Performance weise, aber ich bezweifle, es gibt viel Unterschied zwischen absoluten und relativen Pfaden. Dies ist eine Art Mikrooptimierung, die auf lange Sicht nichts bedeutet. Es gibt in der Regel nur 2-3 Dinge in include_path, es sei denn, Sie fügen mehr hinzu. Die zwei üblichen Täter sind ./ und der Pfad zu wo immer pear installiert ist.

1

Das Wichtigste ist, zu die Wege sind so anordnen, dass die größte Menge an require/include -calls im erstgenannten Weg gefangen werden, wenn eine Datei nicht über einen absoluten Pfad in erster Linie darunter.

Sich darauf zu verlassen, alles über einen absoluten Pfad einzuschließen, ist schwierig zu verwalten, da das Ändern des Pfads Ihrer Bibliothek das Ändern all dieser Dateien bedeutet, anstatt den Include-Pfad an einer Stelle zu ändern.

7

Ich schrieb ein einfaches Speed-Test-Skript mit microtime(true). Es testet die folgenden fünf einschließlich Verfahren mit einer Million Iterationen:

// Absolute path. 
include('/home/ftpuser/public_html/includes/myscript.php'); 

// Predefined path. 
define('PATH', '/home/ftpuser/public_html/includes/'); 
include(PATH . 'myscript.php'); 

// Relative path. 
include('myscript.php'); 

// Using set_include_path(). 
set_include_path('/home/ftpuser/public_html/includes/'); 
include('myscript.php'); 

// Superglobal path. 
include(dirname(__FILE__) . '/myscript.php'); 


die folgenden Ergebnisse (in Sekunden) ergab:

 
    Absolute path:   263.222 
    Predefined path:   263.545 
    Relative path:   301.214 
    Using set_include_path(): 302.396 
    Superglobal path:   269.631 


Meine Meinung auf der Grundlage dieser Ergebnisse ist eine verwenden, vordefinierter Pfad, weil es der schnellste ist, der nur von einem absoluten Pfad übertroffen wird. Ein absoluter Pfad hat jedoch den Nachteil, dass er in jeder Datei geändert werden muss, wenn eine Änderung erforderlich ist.

Hoffe das half. :)

P.S.
und set_include_path() wurden nur einmal während der Ausführung des Skripts verwendet (sie befinden sich außerhalb der Schleife).