我有这个功能,试图从缓存中读取一些值.但是,如果值不存在,则应调用备用源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信号灯?相关推荐

  1. Alternative PHP Cache ( APC )

    简介: Alternative PHP Cache (APC) 是一个开放自由的PHP opcode 缓存.它的目标是提供一个自由.开放和健全的框架用于缓存和优化 PHP 的中间代码,加快 PHP 执 ...

  2. 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 ...

  3. JDK文档中关于Semaphore的正确使用以及使用场景

    import java.util.concurrent.Semaphore;/*** * JDK文档使用备注:<br>* Semaphores are often used to rest ...

  4. opcode php 5.4,为PHP5.4开启Zend OPCode缓存

    为PHP5.4开启Zend OPCode缓存 编译步骤: 复制代码 代码如下: git clone git://github.com/zend-dev/ZendOptimizerPlus.git cd ...

  5. OMG!Semaphore里面居然有这么一个大坑!

    作者 | why技术 来源 | why技术(ID:hello_hi_why) 荒腔走板 上周写了一篇文章,一不小心戳到了大家的爽点,其中一个转载我文章的大号,阅读量居然突破了 10w+,我也是受宠若惊 ...

  6. php5.3的新特性

    1. APC,全称是Alternative PHP Cache,官方翻译叫"可选PHP缓存" APC的缓存分两部分:系统缓存和用户数据缓存. 详细介绍见:http://162cm. ...

  7. Semaphore 里面居然有这么一个大坑!

    来源 | why技术 头图 | 视觉中国 荒腔走板 先说说这期的荒腔走板. 上面这个图片是我上周末看<乐队的夏天>的时候拍的. 这个乐队的名字叫做水木年华,我喜欢这个乐队. 我听他们的歌的 ...

  8. 理解Semaphore及其用法详解

    Mutex是一把钥匙,一个人拿了就可进入一个房间,出来的时候把钥匙交给队列的第一个.一般的用法是用于串行化对critical section代码的访问,保证这段代码不会被并行的运行. Semaphor ...

  9. 计算机组成原理 并行、cache、虚拟存储器 练习题

    一.填空题 1.有关高速缓冲存储器Cache的说法正确的是(  ) . A.只能在CPU以外 B.CPU内外都可以设置Cache C.只能在CPU以内 D.若存在Cache,CPU就不能再访问内存 正 ...

  10. PHP内容缓存输出 PEAR cache

    PHP内容缓存输出 PEAR cache 作者:未知 PEAR cache 安装 /usr/ports/sysutils/pear-Cache make install clean ◆ 内容缓存输出 ...

最新文章

  1. RocketMQ(五):教你如何调试源代码
  2. 【NLP】ACL 2010-2020研究趋势总结
  3. mac homebrew
  4. MOXy作为您的JAX-RS JSON提供程序–服务器端
  5. LeetCode 487. 最大连续1的个数 II(滑动窗口)
  6. mysql是一个_Mysql
  7. DBA 14条职业选择路线,你适合哪种?
  8. CryptoPunks历史总交易额达1亿美元,近30天交易涨幅超900%
  9. 微博、微信、qq、空间、等分享功能
  10. C语言 将一个字符串转换为字符,每两个字符间用空格隔开
  11. oracle 按时间每五分钟分割,Oracle 5分钟或30分钟分割方法
  12. CSS 定位(position)
  13. 学计算机平面设计的基础知识,新手学习平面设计2要点_计算机平面设计
  14. GitHub上万星:超精细的漫画上色AI,老婆画风任你选择,登上了趋势榜
  15. Mac的日常使用之免费NTFS for Mac (mounty)一款免费的NTFS 。畅快的使用移动硬盘
  16. Git常用命令及其作用_艾孜尔江撰
  17. html5输入框表情,H5页面input输入框含有键盘自带的表情符时显示异常
  18. html横向滚动效果,html 中 鼠标滑轮实现横向滚动
  19. matlab2018a课后答案,[2018年最新整理]matlab习题及答案.doc
  20. 集成灶怎么选品牌(拒绝陷阱避坑指南)

热门文章

  1. Linux acpi off关于Suspend to Disk 问题分析
  2. session timer(一)
  3. SylixOS pci 设备驱动开发
  4. 用matplotlib中的scatter方法画散点图
  5. Scrapy ImportError: No module named items
  6. html+加粗+w3c,HTML5教程:html标签属性通过w3c验证
  7. linux硬盘只读脚本 zabbix,Zabbix如何设置脚本告警
  8. c语言统计计算机专业人数,非计算机专业C语言练习题及2013版中国统计年鉴1.doc...
  9. mongodb副本集php,MongoDB副本集
  10. Oracle在线撤销表空间,Oracle创建、管理撤销表空间