alternative php cache semaphore,如何正确使用PHP5信号灯?
我有这个功能,试图从缓存中读取一些值.但是,如果值不存在,则应调用备用源API并将新值保存到缓存中.但是,服务器非常过载,几乎每次不存在值时,就会创建一个请求(许多API调用),并且每个请求都会将新值存储到缓存中.但是,我想要的是能够多次调用API,但是只有一个进程/请求能够将其存储在缓存中:
function fetch_cache($key, $alternativeSource) {
$redis = new Redis();
$redis->pconnect(ENV_REDIS_HOST);
$value = $redis->get($key);
if( $value === NULL ) {
$value = file_get_contents($alternativeSource);
// here goes part that I need help with
$semaphore = sem_get(6000, 1); // does this need to be called each time this function is called?
if( $semaphore === FALSE ) {
// This means I have failed to create semaphore?
}
if( sem_aquire($semaphore, true) ) {
// we have aquired semaphore so here
$redis->set($key, $value);
sem_release($semaphore); // releasing lock
}
// This must be call because I have called sem_get()?
sem_remove($semaphore);
}
return $value;
}
PHP5是否正确使用了信号量?
解决方法:
简短答案
>您无需在fetch_cache函数中创建和删除信号量.将sem_get()放入初始化方法(例如__construct)中.
>您应该使用sem_remove()删除信号量,但是要使用清理方法(例如__destruct).或者,您可能希望将它们保留更长的时间-取决于应用程序的逻辑.
>使用sem_acquire()获取锁,然后使用sem_release()释放锁.
描述
sem_get()
创建一组three信号量.
底层的C函数semget不是原子的.当两个进程尝试调用semget时,可能会出现race condition.因此,应在某些初始化过程中调用semget. PHP扩展通过三个信号量克服了这个问题:
信号量0亦称SYSVSEM_SEM
初始化为sem_get的$max_acquire,并在进程获取时递减.
第一个调用sem_get的进程将获取SYSVSEM_USAGEsemaphore的值(请参见下文).对于第一个过程,它等于1,因为扩展名sets it to 1在semget之后具有原子semop函数.并且,如果这确实是第一个过程,则扩展会将SYSVSEM_SEM信号量值分配给$max_acquire.
信号灯1又称SYSVSEM_USAGE
使用信号量的进程数.
信号量2又称SYSVSEM_SETVAL
充当内部SETVAL和GETVAL操作的锁(请参见man 2 semctl).例如,将其设置为1,而扩展名将SYSVSEM_SEM设置为$max_acquire,然后将其重置为零.
最后,sem_get将一个结构(包含信号量集ID,键和其他信息)包装到PHP资源中并返回它.
因此,当您仅准备使用信号量时,应该在一些初始化过程中调用它.
sem_acquire()
这是$max_acquire goes into play的位置.
SYSVSEM_SEM的值(我们称其为semval)最初等于$max_acquire. semop()阻塞,直到semval大于或等于1.然后从semval中减去1.
如果$max_acquire = 1,则在第一次调用之后semval变为零,并且对sem_acquire()的下一次调用将填充块,直到通过sem_release()调用恢复semval.
需要从可用集中($max_acquire)获取下一个“锁”时调用它.
sem_release()
与sem_acquire()几乎一样,只是它增加了SYSVSEM_SEM的值.
当您不再需要以前通过sem_acquire()获取的“锁”时调用它.
sem_remove()
立即删除信号量集,唤醒该集中的semop中阻塞的所有进程(来自IPC_RMID部分,SEMCTL(2)手册页).
因此,这实际上与使用ipcrm命令删除信号量相同.
标签:semaphore,php
来源: https://codeday.me/bug/20191118/2025415.html
alternative php cache semaphore,如何正确使用PHP5信号灯?相关推荐
- Alternative PHP Cache ( APC )
简介: Alternative PHP Cache (APC) 是一个开放自由的PHP opcode 缓存.它的目标是提供一个自由.开放和健全的框架用于缓存和优化 PHP 的中间代码,加快 PHP 执 ...
- 52.4. APC Cache (php-apc - APC (Alternative PHP Cache) module for PHP 5)
$ apt-cache search php-apc php-apc - APC (Alternative PHP Cache) module for PHP 5$ sudo apt-get inst ...
- JDK文档中关于Semaphore的正确使用以及使用场景
import java.util.concurrent.Semaphore;/*** * JDK文档使用备注:<br>* Semaphores are often used to rest ...
- opcode php 5.4,为PHP5.4开启Zend OPCode缓存
为PHP5.4开启Zend OPCode缓存 编译步骤: 复制代码 代码如下: git clone git://github.com/zend-dev/ZendOptimizerPlus.git cd ...
- OMG!Semaphore里面居然有这么一个大坑!
作者 | why技术 来源 | why技术(ID:hello_hi_why) 荒腔走板 上周写了一篇文章,一不小心戳到了大家的爽点,其中一个转载我文章的大号,阅读量居然突破了 10w+,我也是受宠若惊 ...
- php5.3的新特性
1. APC,全称是Alternative PHP Cache,官方翻译叫"可选PHP缓存" APC的缓存分两部分:系统缓存和用户数据缓存. 详细介绍见:http://162cm. ...
- Semaphore 里面居然有这么一个大坑!
来源 | why技术 头图 | 视觉中国 荒腔走板 先说说这期的荒腔走板. 上面这个图片是我上周末看<乐队的夏天>的时候拍的. 这个乐队的名字叫做水木年华,我喜欢这个乐队. 我听他们的歌的 ...
- 理解Semaphore及其用法详解
Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个.一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行. Semaphor ...
- 计算机组成原理 并行、cache、虚拟存储器 练习题
一.填空题 1.有关高速缓冲存储器Cache的说法正确的是( ) . A.只能在CPU以外 B.CPU内外都可以设置Cache C.只能在CPU以内 D.若存在Cache,CPU就不能再访问内存 正 ...
- PHP内容缓存输出 PEAR cache
PHP内容缓存输出 PEAR cache 作者:未知 PEAR cache 安装 /usr/ports/sysutils/pear-Cache make install clean ◆ 内容缓存输出 ...
最新文章
- RocketMQ(五):教你如何调试源代码
- 【NLP】ACL 2010-2020研究趋势总结
- mac homebrew
- MOXy作为您的JAX-RS JSON提供程序–服务器端
- LeetCode 487. 最大连续1的个数 II(滑动窗口)
- mysql是一个_Mysql
- DBA 14条职业选择路线,你适合哪种?
- CryptoPunks历史总交易额达1亿美元,近30天交易涨幅超900%
- 微博、微信、qq、空间、等分享功能
- C语言 将一个字符串转换为字符,每两个字符间用空格隔开
- oracle 按时间每五分钟分割,Oracle 5分钟或30分钟分割方法
- CSS 定位(position)
- 学计算机平面设计的基础知识,新手学习平面设计2要点_计算机平面设计
- GitHub上万星:超精细的漫画上色AI,老婆画风任你选择,登上了趋势榜
- Mac的日常使用之免费NTFS for Mac (mounty)一款免费的NTFS 。畅快的使用移动硬盘
- Git常用命令及其作用_艾孜尔江撰
- html5输入框表情,H5页面input输入框含有键盘自带的表情符时显示异常
- html横向滚动效果,html 中 鼠标滑轮实现横向滚动
- matlab2018a课后答案,[2018年最新整理]matlab习题及答案.doc
- 集成灶怎么选品牌(拒绝陷阱避坑指南)
热门文章
- Linux acpi off关于Suspend to Disk 问题分析
- session timer(一)
- SylixOS pci 设备驱动开发
- 用matplotlib中的scatter方法画散点图
- Scrapy ImportError: No module named items
- html+加粗+w3c,HTML5教程:html标签属性通过w3c验证
- linux硬盘只读脚本 zabbix,Zabbix如何设置脚本告警
- c语言统计计算机专业人数,非计算机专业C语言练习题及2013版中国统计年鉴1.doc...
- mongodb副本集php,MongoDB副本集
- Oracle在线撤销表空间,Oracle创建、管理撤销表空间