免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1865 | 回复: 6
打印 上一主题 下一主题

php全局变量问题,求救。。。 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2012-08-22 01:03 |只看该作者 |倒序浏览

我准备写一个简单的查询程序,
需求如下,每隔20秒到另外一个监控程序 取数和据,然后把在这些数据缓存起来,供应大规模地查询。。。

监控取回来的数据很小,只有几行。

我的问题是如何在内存中存储这这些数据,目前我用global 变量每次访问后都被清零,无法做到缓存作用。。

如果每次有人访问 我都从数据库或者监控取的话太慢了。。。

论坛徽章:
0
2 [报告]
发表于 2012-08-22 07:54 |只看该作者
本帖最后由 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 相比 , 相對的穩定非常多。




论坛徽章:
0
3 [报告]
发表于 2012-08-22 09:21 |只看该作者
使用apc或者文件做缓存吧。

论坛徽章:
0
4 [报告]
发表于 2012-08-22 09:29 |只看该作者
使用apc或者memcache

论坛徽章:
0
5 [报告]
发表于 2012-08-22 10:16 |只看该作者

论坛徽章:
0
6 [报告]
发表于 2012-08-22 11:00 |只看该作者
本帖最后由 hmilymb 于 2012-08-22 11:00 编辑

准备生成静态页面,或者putenv到环境变量中。。。
不知道getenv()的速度如何。。

论坛徽章:
0
7 [报告]
发表于 2012-08-22 11:01 |只看该作者
写的大家的回答了。。。。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP