shmop PHP扩展有什么作用?

Ale*_*lex 13 php shared-memory

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

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

我不明白,这个扩展目的究竟是什么?它是干什么用的?

out*_*tis 35

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

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

不同的进程可以同时访问同一个共享内存,这可能导致竞争条件.在上面的示例中,如果两个进程在写回共享内存之前读取共享内存,则计数将比它应该少1.使用互斥锁可以防止竞争条件,但这不在本问答范围内.

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

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

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


fuz*_*zzy 9

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

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

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

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

有问题的函数提供了处理PHP中共享内存段的功能.

  • @Alex:PHP并没有像这样的"全局变量".这在PHP中是用词不当,因为你总是有分离的进程空间. - 想想shmop更像是memcache,除了它是一个POSIX/Unix系统功能,用于在PHP和C应用程序之间共享(如果它不是二进制表示不匹配,找不到重复).您也可以将其想象为ramdisk,实际上shmop通常在`/ etc/shm/*中创建一个文件条目 (2认同)