Frage

Für unsere Online-Spiel haben wir Tonnen von PHP-Klassen und Funktionen nach Themen in Dateien gruppiert geschrieben und dann Ordner. Am Ende haben wir jetzt alle unsere Backend-Code (Logik & DB-Zugriff Schichten) in einer Reihe von Dateien, die wir libs anrufen und wir sind unsere Libs in unserer GUI (Webseiten, Präsentationsschicht) unter Verwendung von include_once ( 'pathtolib / file.inc') .

Das Problem ist, dass wir mit Einschlüssen faul gewesen sein und die meisten beinhalten Aussagen in unserer Libs Datei gemacht führt, dass von jeder Webseite, jedes Mal, wenn wir all Libs-Datei enthalten, können wir die gesamte Libs tatsächlich laden, Datei für Datei.

Dies hat erhebliche Auswirkungen auf die Leistung. Deshalb Was ist die beste Lösung wäre?

  • Entfernen Sie alle Anweisungen aus der Libs-Datei enthalten und nur notwendige, von den Webseiten nennen?
  • Sie etwas anderes?

Server verwendet einen klassischen LAMP-Stack (PHP5).

EDIT: Wir haben eine Mischung aus einfachen Funktionen (legacy Vernunft und die Mehrheit des Codes) und Klassen. So automatisch geladen wird nicht genug sein.

War es hilfreich?

Lösung

  • Verwalten Sie beinhaltet manuell, nur bei Bedarf
  • Stellen Sie Ihren include_path nur dort, wo es sein muss, ist die Standardeinstellung so etwas wie:. / Usr / lib / Birne /: / usr / lib / php, zeigen sie nur an, wo es sein muss, php.net/ set_include_path
  • Verwenden Sie Autoload nicht, es ist langsam und macht APC und gleichwertige Caches Arbeitsplätze viel schwieriger
  • Sie können die „stat“ -Betrieb in APC ausschalten, aber dann müssen Sie jedes Mal, wenn Sie manuell den Cache löschen aktualisieren Sie die Dateien

Andere Tipps

Wenn Sie Ihre Programmierung in einer objektorientierten Art und Weise getan haben, können Sie die Verwendung des automatischen Laden machen Funktion, die Klassen von ihren Quelldateien auf Abruf geladen wird, wie Sie sie nennen.

Bearbeiten : Ich habe bemerkt, dass jemand beide Antworten Downvoted, die auf das automatische Laden bezeichnet. Sind wir nicht in Ordnung? Ist der Aufwand für die __autoload Funktion zu hoch es Zwecke, für die Leistung zu benutzen? Wenn es etwas gibt, ich bin nicht über diese Technik zu realisieren, würde ich wirklich daran interessiert zu wissen, was es ist.

Wenn Sie wirklich harten Kern erhalten wollen, einige statische Analyse, und genau herauszufinden, welche Bibliotheken benötigt werden, wenn und nur schließen diejenigen ein.

Wenn Sie include verwenden und nicht include_once, dann gibt es ein bisschen eine Geschwindigkeit Einsparungen auch dort.

Alles, was gesagt, Matts Antwort über das Zend Optimizer ist direkt auf das Geld. Wenn Sie wollen, versuchen Sie das Advanced PHP Cache (APC), die ein Opcode-Cache und kostenlos. Es sollte in der PECL-Repository sein.

könnten Sie verwenden spl_autoload_register () oder __autoload () zu schaffen, was Sie für die Aufnahme der Dateien Regeln brauchen, die Sie für die Klassen müssen jedoch automatisches Laden führt seine eigene Leistung Gemeinkosten. Sie werden sicherstellen müssen, was auch immer Sie auf alle gui Seiten verwenden vorangestellt eine php.ini Einstellung oder eine Apache-Konfiguration verwendet wird.

Für Ihre Dateien mit generischen Funktionen, würde ich vorschlagen, dass Sie sie in eine Utility-Klasse wickeln und eine einfache Entdeckung machen und ersetzen Sie alle Ihre Funktion ersetzen () ruft mit util :: function (), die dann Sie ermöglichen würde, Autoload diese Funktionen (auch hier gibt es einen Overhead Aufruf einer Methode eingeführt, anstatt eine globale Funktion).

Im Wesentlichen das Beste ist, zurück durch den Code zu tun, gehen und Design Schulden tilgen durch die Themen sind fixiert. Dies gibt Ihnen die Performance-Vorteil, und es erlaubt Ihnen, das Beste aus Optimierer wie eAccelerator, Zend Platform und APC

zu machen

Hier ist ein Beispiel Verfahren zum Laden von Material dynamisch

public static function loadClass($class)
{
    if (class_exists($class, false) ||
        interface_exists($class, false))
    {
        return;
    }

    $file = YOUR_LIB_ROOT.str_replace('_', DIRECTORY_SEPARATOR, $class).'.php';

    if (file_exists($file))
    {
        include_once $file;
        if (!class_exists($class, false) &&
            !interface_exists($class, false))
        {
            throw new Exception('File '.$file.' was loaded but class '.$class.' was not found');
        }
    }
}

Was ist Ihre Suche ist Automap PECL-Erweiterung .

Es ermöglicht im Grunde für die automatische Beladung mit nur einem kleinen Aufwand für eine vorausberechnete Map-Datei geladen werden. Sie können auch die Map-Datei Unter teilen, wenn Sie ein bestimmtes Verzeichnis wissen wird nur von bestimmten PHP-Dateien ziehen.

Sie können mehr darüber lesen hier .

Es ist schon eine Weile her, seit ich verwenden php, sollte aber nicht der Zend Optimizer oder Cache-Hilfe in diesem Fall? Ist PHP immer noch jede Datei enthalten wieder für jede Anforderung laden und kompilieren?

Ich bin mir nicht sicher, ob das automatische Laden ist die Antwort. Wenn diese Dateien enthalten sind, werden sie wahrscheinlich in der Klasse benötigt einschließlich es, so werden sie immer noch irgendwie automatisch geladen werden.

einen Bytecode Cache verwenden (idealerweise APC), so dass PHP muss nicht die Bibliotheken auf jeder Seite zu laden, analysieren. Beachten Sie, dass automatisches Laden verwendet, wird die Vorteile der Verwendung eines Bytecode Cache negieren (können Sie mehr über diese lesen hier ).

Verwenden Sie einen Profiler rel="nofollow. Wenn Sie versuchen, ohne Maßnahmen zu optimieren, Sie arbeiten blind.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top