【发布时间】:2012-01-27 17:56:10
【问题描述】:
http://www.php.net/manual/en/intro.shmop.php
Shmop 是一组易于使用的函数,允许 PHP 读取, 写入、创建和删除 Unix 共享内存段。
我不明白,这个扩展的具体目的是什么?它是干什么用的?
【问题讨论】:
标签: php shared-memory
http://www.php.net/manual/en/intro.shmop.php
Shmop 是一组易于使用的函数,允许 PHP 读取, 写入、创建和删除 Unix 共享内存段。
我不明白,这个扩展的具体目的是什么?它是干什么用的?
【问题讨论】:
标签: php shared-memory
共享内存允许多个进程访问内存中的相同数据。您可以使用它在运行的 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 设置信号处理程序),一种有限类型的消息传递。信号在脚本页面中并不是特别有用,因为每个脚本都应该运行很短的时间。posix_mkfifo 用于创建named pipes(又名FIFOs),标准file 函数用于读取和写入数据。可以使用popen 或proc_open 在父进程和子进程之间创建未命名(又名anonymous)管道。请注意,不能在任意进程之间创建未命名管道。请注意,某些系统上的管道是单向的:管道句柄可用于读取或写入,但不能同时用于两者。shm_attach)。还可以使用各种消息传递协议的许多其他扩展,包括SAM、STOMP 和AMQP。其他的请参阅 PHP 手册中的“Other Services”。虽然套接字(以及基于它们的任何东西,例如流包装器)和管道可用于在进程之间传递数据,但它们对两个以上进程的能力是有限的。套接字只能连接两个进程;要处理两个以上,需要打开多个套接字(这是客户端-服务器体系结构通常涉及的地方)。使用管道,只有一个进程可以read given data;一旦有了,其他读者将无法使用该数据,尽管他们可以读取其他数据(然后除了读者之外,其他人都无法使用这些数据)。任意数量的进程都可以打开同一个共享内存区域。
【讨论】:
当正在运行的进程请求内存时,系统会提供一块内存,只有分配的进程才能访问。有时您运行多个线程并希望在它们之间共享数据。
“共享数据”可以通过以下方式完成:
由于在某些情况下传递数据不是很方便,因此可能需要使用Shared memory。
有问题的函数提供了在 PHP 中处理共享内存段的功能。
【讨论】:
/etc/shm/*创建一个文件入口
$_GET 和 $_POST)?还有什么?