2013-02-13 145 views
0

是否可以讓PHP服務器(通過php5-fpm)在啓動後立即運行PHP腳本,並且在客戶端訪問它之前運行它,以便執行變量的初始化爲APC在啓動時運行PHP腳本(APC變量初始化)

基本上某些事件被服務器生命期間經由apc_inc計數,像

apc_inc('event-xyz-happened'); 

事件-XYZ-發生 APC變種是永久的(壽命服務器壽命,不請求壽命)。

問題是,在第一次增加(不像Perl)時,APC var必須存在。 apc_inc是蠻快的,我想避免像

if (! apc_exists('event-xyz-happened')) { 
    apc_store('event-xyz-happened', 1); 
} 
else { 
    apc_inc('event-xyz-happened'); 
} 

的解決方案,不僅需要調用apc_exists('event-xyz-happened'),也可以從比賽疾病的困擾時還不存在它。

-

有沒有一種解決方案來創建一些APC變量客戶端訪問服務器之前?

+0

說不上約PHP5-FPM但我知道,在工作中,我們將在我們的虛擬主機的配置在以下apache這看起來實現類似的東西,你到底是什麼: 'php_value auto_prepend_file/var/www/xhprof_gui/xhprof_session.php – Jason 2013-02-13 09:23:24

+0

@Jason這是設置配置指令,而不是APC變量(加號,我使用* nginx *) – 2013-02-13 09:25:21

回答

2

您可以使用apc_add其次apc_inc(見http://www.php.net/manual/en/function.apc-add.php

// if it doesn't exist, it gets created 
// if it does exist, nothing happens, no race condition 
apc_add('event-xyz-happened', 0); 
apc_inc('event-xyz-happened', 1); 
+0

確實是個好主意。我仍然更喜歡*初始化*解決方案,這將避免'apc_add'開銷。但這是迄今爲止最好的選擇。 – 2013-02-13 10:07:15

0

您不應該爲此使用apc變量。

APC是一個緩存引擎,它不是一個快速的數據庫引擎。 作爲一個緩存引擎,它可以並且遲早地移除你的變量來清除其他變量或操作碼緩存的內存。您分配給APC的內存越多,您的變量將被刪除的可能性越小,但您不能確定該變量會在那裏。

所有的php腳本都必須檢查變量是否在apc緩存中,如果不是,則初始化它。

如果您需要以非常快的速度存儲一些變量,您可以設置一個本地mysql服務器並創建一個帶有「內存」引擎的表格。它幾乎和apc一樣快,但只要服務器正在運行,我就會成爲permament。

好運 SWilk

+0

這是不正確的。如果未指定[* ttl *](http://www.php.net/manual/en/function.apc-store.php),則該變量不會過期(只要有可用內存)。至於在數據庫中創建一個*內存*表,我在性能之後,並且我懷疑數據庫中的inc + query + fetch ...可能甚至接近'apc_inc'(它會返回增加的值)的表現。 – 2013-02-13 10:13:33

+0

我只是說,你不能依賴緩存中的變量beeing。如果內存不足並且沒有變量ttl用完,則整個緩存將被清除。請參閱 http:// stackoverflow。com/questions/1053810/php-apc-what-happens-when-apc-cache-is-full 由於mysql內存表的性能,我可能會誇大了一點;) – SWilk 2013-02-13 10:50:56

+0

當然,謝謝,我依靠緩存。這就是爲什麼要採取所有預防措施 - 自動檢查腳本,大量內存 - 不要溢出分配給緩存的內存。內存將不會溢出。 – 2013-02-13 10:57:55