Wie bekommen Sie PHP, Symlinks und __FILE__ gut zusammen?
Auf localhost. Ich habe die folgende Verzeichnisstruktur:
/share/www/trunk/wp-content/plugins/otherfolders
/share/www/portfolio/wp-content/symlink
Wo symlink
ist ein symbolischer link zu /trunk/.../plugins/
. Im Grunde, das ist, weil ich brauche, um zu testen, mehrere WordPress installiert und eingerichtet, aber ich will nicht zu haben, sich zu bewegen-plugins um, und kopieren Sie und fügen Sie Sie überall.
Aber manchmal muss ich krabbeln die Verzeichnisstruktur, um eine config-Datei:
$root = dirname(dirname(dirname(dirname(__FILE__))));
if (file_exists($root.'/wp-load.php')) {
//WP 2.6
require_once($root.'/wp-load.php');
}
Den Ordner immer aufgelöst:
/share/www/trunk
Selbst wenn das plugin ausgeführt wird, und in
/share/www/portfolio/
.
Ist es möglich in PHP mit include-Dateien in den share/www/portfolio
Verzeichnis von einem Skript aus ausführen in ein symlink auf die /share/www/trunk/.../plugins
Verzeichnis?
Während dieses problem tritt nur auf meinem test-server, ich würde gern sicher verteilbare Lösung so Crawlen eine zusätzliche Ebene ist nicht eine option.
InformationsquelleAutor der Frage Aaron Harun | 2010-07-11
Du musst angemeldet sein, um einen Kommentar abzugeben.
Das problem, dass ich sehe, mit deinem code ist, dass
__FILE__
löst symlinks automatisch.Aus dem PHP-Handbuch auf Magische Konstanten
Können Sie versuchen, mit
$_SERVER["SCRIPT_FILENAME"]
statt.Hinweis, dass ich die
realpath()
- Funktion, um das root-Verzeichnis. Je nach Einrichtung, können Sie oder können nicht brauchen.BEARBEITEN: Verwenden Sie
$_SERVER["SCRIPT_FILENAME"]
statt$_SERVER["PHP_SELF"]
für die Datei system Pfad.InformationsquelleAutor der Antwort pferate
Können Sie dieses code-snippet um einen Pfad, in dem symbolische Links nicht aufgelöst.
Wenn Sie nicht über die bash zur Verfügung, wahrscheinlich gibt es einen anderen Befehl, den Sie verwenden können, aber es funktioniert auf linux-Umgebungen.
Ich denke es ist ein Kunstfehler, php löst symlinks in DATEIdenn es gibt keinen Weg, um den Pfad mit symlinks. Sonst könnten wir leicht bekommen es mit realpath.
Naja.
InformationsquelleAutor der Antwort Dag
In einigen Fällen ist es möglich, um change working dir, und verwenden Sie getenv('PWD'):
Arbeiten und ändern Verzeichnis, bevor Sie diesen code ausführen:
InformationsquelleAutor der Antwort AndreyP
Den PHP-interpreter löst symlinks, bevor es verarbeitet wird. Sie können dies selbst tun, mit der
readlink
Funktion. PHP löst den links, weil es effizienter für*_once
Funktionen und code-caches wie APC, Xcache etc..Was Sie vermutlich brauchen, ist ein anderer Weg, um herauszufinden, wo eine bestimmte installation speichert es die Dateien. Ich würde empfehlen, mit
{$_SERVER['DOCUMENT_ROOT']}/wp-content/wp-load.php
vorausgesetzt/share/www/portfolio
ist der document-root.InformationsquelleAutor der Antwort jmz
Hier ist die Lösung für dieses Problem: https://github.com/logical-and/symlink-detective
oder Sie können versuchen, die
InformationsquelleAutor der Antwort And
Wenn ich versucht dieses Problem zu lösen, würde ich die split
__FILE__
den Weg entlang bits und erstellen Sie eine SplFileInfo für jeden auf dem Weg, der test mit isDir und isLinkdann versuchen zu bestimmen, zu behandeln, wie die Rekonstruktion des Weges, sobald es bekannt ist, anders zu sein als erwartet, so dass Sie ziehen Sie aus dem richtigen Verzeichnis. (Wenn Sie eher ein prozeduraler Typ, es gibt is_dir und is_link.)That being said, ich glaube du hast dich bereits disqualifiziert diese Lösung. Vielleicht sind die tools sind intelligent genug, um es für Sie tun. Versuchen Vergleich das Ergebnis der getRealPath zu getPath? getRealPath ausdrücklich sagt, dass es löst symlinks, während getPath nicht ausdrücklich sagen.
Sogar dann, dieses schnüffeln möglicherweise nicht sicher auf Kunden-Websites, je nachdem, wer der host ist. Ich habe gesehen, einige ziemlich kreative shared-hosting-Dateisystem-setups. Man könnte hinzufügen, eine Prüfung zu php_uname und ziehen Sie den Hostnamen der Maschine an, und wenn es nicht deine dev-box, nicht über die zusätzliche Arbeit.
InformationsquelleAutor der Antwort Charles