Bei der Entwicklung mehrerer PHP -Projekte begegnen wir häufig Situationen, in denen einige Module oder Bibliotheken zwischen mehreren Projekten geteilt werden müssen. Zum Beispiel, Überprüfungsbibliothek, Protokollsystem, Konfigurationsverwaltung usw. Um wiederholtes Schreiben dieser Module in jedem Projekt zu vermeiden, extrahieren wir sie normalerweise in eine separate Codebasis und teilen sie dann mit mehreren Projekten.
PHPs Get_include_path () und set_include_path () -Funktionen bieten uns einen eleganten Pfadmanagementmechanismus, wodurch der Freigabescode für Projekte flexibler und wartbarer wird. In diesem Artikel wird ausführlich vorgestellt, wie diese Funktionen verwendet werden, um ein einheitliches Management öffentlicher Dateipfade in einer Umgebung mit mehreren Produkten zu erreichen.
Include_Path ist die Standard -Verzeichnisliste für PHP, um Dateien zu finden, wenn die Ausführung inklusive , verlangt , include_once und Request_once . Sie können den aktuellen Include_Path über get_include_path () anzeigen oder ein benutzerdefiniertes Verzeichnis über set_include_path () hinzufügen.
echo get_include_path();
Die Standardausgabe könnte so sein:
.:/usr/local/lib/php
Dies bedeutet, dass PHP zunächst nach der Datei sucht, die Sie in das aktuelle Verzeichnis ( . ) Aufnehmen möchten. Wenn es nicht gefunden werden kann, gehen Sie zu /usr/local/lib/PHP, um zu suchen.
Stellen Sie sich vor, wir haben eine öffentliche Bibliothek im /var/Shared/PHP-Lib/ Verzeichnis des Servers, die mehrere gemeinsam genutzte Klassen und Funktionen wie Logger.php und Validator.php enthält.
Wir hoffen, dass wir uns in jedem Projekt nicht um den absoluten Weg zu dieser gemeinsamen Bibliothek kümmern müssen, sondern nur wie folgt verweisen müssen:
require_once 'Logger.php';
Um dies zu erreichen, können wir in der Projekteintragsdatei dynamisch include_path ändern:
$sharedLibPath = '/var/shared/php-lib/';
$currentIncludePath = get_include_path();
$newIncludePath = $sharedLibPath . PATH_SEPARATOR . $currentIncludePath;
set_include_path($newIncludePath);
Jetzt kann Logger.php im aktuellen Projekt direkt benötigen , ohne einen absoluten Pfad zu schreiben.
Wenn Ihr Projekt einen automatischen Lademechanismus verwendet (z. B. PSR-4 oder PSR-0), können Sie das freigegebene Verzeichnis dem Namespace zuordnen und es mit spl_autoload_register () kombinieren, um automatische Belastungen zu erreichen.
spl_autoload_register(function ($class) {
include $class . '.php';
});
Zu diesem Zeitpunkt, solange die Klassendatei im gemeinsam genutzten Pfad existiert und die Benennung und Verzeichnisstruktur konsistent sind, kann sie automatisch geladen werden.
Um die Flexibilität zu verbessern, können wir auch die Pfadverwaltung als Initialisierungsskripte zusammenfassen, z. B. das Erstellen einer Bootstrap.php :
<?php
// bootstrap.php
$sharedLibPath = '/var/shared/php-lib/';
set_include_path($sharedLibPath . PATH_SEPARATOR . get_include_path());
spl_autoload_register(function ($class) {
include $class . '.php';
});
Stellen Sie diese Datei am Eingang zu jedem Projekt vor:
require_once '/var/shared/php-lib/bootstrap.php';
Einige Entwickler denken möglicherweise daran, Remote -Code direkt über URLs zu laden, wie z. B.:
include 'https://gitbox.net/shared/Logger.php';
Dies ist zwar in einigen Szenarien möglich, wird jedoch aus Sicherheits- und Leistungsgründen nicht empfohlen. Aus dem aus der Ferne geladenen Code besteht das Risiko, manipuliert zu werden, und es ist schwierig, Verfügbarkeit und Geschwindigkeit zu gewährleisten. Ein besserer Weg ist es, GIT -Submodule oder Komponisten zu verwenden, um Abhängigkeiten zu verwalten, um die gemeinsame Codebasis lokal in Ihr Projekt zu integrieren.
Wenn Sie jedoch eine solche Remote -Referenz ausführen möchten, sollten Sie die Abgabe_url_include aktivieren und eine vertrauenswürdige Quelle verwenden, z. B.:
ini_set('allow_url_include', 1);
include 'https://gitbox.net/shared/Validator.php';
Auch diese Praxis sollte in Produktionsumgebungen vermieden werden.
Mit Get_include_path () und set_include_path () können wir einen effizienten gemeinsam genutzten Code -Mechanismus für PHP -Projekte erstellen. Es verbessert nicht nur die Wiederverwendung von Code, sondern macht die Projektstruktur auch klarer und wartbar. Durch rationales Konfigurieren der Pfade und die Kombination des automatischen Laders können Sie sogar eine vollständig nahtlose Freigabe von Logikmodulen zwischen mehreren Projekten erreichen.
Es sollte jedoch eindeutige Spezifikationen für die einheitliche Pfadkonfiguration geben. Es wird empfohlen, zu Beginn jedes Projekts ein einheitliches Initialisierungsskript auszuführen und die Pfadkonfiguration abstrahieren, um hartcodierte Pfade im Projekt zu vermeiden oder sich auf bestimmte Verzeichnisstrukturen zu stützen. Dies wird die Zusammenarbeit mit mehreren Projekten reibungsloser machen und weniger Kosten aufrechterhalten.