簡體   English   中英

PHP緩存而不會弄亂文件權限(另外,如何在PHP中模擬ASP應用程序變量)

[英]PHP Caching without messing with file permissions (Also, How to emulate ASP Application variables in PHP)

我正在嘗試在PHP腳本中實現某種緩存,這些緩存將發送到許多不同的客戶端/站點,這些客戶端/站點將由相當非技術的用戶使用各種Web主機進行部署。 由於用戶的非技術性,我想避免要求他們調整文件權限。 緩存需要跨會話,因此使用會話變量。 如果我在ASP中編寫這個,我會使用應用程序變量,但它們不存在於PHP中(據我所知)

有沒有人對如何做到這一點有任何建議?

以下是我考慮過的一些可能性,對這些的任何評論都會有用:

  • 通過系統臨時文件夾中的文件進行緩存 - 我可以使用sys_get_temp_dir()(或PHP4上的一些家庭滾動類似功能)來幫助找到這樣的文件夾。 這里的缺點是它可能不適用於使用openbase_dir限制的主機
  • 我看到的一些網站提到欺騙PHP使所有用戶會話共享相同的會話狀態,從而迫使會話變量像會話變量一樣工作。 當然我現在找不到那個帖子......無論如何這似乎很可怕。 (一旦我再次找到,我會用這個帖子的鏈接更新這個問題)
  • 使用像亞馬遜的簡單存儲服務這樣的第三方數據存儲 - 看起來有點過分
  • 在我控制的服務器上緩存數據,讓客戶端在每次點擊時從那里下載新數據。

再次,對這些想法或任何新想法的任何評論將不勝感激。

更新:我嘗試使用session_id()來使用共享會話狀態,但它不起作用。 每個會話都維護自己的“GlobalCache”,任何想法為什么?:

// 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();

更新:一些人建議使用memcached,這對某些人來說實際上是一個很好的解決方案,但由於我無法控制終端服務器環境,因此不能選擇。 我們的想法是創建一個腳本,人們可以將FTP直接發送到一個開箱即用的共享主機帳戶。

更新:有人建議用腳本創建我自己的緩存文件夾,但是我不需要在已經具有寫權限的文件夾中創建這樣的文件夾嗎?

更新,解決方案:我最終找出了我的全局會話腳本中的問題,並發布了我自己的答案。 感謝大家的幫助。

好吧,我想通過使用共享/全局會話狀態模擬ASP樣式的應用程序變量來解決這個問題。 我在相關更新中的非工作代碼的兩個主要更改:

  1. 要切換會話狀態,我們必須結束當前會話,切換到新會話,然后啟動它。 我在switch_session()中封裝了這個過程

  2. 由於我們正在切換會話ID,因此我們必須使用ob_start()/ ob_end_flush()緩沖頁面的輸出,以便不會過早發送會話cookie。

完整的工作代碼如下(清理過來!)。 這可以通過在IE和Firefox窗口中加載頁面輕松測試,並重新加載幾次以觀察計數器上升:

<?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();
?>

您可以使用具有固定會話密鑰的會話。

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

session_id([id])用於獲取或設置當前會話的會話id 如果指定了id,它將替換當前的會話ID。 為此,需要在session_start()之前調用session_id()。

在應用程序的目錄中使用自己的緩存目錄。 因此,您不必為各種服務器和/或PHP設置而煩惱,並獲得最佳的可移植性。

我使用作者更新的函數作為緩存簡單數據庫查詢結果的方法,因為我期待高負載。 我還存儲了一個時間戳,以便我可以定義頁面更新數據庫結果的頻率,而不僅僅是獲取緩存的值。

我可以告訴你,這個緩存函數的性能比在每次請求時直接訪問數據庫要糟糕得多。 我實際上殺了服務器。 一旦我切換回簡單查詢數據庫,服務器就全速運行,甚至沒有注意到相當大的負載。

我投票支持“在我控制的服務器上緩存數據,讓客戶端在每次點擊時從那里下載新數據”。

所有其他路徑都會導致某種瘋狂。

查看memcached for php-它的效果非常好。

http://www.php.net/memcache

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM