The examples in this article describe the usage of PHP shared memory. Share it with everyone for your reference, the details are as follows:
Shared memory is mainly used for inter-process communication
There are two sets of extensions for shared memory in php
1. shmop needs to be enabled when compiling --enable-shmop parameter
Example:
$shm_key = ftok(__FILE__, 't'); /** 开辟一块共享内存 int $key , string $flags , int $mode , int $size $flags: a:访问只读内存段 c:创建一个新内存段,或者如果该内存段已存在,尝试打开它进行读写 w:可读写的内存段 n:创建一个新内存段,如果该内存段已存在,则会失败 $mode: 八进制格式 0655 $size: 开辟的数据大小 字节 */ $shm_id = shmop_open($shm_key, "c", 0644, 1024); /** * 写入数据 数据必须是字符串格式 , 最后一个指偏移量 * 注意:偏移量必须在指定的范围之内,否则写入不了 * */ $size = shmop_write($shm_id, 'songjiankang', 0); echo "write into {$size}"; #读取的范围也必须在申请的内存范围之内,否则失败 $data = shmop_read($shm_id, 0, 100); var_dump($data); #删除 只是做一个删除标志位,同时不在允许新的进程进程读取,当在没有任何进程读取时系统会自动删除 shmop_delete($shm_id); #关闭该内存段 shmop_close($shm_id);
2. Use the sem class function in the Semaphore extension (more convenient to use, similar to key-value format)
// Get the file token key $key = ftok(__DIR__, 'a'); // 创建一个共享内存 $shm_id = shm_attach($key, 1024, 777); // resource type if ($shm_id === false) { die('Unable to create the shared memory segment'); } #设置一个值 shm_put_var($shm_id, 111, 'value'); #删除一个key //shm_remove_var($shm_id, 111); #获取一个值 $value = shm_get_var($shm_id, 111); var_dump($value); #检测一个key是否存在 // var_dump(shm_has_var($shm_id, 111)); #从系统中移除 shm_remove($shm_id); #关闭和共享内存的连接 shm_detach($shm_id);
Note: These two methods are not universal
A message queue implemented using shared memory and semaphores
/** * 使用共享内存和信号量实现 * * 支持多进程, 支持各种数据类型的存储 * 注: 完成入队或出队操作,尽快使用unset(), 以释放临界区 * */ class ShmQueue { private $maxQSize = 0; // 队列最大长度 private $front = 0; // 队头指针 private $rear = 0; // 队尾指针 private $blockSize = 256; // 块的大小(byte) private $memSize = 25600; // 最大共享内存(byte) private $shmId = 0; private $filePtr = './shmq.ptr'; private $semId = 0; public function __construct () { $shmkey = ftok(__FILE__, 't'); $this->shmId = shmop_open($shmkey, "c", 0644, $this->memSize); $this->maxQSize = $this->memSize / $this->blockSize; // 申請一个信号量 $this->semId = sem_get($shmkey, 1); sem_acquire($this->semId); // 申请进入临界区 $this->init(); } private function init () { if (file_exists($this->filePtr)) { $contents = file_get_contents($this->filePtr); $data = explode('|', $contents); if (isset($data[0]) && isset($data[1])) { $this->front = (int) $data[0]; $this->rear = (int) $data[1]; } } } public function getLength () { return (($this->rear - $this->front + $this->memSize) % ($this->memSize)) / $this->blockSize; } public function enQueue ($value) { if ($this->ptrInc($this->rear) == $this->front) { // 队满 return false; } $data = $this->encode($value); shmop_write($this->shmId, $data, $this->rear); $this->rear = $this->ptrInc($this->rear); return true; } public function deQueue () { if ($this->front == $this->rear) { // 队空 return false; } $value = shmop_read($this->shmId, $this->front, $this->blockSize - 1); $this->front = $this->ptrInc($this->front); return $this->decode($value); } private function ptrInc ($ptr) { return ($ptr + $this->blockSize) % ($this->memSize); } private function encode ($value) { $data = serialize($value) . "__eof"; echo ''; echo strlen($data); echo ''; echo $this->blockSize - 1; echo ''; if (strlen($data) > $this->blockSize - 1) { throw new Exception(strlen($data) . " is overload block size!"); } return $data; } private function decode ($value) { $data = explode("__eof", $value); return unserialize($data[0]); } public function __destruct () { $data = $this->front . '|' . $this->rear; file_put_contents($this->filePtr, $data); sem_release($this->semId); // 出临界区, 释放信号量 } } /* * // 进队操作 $shmq = new ShmQueue(); $data = 'test data'; $shmq->enQueue($data); * unset($shmq); // 出队操作 $shmq = new ShmQueue(); $data = $shmq->deQueue(); * unset($shmq); */
Use the ipc command to view under Linux, and use the ipcrm command to delete
Readers who are interested in more PHP-related content can check out the special topics of this site: "Introduction to PHP Basic Syntax Tutorial", "Summary of PHP Error and Exception Handling Methods", " php programming algorithm summary" and "php object-oriented programming introductory tutorial"
I hope this article will be helpful to everyone in PHP programming.

php把负数转为正整数的方法:1、使用abs()函数将负数转为正数,使用intval()函数对正数取整,转为正整数,语法“intval(abs($number))”;2、利用“~”位运算符将负数取反加一,语法“~$number + 1”。

实现方法:1、使用“sleep(延迟秒数)”语句,可延迟执行函数若干秒;2、使用“time_nanosleep(延迟秒数,延迟纳秒数)”语句,可延迟执行函数若干秒和纳秒;3、使用“time_sleep_until(time()+7)”语句。

php除以100保留两位小数的方法:1、利用“/”运算符进行除法运算,语法“数值 / 100”;2、使用“number_format(除法结果, 2)”或“sprintf("%.2f",除法结果)”语句进行四舍五入的处理值,并保留两位小数。

判断方法:1、使用“strtotime("年-月-日")”语句将给定的年月日转换为时间戳格式;2、用“date("z",时间戳)+1”语句计算指定时间戳是一年的第几天。date()返回的天数是从0开始计算的,因此真实天数需要在此基础上加1。

php字符串有下标。在PHP中,下标不仅可以应用于数组和对象,还可应用于字符串,利用字符串的下标和中括号“[]”可以访问指定索引位置的字符,并对该字符进行读写,语法“字符串名[下标值]”;字符串的下标值(索引值)只能是整数类型,起始值为0。

在php中,可以使用substr()函数来读取字符串后几个字符,只需要将该函数的第二个参数设置为负值,第三个参数省略即可;语法为“substr(字符串,-n)”,表示读取从字符串结尾处向前数第n个字符开始,直到字符串结尾的全部字符。

方法:1、用“str_replace(" ","其他字符",$str)”语句,可将nbsp符替换为其他字符;2、用“preg_replace("/(\s|\ \;||\xc2\xa0)/","其他字符",$str)”语句。

php判断有没有小数点的方法:1、使用“strpos(数字字符串,'.')”语法,如果返回小数点在字符串中第一次出现的位置,则有小数点;2、使用“strrpos(数字字符串,'.')”语句,如果返回小数点在字符串中最后一次出现的位置,则有。


Hot AI Tools

Undresser.AI Undress
AI-powered app for creating realistic nude photos

AI Clothes Remover
Online AI tool for removing clothes from photos.

Undress AI Tool
Undress images for free

Clothoff.io
AI clothes remover

AI Hentai Generator
Generate AI Hentai for free.

Hot Article

Hot Tools

Dreamweaver Mac version
Visual web development tools

MantisBT
Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

Notepad++7.3.1
Easy-to-use and free code editor

SAP NetWeaver Server Adapter for Eclipse
Integrate Eclipse with SAP NetWeaver application server.

SublimeText3 Mac version
God-level code editing software (SublimeText3)
