PHP Caching ohne mit Dateiberechtigungen Messing (Auch, wie ASP Application-Variablen in PHP zu emulieren)

StackOverflow https://stackoverflow.com/questions/470399

Frage

Ich versuche, eine Art von Caching in einem PHP-Skript zu implementieren, die auf viele verschiedene Kunden / sites gehen wird, die von ziemlich technisch nicht versierten Benutzern eingesetzt werden, um eine Vielzahl von Web-Hosts verwenden. Aufgrund des nicht-technischen Charakter des Benutzers, würde Ich mag sie zu vermeiden, bitten Dateiberechtigungen zu zwicken. Der Caching muss über mehrere Sitzungen hinweg sein, also Variablen Sitzung verwendet, ist out. Wenn ich dies in ASP Codierung wurde ich Anwendungsvariablen verwenden würde, aber sie existieren nicht in PHP (meines Wissens)

Hat jemand irgendwelche Vorschläge, wie dies zu erreichen?

Hier sind einige Möglichkeiten, die ich in Betracht gezogen habe, keine Kommentare über diese wären nützlich:

  • Caching über Dateien in temporären Systemordnern - konnte ich sys_get_temp_dir () (oder ein Haus gerollt ähnliche Funktion auf PHP4), um einen solchen Ordner. Der Nachteil hierbei ist es wahrscheinlich nicht auf Hosts funktionieren würde die openbase_dir Einschränkung mit
  • Einige Website ich sah erwähnt PHP trickst in die Herstellung aller Benutzersitzungen die gleiche Sitzungsstatus teilen dabei Session-Variablen zu zwingen, wie Session-Variablen zu handeln. Natürlich kann ich nicht, dass Post jetzt finden ... Das ohnehin beängstigend scheint. (Ich werde aktualisieren Sie diese Frage mit dem Link zu diesem Beitrag, wenn ich es wieder finden)
  • einen Dritten Datenspeicher wie Simple Storage Service Amazon verwenden - scheint übertrieben
  • Cache die Daten auf einem Server, den ich kontrolliere, und hat den Client auf jedem Treffer neue Daten von dort heruntergeladen werden.

Wieder einmal keine Kommentare zu dieser Ideen oder jede neue geschätzt würde.

UPDATE: Ich habe versucht, mit session_id () einen gemeinsamen Sitzung Zustand zu verwenden, aber es funktioniert nicht. Jede Sitzung ist die Aufrechterhaltung seiner eigenen „GlobalCache“, irgendwelche Ideen, warum:

// This code doesn't work, but the similar code in my answer does!

function test() {
    if (!$_SESSION['session_count']) $_SESSION['session_count'] = 0;
    $_SESSION['session_count']++;


    $count = get_cache( 'count' );

    print "pre application count: $count<br>";

    if ( !$count )
        $count = 0;

    $count++;

    print "session_id: " . session_id() . "<br>";
    print "post application count: $count<br>";
    print "session_count: " . $_SESSION['session_count'] . "<br>";

    set_cache('count', $count);
}


function set_cache( $name, $value ) {
    $old_session = session_id();
    print "old_session (set): $old_session<br>";

    session_id("GlobalCache");
    print "new_session (set): " . session_id() .  "<br>";

    $_SESSION[$name] = $value;
    session_id( $old_session );
}

function get_cache( $name ) {
    $old_session = session_id();
    print "old_session (get): $old_session<br>";

    session_id("GlobalCache");
    print "new_session (get): " . session_id() .  "<br>";

    $value = $_SESSION[$name];
    session_id( $old_session );
    return $value;
}

session_start();
test();

UPDATE: einige haben vorgeschlagen, Memcached verwenden, die in der Tat ist eine großartige Lösung für einige, aber da ich es nicht die Kontrolle über die End-Server-Umgebung haben, ist keine Option. Die Idee ist, einen Skript zu haben, dass die Menschen nur FTP bis zu einem Shared-Hosting-Konto, das nur aus der Box funktioniert.

UPDATE: jemand vorschlug meinen eigenen Cache-Ordner mit dem Skript erstellen, aber brauche ich nicht einen solchen Ordner in einem Ordner zu erstellen, die bereits Schreibrechte hatte?

UPDATE LÖSUNG GEFUNDEN: ich beendet, die Probleme in meiner globalen Session Skript herauszufinden, und haben zu diesem Zweck meine eigene Antwort geschrieben. Danke für die Hilfe jedermanns Sache.

War es hilfreich?

Lösung

Okay, habe ich herausgefunden, wie man dies tun, indem Sie die Emulation ASP-Anwendungsvariablen einen gemeinsamen / globalen Sitzungszustand verwendet wird. Zwei wichtige Änderungen von meinem nicht-funktionierenden Code in der entsprechenden Update:

  1. Um den Sitzungszustand zu wechseln, müssen wir die aktuelle Sitzung, wechseln auf die neue beenden, dann starten Sie es. Ich habe diesen Prozess in switch_session gekapselt ()

  2. Da wir Session-IDs wechseln um wir die Seite der Ausgabe mit ob_start () / ob_end_flush (), so dass der Session-Cookie zu nicht bald gesendet Puffer haben.

Der vollständige Arbeits Code folgt (bereinigt auch!). Dies kann leicht durch das Laden der Seite in einem IE und Firefox-Fenstern und Nachladen jeweils mehrmals getestet werden, um die Zähler zu sehen steigen:

<?php
function test() {

    // Do a regular session count
    print "session_id: " . session_id() . "<br>";
    if (!$_SESSION['session_count']) $_SESSION['session_count'] = 0;
    $_SESSION['session_count']++;
    print "session count: " . $_SESSION['session_count'] . "<br>";


    // Do an application count
    $count = get_cache( 'count' );
    if ( !$count ) $count = 0;
    $count++;
    print "application count: $count<br>";
    set_cache('count', $count);
}


function set_cache( $name, $value ) {
    $old_session = switch_session("GlobalCache");
    $_SESSION[$name] = $value;
    switch_session( $old_session );
}

function get_cache( $name ) {
    $old_session = switch_session("GlobalCache");
    $value = $_SESSION[$name];
    switch_session( $old_session );
    return $value;
}

function switch_session( $session_id ) {

    // switch the session and return the original
    $old_id = session_id();

    session_write_close();
    session_id($session_id);
    session_start();
    return $old_id;
}

ob_start();
session_start();
test();
ob_end_flush();
?>

Andere Tipps

Sie können Sitzungen mit einem festen Sitzungsschlüssel verwendet werden.

http://de.php.net/manual/en /function.session-id.php :

  

session_id ([id]) wird verwendet, um die Sitzung id für die aktuelle Sitzung zu erhalten oder zu setzen.   Wenn id angegeben wird, wird es die aktuelle Session-ID ersetzt. session_id () muss vor session_start aufgerufen werden () für diesen Zweck.

Verwenden Sie Ihre eigenen Cache dir in Ihrer Anwendung Richt. Damit Sie müssen verschiedene Server und / oder PHP-Einstellungen und das beste Portabilität nicht kämpfen mit.

Ich wähle für „Cache, um die Daten auf einem Server ich kontrollieren, und haben der Client neue Daten herunterladen von dort auf jedem Treffer.“

Alle anderen Wege führen zu gewissen Wahnsinn.

Überprüfen Sie heraus Memcached für PHP- es funktioniert wirklich gut.

http://www.php.net/memcache

Ich habe die aktualisierte Funktion vom Autor als eine Möglichkeit, ein einfaches Datenbank-Abfrageergebnis zwischenzuzuspeichern, da ich hohe Belastung erwartet hatte. Ich gespeichert auch einen Zeitstempel, so dass ich definieren könnte, wie oft die Seite eher die Datenbank Ergebnis erneuern würde, als nur den zwischengespeicherten Wert nehmen.

Ich kann Ihnen sagen, dass diese Cache-Funktion viel schlechte Leistung viel viel hat als bei jeder Anfrage gerade für die Datenbank gehen. Ich tötete tatsächlich den Server. Sobald ich zurück, um einfach die Abfrage der Datenbank geschaltet der Server auf volle Geschwindigkeit stand auf und der ziemlich große Last war nicht einmal bemerkt.

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