高效能共享記憶體 table
由於 php 語言不支援多執行緒,因此 swoole 使用多程序模式,在多程序模式下存在程序記憶體隔離,在工作程序內修改 global 全域性變數和超全域性變數時,在其他程序是無效的。
設定 worker_num=1 時,不存在程序隔離,可以使用全域性變數儲存資料
$fds
=array()
;$server
->on(
'connect'
,function
($server
,$fd
)\n"
;global
$fds
;$fds
=$fd
;var_dump
($fds);
});$fds 雖然是全域性變數,但只在當前的程序內有效。swoole 伺服器底層會建立多個 worker 程序,在 var_dump
($fds
) 列印出來的值,只有部分連線的 fd。
對應的解決方案就是使用外部儲存服務:
資料庫,如:mysql、mongodb
快取伺服器,如:redis、memcache
磁碟檔案,多程序併發讀寫時需要加鎖
普通的資料庫和磁碟檔案操作,存在較多 io 等待時間。因此推薦使用:
redis 記憶體資料庫,讀寫速度非常快,但是有 tcp 連線等問題,效能也不是最高的。
/dev/shm 記憶體檔案系統,讀寫操作全部在記憶體中完成,無 io 消耗,效能極高,但是資料不是格式化的,還有資料同步的問題。
除了上述使用儲存之外,推薦使用共享記憶體來儲存資料,swoole\table 乙個基於共享記憶體和鎖實現的超高效能,併發資料結構。用於解決多程序 / 多執行緒資料共享和同步加鎖問題。table 的記憶體容量不受 php 的 memory_limit 控制
不要使用陣列方式讀寫 table,一定要使用文件中提供的 api 來進行操作;
陣列方式取出的 swoole\table\row 物件為一次性物件,請勿依賴其進行過多操作。
優勢效能強悍,單執行緒每秒可讀寫 200 萬次;
應用**無需加鎖,table 內建行鎖自旋鎖,所有操作均是多執行緒 / 多程序安全。使用者層完全不需要考慮資料同步問題;
支援多程序,table 可以用於多程序之間共享資料;
使用行鎖,而不是全域性鎖,僅當 2 個程序在同一 cpu 時間,併發讀取同一條資料才會進行發生搶鎖。
<?php
//建立記憶體表
$table
=new
swoole\table
(1024);
//設定記憶體大小
//記憶體表增加一行
$table
->
column
('id'
, swoole\table::
type_int);
$table
->
column
('name'
, swoole\table::
type_string,64
);//字串需要設定長度
$table
->
column
('age'
, swoole\table::
type_int);
$table
->
create()
;$table
->
set(
'test',[
'id'
=>1,
'name'
=>
'***x'
,'age'
=>30]
);//另一種方案
$table
['test2']=
['id'
=>2,
'name'
=>
'zzz'
,'age'
=>31]
;$table
->
incr
('test2'
,'age',2
);//增長操作
$table
->
decr
('test'
,'age',3
);//原子自減操作。
$table
->
del(
'test2');
print_r
($table
->
get(
'test'))
;//獲取另一種方法
print_r
($table
['test2'])
;
執行結果
array
([id]
=> 1
[name]
=> ***x
[age]
=> 27
)swoole\table\row object
([key]
=> test2
[value]
=> array
())
多程序之間共享資料 swoole高效能賽事直播平台 筆記
一 php7原始碼安裝 1.解壓資料夾 tar xjvf php7.2.21.tar.bz2 2.configure configure prefix home soft php php安裝環境目錄 3.make 在make過程中報錯 ext iconv libs iconv.o in functi...
高效能之記憶體池
記憶體池 memory pool 是一種記憶體分配方式。通常我們習慣直接使用new malloc等api申請分配記憶體,這樣做的缺點在於 由於所申請記憶體塊的大小不定,當頻繁使用時會造成大量的記憶體碎片並進而降低效能。記憶體池則是在真正使用記憶體之前,先申請分配一定數量的 大小相等 一般情況下 的記...
高效能穩定可靠的記憶體加密
由於專案需要,經各種調研及頭腦風暴,終於做成這一高效能穩定可靠的記憶體加密演算法。使用起來超級隨意啦,直接拿它當int,float等基本資料型別使用就可以啦,比如這樣 encryptint a 10 if a 20 也可以這樣 int v 100 encryptint ev v ev v 10 ev...