php - shmop PHP 扩展有什么作用?

标签 php shared-memory

http://www.php.net/manual/en/intro.shmop.php

Shmop is an easy to use set of functions that allows PHP to read, write, create and delete Unix shared memory segments.

我不明白,这个扩展的目的到底是什么?它有什么用?

最佳答案

共享内存允许多个进程访问内存中的相同数据。您可以使用它在运行的 PHP 脚本之间共享数据。

 $shm = shmop_open(0xF00, "c", 0644, 4);

 $count = unpack('L', shmop_read($shm, 0, 4));
 $count = reset($count);
 var_dump($count);
 echo "count: ", $count++, "<br/>\n";
 shmop_write($shm, pack('L', $count), 0);

当计算机重新启动时,共享内存中的所有内容都会丢失。

不同进程可以同时访问同一个共享内存,这会导致race conditions .在上面的示例中,如果两个进程在写回共享内存之前读取共享内存,则计数将比应有的少 1。使用 mutex 可以防止竞争条件,但这超出了本问答的范围。

共享内存用于一种类型的 inter-process communication ,即数据传递。 PHP 中可用的其他一些(取决于平台和 PHP 构建)是:

  • 信号(posix_kill 发送信号,pcntl_signal 设置信号处理程序),一种有限类型的消息传递。信号在脚本页面中不是特别有用,因为每个脚本应该运行很短的时间。
  • Sockets对于数据。套接字可以使用网络,也可以是本地的。
  • 数据管道。 posix_mkfifo用于创建 named pipes (又名 FIFOs )和标准 file函数用于读取和写入数据。可以使用 anonymous 在父进程和子进程之间创建未命名(又名 popen)管道或 proc_open .注意不能在任意进程之间创建未命名的管道。请注意,某些系统上的管道是单向的:管道句柄可用于读取或写入,但不能同时用于两者。
  • Semaphores对于 synchronization .
  • messaging 的消息队列.在 PHP 中,信号量扩展提供了消息队列和另一组共享内存函数(例如 shm_attach )。各种消息协议(protocol)的许多其他扩展也可用,包括 SAM , STOMPAMQP .请参阅 PHP 手册中的“Other Services”以了解其他内容。
  • 网络stream wrappers对于数据。在较低的层次上,它们只是套接字,尽管它们提供了不同的接口(interface)。它们也用于特定的应用程序级协议(protocol),而套接字则更为通用。
  • Network protocol extensions ,例如 cURL ,用于消息传递和数据。与流包装器一样,这些是伪装的(有限的)套接字。
  • Web service extensions ,例如 SOAPXML-RPC , 对于 remote procedure calls (远程过程调用)。请注意,虽然这些都是基于套接字的,但它们适用于不同类型的 IPC(RPC 而不是数据)。

虽然套接字(以及基于它们的任何东西,例如流包装器)和管道可用于在进程之间传递数据,但它们在两个以上进程中的能力是有限的。套接字只能连接两个进程;要处理两个以上,需要打开多个套接字(这通常是客户端-服务器架构的用武之地)。使用管道,只有一个进程可以read given data ;一旦有了,其他读者将无法使用该数据,尽管他们可以读取其他数据(然后除读者之外的所有人都无法使用这些数据)。任意数量的进程可以打开同一个共享内存区域。

关于php - shmop PHP 扩展有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8631875/

相关文章:

php - 如何在不修改vendor的情况下自定义sylius_taxon_image_widget?

php - 使用复选框从表中删除多条记录(行)

Javascript 仅从表中的第一行选取值

在共享内存中创建一个二维数组

Python Multiprocessing 共享全局值

php - 检测 Mac 用户 - htaccess

php - 如何修复 Websocket 握手代码?

C# 内存在两个进程之间共享,无法从一侧获取读取流

c - 如何使用 shmget 跨多个进程共享一 block 内存

linux - 如何使用共享内存来共享程序中的数据