【问题标题】:What does the shmop PHP extension do?shmop PHP 扩展有什么作用?
【发布时间】:2012-01-27 17:56:10
【问题描述】:

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

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

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

【问题讨论】:

    标签: php shared-memory


    【解决方案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);
    

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

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

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

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

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

    【讨论】:

    • 有没有一种好方法可以让接收进程对消息做出反应,使其成为事件驱动的?
    • @outis,什么是 Windows 等价物?
    【解决方案2】:

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

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

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

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

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

    【讨论】:

    • 那基本没用了?我的意思是,如果您可以为此使用全局变量,那么与那些 shmop_* 函数混淆是没有意义的
    • @Alex:PHP 并没有真正的“全局变量”。这在 PHP 中是用词不当,因为您总是有分离的进程空间。 -- 认为 shmop 更像 memcache,除了它是一个 POSIX/Unix 系统功能,用于在 PHP 和 C 应用程序之间共享(如果不是因为二进制表示不匹配,就找不到那个重复项)。你也可以把它想象成一个ramdisk,其实shmop通常会在/etc/shm/*创建一个文件入口
    • 共享内存由操作系统管理。与全局变量的有限使用相比,它们具有更多的保护和控制服务。共享内存主要用于进程间通信。如果您没有明确需要,请坚持使用变量。
    • PHP 有全局变量。全局变量仅对它们所属的进程是全局的。它们无法在其他进程中访问。
    • @Fuzzy:“传递变量”到底是什么意思?环境变量?会话变量?请求数据(查询字符串和请求正文,在 PHP 中可访问为 $_GET$_POST)?还有什么?
    猜你喜欢
    • 2014-02-02
    • 1970-01-01
    • 2012-07-10
    • 2016-07-28
    • 1970-01-01
    • 2015-05-17
    • 2011-11-16
    • 2012-02-19
    相关资源
    最近更新 更多