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 , STOMP和 AMQP .请参阅 PHP 手册中的“Other Services”以了解其他内容。 - 网络stream wrappers对于数据。在较低的层次上,它们只是套接字,尽管它们提供了不同的接口(interface)。它们也用于特定的应用程序级协议(protocol),而套接字则更为通用。
- Network protocol extensions ,例如 cURL ,用于消息传递和数据。与流包装器一样,这些是伪装的(有限的)套接字。
- Web service extensions ,例如 SOAP和 XML-RPC , 对于 remote procedure calls (远程过程调用)。请注意,虽然这些都是基于套接字的,但它们适用于不同类型的 IPC(RPC 而不是数据)。
虽然套接字(以及基于它们的任何东西,例如流包装器)和管道可用于在进程之间传递数据,但它们在两个以上进程中的能力是有限的。套接字只能连接两个进程;要处理两个以上,需要打开多个套接字(这通常是客户端-服务器架构的用武之地)。使用管道,只有一个进程可以read given data ;一旦有了,其他读者将无法使用该数据,尽管他们可以读取其他数据(然后除读者之外的所有人都无法使用这些数据)。任意数量的进程可以打开同一个共享内存区域。
关于php - shmop PHP 扩展有什么作用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8631875/