Semaphore

Semaphore - 信号量:
	简介:
		Semaphore模块,包括了3个部分:Semaphore(互斥锁),shm(共享内存),inter-process messaging (IPC)。
		1.这个模块提供了 System V IPC 家族的封装函数。包括 'semaphores','shared memory' 和 'inter-process messaging(communication)'
		2.信号量可用于对当前机器的资源进行独占访问,或限制可以同时使用资源的进程数。
		3.这个模块也提供了使用 'System V共享内存' 的共享内存函数。内存共享可用于提供对全局变量的访问。不同的httpd守护进程,甚至是其它程序(例如Perl, C等)都可以访问这些数据来改变全局变量。记住,内存共享对同步访问不安全。使用 'semaphores-信号量' 进行同步访问。
			Unix操作系统对于共享内存的限制:
				SHMMAX - 共享内存的最大尺寸,通常是:131072 字节
				SHMMIN - 共享内存的最小尺寸,通常是:1 字节
				SHMMNI - 共享内存的最大段数(segments),通常是:100
				SHMSEG - 每个进程的共享内存的最大段数(segments),通常是:6
		4.消息函数,可被用来发送和接收其它进程的消息。它们提供了进程间交换数据的一个简单而有效的工具,而无需使用Unix domain sockets(Unix域套接字)
	函数:

		ftok:
			int ftok ( string $pathname , string $proj )
			将一个存在的、可访问的文件的路径名和一个项目标识符转换为一个 System V IPC 键(整型),可被 shmop_open() 使用
				参数:
					$pathname - 可访问的文件路径名
					$project - 项目标识符。必须是一个字符串。
				返回值:
					成功,返回key值,否则返回-1
				手册上下方对 ftok() 的实现:
					<?php
						function ftok ($filePath, $projectId) {
						    $fileStats = stat($filePath);
						    if (!$fileStats) {
						        return -1;
						    }

						    return sprintf('%u',
						        ($fileStats['ino'] & 0xffff) | (($fileStats['dev'] & 0xff) << 16) | ((ord($projectId) & 0xff) << 24)
						    );
						}
					?>

		Semaphore:
			resource sem_get ( int $key [, int $max_acquire = 1 [, int $perm = 0666 [, int $auto_release = 1 ]]] )
				根据给定的 $key,返回一个可用于访问 'System V semaphore' 的ID号
				第二次使用相同的key来调用sem_get(),将返回一个不同的semaphore ID,但2个ID本质上访问的是同样的semaphore
				参数:
					$key - 
					$max_acquire - 可用于同时获取semaphore的最大进程数量
					$perm - semaphore权限设置。事实上,只有当进程发现它是当时隶属于semaphore的唯一进程时,才设置该参数。
					$auto_release - 在请求结束时,是否应该自动释放 semaphore。
				注意:
					当使用sem_get()来访问在PHP外部创建的semaphore,注意,semaphore必须已经被创建为一个具有3个semaphore的集合(例如:当调用C的semget()函数,指定nsems参数为3),否则PHP将无法访问sempaphore。
			bool sem_acquire ( resource $sem_identifier [, bool $nowait = false ] )
				sem_acquire()默认是阻塞的,直到可以获取semaphore。一个进程尝试获取semaphore,当semaphore已经达到了最大数量的限制,将会一直阻塞。
				请求处理结束后,任何由进程获取的、但未明确释放的semaphores将会自动释放,并产生一个警告。
				参数:
					$sem_identifier - 通过 sem_get()得到的资源
					$nowait - 指定进程是否不应该为了获取semaphore而等待。如果设置为true,当不能迅速的获取semaphore,将会迅速返回false,而不会一直等待着。
				注意:
					默认,PHP不支持非阻塞的semaphore。可以通过shared memory(共享内存)结合semaphore,可以实现非阻塞。(可参数手册下面的评论示例)
			bool sem_release ( resource $sem_identifier )
				释放一个指定的 semaphore 资源,如果该semaphore是被当前调用进程获取的,则释放。否则会生成一个警告!
				释放 semaphore 后,可调用 sem_acquire() 来重新获取它。
			bool sem_remove ( resource $sem_identifier )
				删除指定的 semaphore 资源。
				删除 semaphore 后,它就不能再被访问了。(区别于 sem_release(),可重新获取)

		Shared memory:
			resource shm_attach ( int $key [, int $memsize [, int $perm = 0666 ]] )
				使用给定的$key参数,得到一个可被用来访问 System V 共享内存的ID,首次调用函数,根据$memsize和$perm,创建共享内存段。第二次使用同样的$key调用,会返回一个不同的共享内存ID,但是2个ID都访问的是同一个共享内存。第二次调用时,会忽略$memsize 和 $perm 参数。
				参数:
					$key - 共享内存段ID(可通过 ftok() 生成,或其它的 System V IPC 键)
					$memsize - 内存大小。如果未提供,默认是 'sysvshm.init_mem' 的配置值,未配置则为 '10000字节'
					$perm - 可选的权限位,默认是 '0666'
				注意:
					5.3.0之后,返回的是一个资源类型,而不是整型(5.3.0之前返回整型)
				示例:
					<?php
						// Create a temporary file and return its path - 创建一个临时文件,并返回路径
						$tmp = tempnam('/tmp', 'PHP');

						// Get the file token key - 通过 ftok() 返回 $key 参数
						$key = ftok($tmp, 'a');

						// Attach the SHM resource, notice the cast afterwards - 获取共享内存段标识符
						$id = shm_attach($key);

						if ($id === false) {
						    die('Unable to create the shared memory segment');
						}

						// Cast to integer, since prior to PHP 5.3.0 the resource id 
						// is returned which can be exposed when casting a resource
						// to an integer
						$id = (integer) $id;
					?>
			bool shm_detach ( resource $shm_identifier )
				切断与给定的共享内存段的联系。记住:共享内存段仍然存在于Unix系统中,并且数据仍然存在。(和我们知道的格式化的概念是类似的,只是标记这块分区可以重新写入东西了,并不会将之前的数据删除)

			bool shm_detach ( resource $shm_identifier )
				在给定的内存段中,通过给定的变量的键,来插入或者更新给变的变量。
				如果指定的共享内存段ID,不是有效的共享内存索引,或者没有足够的共享内存来完成请求,会生成一个警告!
				参数:
					$shm_identifier - 由 shm_attach() 返回的共享内存段资源
					$variable_key - 变量的键
					$variable - 变量。只要是 serialize() 支持的变量类型,都可以使用。通常,这意味着:除了资源和一些外部的对象不能被序列化,其它数据类型都可以。

			mixed shm_get_var ( resource $shm_identifier , int $variable_key )
				在给定的共享内存段中,通过给定的变量的键,返回变量。变量扔存储在共享内存中。
				参数:
					$shm_identifier - 由 shm_attach() 返回的共享内存段资源
					$variable_key - 变量的键

			bool shm_has_var ( resource $shm_identifier , int $variable_key )
				检查给定的变量的键,是否存在于给定的共享内存段中
				参数:
					$shm_identifier - 由 shm_attach() 返回的共享内存段资源
					$variable_key - 变量的键

			bool shm_remove_var ( resource $shm_identifier , int $variable_key )
				在给定的共享内存段中,通过给定的变量的键,删除给定的变量,并释放占用的内存!(真正的删除数据)
				参数:
					$shm_identifier - 由 shm_attach() 返回的共享内存段资源
					$variable_key - 变量的键

			bool shm_remove ( resource $shm_identifier )
				删除给定的共享内存段。所有的数据都会被清除!
				参数:
					$shm_identifier - 由 shm_attach() 返回的共享内存段资源

		inter-process messaging (IPC):
			resource msg_get_queue ( int $key [, int $perms = 0666 ] )
				通过给定的$key,返回一个可用于访问 System V 消息队列的ID标识符。第一次调用,使用可选的$perm,创建消息队列。第二次使用相同的$key来调用msg_get_queue(),返回一个不同的消息队列标识符,但是2个都会指向同一个消息队列。第二次调用,会忽略$perm参数
				参数:
					$key - 消息队列数字ID(可能是我们任意指定)
					$perms - 队列权限。默认是 '0666'。如果消息队列已存在,忽略该参数。

			bool msg_queue_exists ( int $key )
				检查消息队列的键是否存在
				参数:
					$key - 消息队列的键(可能是:msg_get_queue()中的$key参数,因为它是int类型,而不是 msg_get_queue()返回的resource类型)

			bool msg_set_queue ( resource $queue , array $data )
				该函数,允许改变 msg_perm.uid, msg_perm.gid, msg_perm.mode和底层消息队列数据结构的 msg_qbytes 字段的值。
				改变数据结构,需要PHP以创建消息队列相同的用户来运行。拥有队列(由 msg_perm.xxx 字段来决定),或者使用root权限来运行。如果权限用于提升 msg_qbytes 值,从而超越系统定义的限制。
				参数:
					$queue - msg_get_queue()返回的消息队列资源
					$data - 指定设置队列的配置字段数组
				示例:
					<?php
						$msg_id = msg_get_queue (12341234, 0600);
						msg_set_queue ($msg_id, array ('msg_perm.uid'=>'80'));
					?>

			array msg_stat_queue ( resource $queue )
				返回给定队列的消息队列元数据。这是很有用的,例如:来确定刚刚接手的消息是由哪个进程发送的。
				参数:
					$queue - msg_get_queue()返回的消息队列资源
				返回值:
					返回一个数组,数据结构:
					msg_perm.uid - 队列拥有者的uid 
					msg_perm.gid - 队列拥有者的gid 
					msg_perm.mode - 队列的访问权限
					msg_perm.stime - 最后一条消息被发送到队列的时间
					msg_perm.rtime - 从队列接收到最后一条消息的时间
					msg_perm.ctime - 队列最后修改的时间
					msg_perm.qnum - 队列中,等待读取的消息条数
					msg_perm.qbytes - 一个消息队列中,允许的最大字节数。在Linux系统中,该值可通过 '/prc/sys/kernel/msgmnb' 被读取并修改
					msg_perm.lspid - 最后发送消息给队列的进程ID
					msg_perm.lrpid - 最后从队列接收消息的进程ID

			bool msg_remove_queue ( resource $queue )
				销毁指定的消息队列。当所有与消息队列工作的相关进程完毕后,需要释放它占据的系统资源,才调用此函数!
				参数:
					$queue - msg_get_queue()返回的消息队列资源

			bool msg_send ( resource $queue , int $msgtype , mixed $message [, bool $serialize = true [, bool $blocking = true [, int &$errorcode ]]] )
				发送一个由$msgtype指定类型(必须>0)的消息,给指定的消息队列($queue指定)。
				参数:
					$queue - msg_get_queue()返回的消息队列资源
					$msgtype - 消息类型
					$message - 消息内容
					$serialize - 
					$blocking - 
					$errorcode - 

			bool msg_receive ( resource $queue , int $desiredmsgtype , int &$msgtype , int $maxsize , mixed &$message [, bool $unserialize = true [, int $flags = 0 [, int &$errorcode ]]] )
				接收消息

		消息队列 - 本扩展应该没啥用,有很多更好的第三方消息队列扩展!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值