shmop PHP 扩展是做什么的?

2022-08-31 00:11:03

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

Shmop是一组易于使用的函数,允许PHP读取,写入,创建和删除Unix共享内存段。

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


答案 1

共享内存允许多个进程访问内存中的相同数据。您可以使用它在正在运行的 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);

当计算机重新启动时,共享内存中的任何内容都将丢失。

不同的进程可以同时访问相同的共享内存,这可能会导致争用情况。在上面的示例中,如果两个进程在任一进程写回共享内存之前读取共享内存,则计数将比预期少 1。通过使用互斥锁可以防止竞争条件,但这超出了本问答的范围。

共享内存用于一种类型的进程间通信,即数据传递。PHP中可用的其他一些(取决于平台和PHP构建)是:

  • 信号(posix_kill发送信号,pcntl_signal设置信号处理程序),一种有限的消息传递类型。信号在脚本页面中并不是特别有用,因为每个脚本应该运行很短的时间。
  • 数据套接字。套接字可以使用网络,也可以是本地的。
  • 数据管道。posix_mkfifo用于创建命名管道(也称为 FIFO),标准文件函数用于读取和写入数据。可以使用 popenproc_open 在父进程和子进程之间创建未命名(也称为匿名)管道。注意:无法在任意进程之间创建未命名的管道。请注意,某些系统上的管道是单向的:管道句柄可用于读取或写入,但不能同时用于两者。
  • 用于同步的信号量
  • 用于消息传递的消息队列。在 PHP 中,Semaphore 扩展提供消息队列和另一组共享内存函数(例如 shm_attach)。还有许多其他用于各种消息传递协议的扩展,包括SAMSTOMPAMQP。请参阅PHP手册中的“其他服务”,了解其他服务。
  • 数据的网络流包装器。在较低级别,这些只是套接字,尽管它们提供了不同的接口。它们也适用于特定的应用程序级协议,而套接字则更通用。
  • 网络协议扩展,如cURL,用于消息传递和数据。与流包装器一样,这些是伪装的(受限)套接字。
  • 用于远程过程调用 (RPC) 的 Web 服务扩展,如 SOAPXML-RPC。请注意,虽然这些是基于套接字的,但它们适用于不同类型的IPC(RPC而不是数据)。

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


答案 2

当正在运行的进程请求内存时,系统会提供一个只能由分配的进程访问的内存片。有时,您运行多个线程并希望在它们之间共享数据。

“共享数据”可以通过以下方式完成:

  • 通过套接字/管道传递数据
  • 共享内存(线程、进程)

由于在某些情况下传递数据不是很方便,因此可能需要使用共享内存

所讨论的函数提供了在 PHP 中处理共享内存段的功能。


推荐