[英]PHP Caching without messing with file permissions (Also, How to emulate ASP Application variables in PHP)
我正在嘗試在PHP腳本中實現某種緩存,這些緩存將發送到許多不同的客戶端/站點,這些客戶端/站點將由相當非技術的用戶使用各種Web主機進行部署。 由於用戶的非技術性,我想避免要求他們調整文件權限。 緩存需要跨會話,因此使用會話變量。 如果我在ASP中編寫這個,我會使用應用程序變量,但它們不存在於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樣式的應用程序變量來解決這個問題。 我在相關更新中的非工作代碼的兩個主要更改:
要切換會話狀態,我們必須結束當前會話,切換到新會話,然后啟動它。 我在switch_session()中封裝了這個過程
由於我們正在切換會話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-它的效果非常好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.