2012-04-27 46 views
2
  • APC版本:3.1.9。
  • PHP版本:5.2.17
  • 我使用的Litespeed
  • 默認的PHP:5
  • PHP4 SAPI:CGI
  • PHP5 SAPI:DSO
  • 的SuExec:啓用

創建2文件。 第一個文件,設置APC VAR:APC:apc_fetch經常返回false,但有時成功

<?php 
$bar = 'BAR'; 
apc_store('foo_test', $bar); 
echo 'stored'; 
?> 

第二個文件,試圖讓APC VAR:

<?php 
var_dump(apc_fetch('foo_test')); 
?> 

我參觀了第一個文件,一切都很好。 我打開第二個文件,我刷新了幾次,通常(幾乎90%),它返回false。很少返回正確的迴應。

這是我的APC設置。

apc.cache_by_default 1 
apc.canonicalize 1 
apc.coredump_unmap 0 
apc.enable_cli 1 
apc.enabled 1 
apc.file_md5 0 
apc.file_update_protection 2 
apc.filters 
apc.gc_ttl 3600 
apc.include_once_override 0 
apc.lazy_classes 0 
apc.lazy_functions 0 
apc.max_file_size 20M 
apc.mmap_file_mask 
apc.num_files_hint 1000 
apc.preload_path  
apc.report_autofilter 0 
apc.rfc1867 0 
apc.rfc1867_freq 0 
apc.rfc1867_name APC_UPLOAD_PROGRESS 
apc.rfc1867_prefix upload_ 
apc.rfc1867_ttl 3600 
apc.serializer default 
apc.shm_segments 1 
apc.shm_size 512M 
apc.slam_defense 1 
apc.stat 0 
apc.stat_ctime 0 
apc.ttl 0 
apc.use_request_time 1 
apc.user_entries_hint 4096 
apc.user_ttl 7200 
apc.write_lock 1 
+0

如果您嘗試手動設置ttl,它的行爲方式是否相同? 'apc_store('foo',$ bar,1800);' – arma 2012-04-27 14:33:55

回答

2

我的猜測是Litespeed正在使用FastCGI運行PHP。所以它產生了一些子進程,然後在它們之間發送請求。問題是,可能是 APC將數據存儲在堆內存(不在共享內存中),因此每個FastCGI實例都有它自己的APC數據。一個實例中的數據在其他實例中不可見。您在實例#1中設置數據,但是您的獲取請求轉到實例#2,實例#3 ...並且您獲得FALSE。當你點擊實例#1時,你會收到保存的值。

編輯:用--disable-apc-mmap編譯APC模塊(禁用mmap支持並改用IPC shm)應該可以解決這個問題。

+0

謝謝我會試試.. – Sempa 2012-04-27 16:17:10

+0

@strkol你是正確的,APC不會在子進程之間共享它的緩存 - 這是使用memcache會更好的選擇。 – damianb 2012-04-27 19:41:35

+0

我檢查後,我使用SuPHP,而不是FastCGI。我應該使用'--disable-apc-mmap'嗎? – Sempa 2012-04-28 01:01:40