php全局变量问题,求救。。。
我准备写一个简单的查询程序,
需求如下,每隔20秒到另外一个监控程序 取数和据,然后把在这些数据缓存起来,供应大规模地查询。。。
监控取回来的数据很小,只有几行。
我的问题是如何在内存中存储这这些数据,目前我用global 变量每次访问后都被清零,无法做到缓存作用。。
如果每次有人访问 我都从数据库或者监控取的话太慢了。。。 本帖最后由 fiendcly 于 2012-08-22 08:11 编辑
這種情況你要建立一個 Process , 讓它一直 Work.
不過這種長時間 Work 的 Process 不建議你用 PHP.
因為 PHP 是 Script 語言 , 加上它一直以來都是 透過~FAST-CGI 或 PHP-FPM 與 HTTP SERVER 溝通.
它們的溝通方式也一直都是用 短連結 ( SOCKET 連結溝通完就斷開 ) 的方式溝通.
我記得九年前在我還不是很懂 PHP 特性時我常不小心犯這種錯.
把 PHP 當一個 DEAMON 而服務常無故斷掉. ( PHP 的記憶體控制很差 ) , 因為專案己經寫了一陣子無耐只好 寫支 watch dog 每分鐘去檢查服務是不是還在.
所以我很來一律都用 crontab -e每分鐘做一次.
但是這次你的需求是每20秒做一次.
我建議你用 C/C++ 做一個 長時間的 PROCESS 來解決這個問題.
長時間背景執行這個 PROCESS 的語法
nohup php -q test.php <<< 類似這樣 但是不建議你這麼做 改成用C
nohup ./test << 這樣會好很多
################################
解法很多種 :
1. 將 你要的邏輯 用 PHP 或 C 寫一個無窮迴圈 , 然後 做成 Unix Socket 或 TCP socket 的 長時間 Process 供 SCRIPT 使用 SOCKET 去訪問.
以下是 C 的範例 :
################
void main ()
while(true){
.........................
監控邏輯() ;
回覆監控結果();
soekct() ;
bind()
listen()
accept();
read()
請取 CLIENT 端的邏輯();
write()
回覆監控結果();
sleep(20) ;
}
################
2. 建議一個長時間的 Process , 然後 每 20秒 丟進 Memcache ( 如果你不熟 Socket Server 的寫法 ) , 然後再用 PHP 去讀它.
3. 比較笨的方法 :
把 PHP 當一個 Process , 如果服務常無故斷掉. ( PHP 的記憶體控制很差 ) ,寫支 watch dog 每分鐘去檢查服務是不是還在.
PS :
如果你不熟 C/C++ , 對編譯也不是很有經驗.
可以用 Pyrhon 寫這個服務.
我有陣子都用 Python 取代 PHP 做 SCRIPT.
穩定性和效能 比 PHP 好很多.
因為它在第一次執行完後會 Build , phc 檔出來.
比起 PHP 在長時間工作的 Process 相比 , 相對的穩定非常多。
使用apc或者文件做缓存吧。 使用apc或者memcache :em17::em17::em17::em17::em17::em17::em17: 本帖最后由 hmilymb 于 2012-08-22 11:00 编辑
准备生成静态页面,或者putenv到环境变量中。。。
不知道getenv()的速度如何。。 写的大家的回答了。。。。
页:
[1]