摘要:引子最近在寫(xiě)的時(shí)候,需要使用內(nèi)存緩存,大家都知道有比較成熟的基于,,以及等緩存。此函數(shù)支持兩種調(diào)用方式,可以設(shè)置和獲取緩存。設(shè)置的時(shí)候還能一并設(shè)置緩存過(guò)期時(shí)間。如果數(shù)據(jù)過(guò)大會(huì)不能更新緩存。這樣就避免了每次全部緩存導(dǎo)致的多余的開(kāi)銷(xiāo)。
PHP shared memory cache 引子
最近在寫(xiě)PHP的時(shí)候,需要使用內(nèi)存緩存,大家都知道有比較成熟的基于memcached,redis,以及apc等緩存。但是不是要裝插件就是要第三方軟件支持。在小項(xiàng)目中用起來(lái)不是很方便!
實(shí)現(xiàn) shmop_*所以打算使用php的shared memory的shmop_*前綴的API來(lái)實(shí)現(xiàn)一個(gè)簡(jiǎn)單的緩存接口。
此函數(shù)支持兩種調(diào)用方式,可以設(shè)置和獲取緩存。設(shè)置的時(shí)候還能一并設(shè)置緩存過(guò)期時(shí)間。
function cache($key, $val=null, $expire=100) { static $_caches = null; static $_shm = null; if ( null === $_shm ) $_shm = @shmop_open(crc32("mcache.solt"), "c", 0755, config("cache.size", null, 10485760)); if ( null === $_caches && $_shm && ($size = intval(shmop_read($_shm, 0, 10)))) $_caches = $size ? @unserialize(@shmop_read($_shm, 10, $size)) : array(); if (($time = time()) && $val && $expire){ $_caches[$key] = array($time + intval($expire), $val); if($_shm && ($size = @shmop_write($_shm, serialize(array_filter($_caches, function($ n)use($time){return $n[0] > $time;})), 10))) @shmop_write($_shm, sprintf("%10d", $size), 0); return $val; } return (isset($_caches[$key]) && $_caches[$key][0] > $time) ? $_caches[$key][1] : null; }
不過(guò)有個(gè)缺點(diǎn)每次load cache的時(shí)候需要全部一起load,然后反序列化保存到靜態(tài)數(shù)組里面。只能緩存一些比較小的數(shù)據(jù)。如果數(shù)據(jù)過(guò)大會(huì)不能更新緩存。
shm_*后來(lái)發(fā)現(xiàn)PHP還有提供一個(gè)操作shared memory的API,可以使用這個(gè)API按照key value的形式存取緩存。這樣就避免了每次load全部緩存導(dǎo)致的多余的開(kāi)銷(xiāo)。
function shmcache($key, $val=null, $expire=100) { static $_shm = null; if ( null === $_shm ) $_shm = @shm_attach(crc32(config("mcache.solt", null, "mcac he.solt")), config("cache.size", null, 10485760), 0755); if (($time = time()) && ($k = crc32($key)) && $val && $expire){ shm_put_var($_shm, $k, array($time + $expire, $val)); return $val; } return shm_has_var($_shm, $k) && ($data = shm_get_var($_shm, $k)) && $data[0] > $time ? $data[1] : null; }
我把這兩個(gè)函數(shù)和一些其他的基本函數(shù)(現(xiàn)在只有9個(gè)函數(shù))放在一個(gè)utils倉(cāng)庫(kù)里面。也可以直接使用 composer require lloydzhou/utils 安裝
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/21180.html
摘要:引子最近在寫(xiě)的時(shí)候,需要使用內(nèi)存緩存,大家都知道有比較成熟的基于,,以及等緩存。此函數(shù)支持兩種調(diào)用方式,可以設(shè)置和獲取緩存。設(shè)置的時(shí)候還能一并設(shè)置緩存過(guò)期時(shí)間。如果數(shù)據(jù)過(guò)大會(huì)不能更新緩存。這樣就避免了每次全部緩存導(dǎo)致的多余的開(kāi)銷(xiāo)。 PHP shared memory cache 引子 最近在寫(xiě)PHP的時(shí)候,需要使用內(nèi)存緩存,大家都知道有比較成熟的基于memcached,redis,以及...
摘要:一配置目錄結(jié)構(gòu)一般在生產(chǎn)環(huán)境都是負(fù)載均衡,定時(shí)任務(wù)是單獨(dú)在一個(gè)容器執(zhí)行,故此是注釋掉的,需要單獨(dú)在定時(shí)任務(wù)容器中打開(kāi)即可。與配置文件由于配置文件是監(jiān)聽(tīng)的默認(rèn)情況下監(jiān)聽(tīng)端口。使用套接字,這避免了的開(kāi)銷(xiāo)。地址鏡像地址續(xù)搭建應(yīng)用部署 一、配置目錄結(jié)構(gòu) showImg(https://segmentfault.com/img/bVbpo9F?w=772&h=922); 1.1 crontabs...
摘要: ;;;;;;;;;;;;;;;;;;; ; Module Settings ; ;;;;;;;;;;;;;;;;;;; [CLI Server] ; Whether the CLI web server uses ANSI color coding in its terminal output. cli_server.color = On [Date] ; Defines th...
Oracle數(shù)據(jù)庫(kù)4031故障分析 img{ display:block; margin:0 auto !important; width:100%; } body{ width:75%; m...
摘要:安裝前的檢查安裝之前,你需要先安裝一個(gè)較新的版本的,最好的選擇是,你可以從獲得官方提供的最新版本的。 安裝前的檢查 安裝 Elasticsearch 之前,你需要先安裝一個(gè)較新的版本的 Java,最好的選擇是,你可以從 www.java.com 獲得官方提供的最新版本的 Java。 安裝JDK sudo yum install java-1.8.0-openjdk.x86_64 ...
閱讀 2436·2021-10-09 09:44
閱讀 3792·2021-09-22 15:43
閱讀 2925·2021-09-02 09:47
閱讀 2539·2021-08-12 13:29
閱讀 3871·2019-08-30 15:43
閱讀 1680·2019-08-30 13:06
閱讀 2189·2019-08-29 16:07
閱讀 2745·2019-08-29 15:23