search

php讯息队列

Jun 13, 2016 am 10:49 AM
gtmessagemsgqueuethis

php消息队列

php-通过共享内存实现消息队列和进程通信的两个类

实现消息队列,可以使用比较专业的工具,例如:Apache ActiveMQ、memcacheq…..,下面是两个基本简单的实现方式:

使用memcache方法来实现

<?php /* * @Copyright (c) 2007,上海友邻信息科技有限公司 * @All	rights reserved. * * 这个消息队列不是线程安全的,我只是尽量的避免了冲突的可能性。如果你要实现线程安全的,一个建议是通过文件进行锁定,然后进行操作。 * * @filename   MemcacheQueue.class.php *//** * Class and Function List: * Function list: * - __construct() * - singleton() * - init() * - __get() * - __set() * - isEmpty() * - isFull() * - enQueue() * - deQueue() * - getTop() * - getAll() * - getPage() * - makeEmpty() * - getAllKeys() * - add() * - increment() * - decrement() * - set() * - get() * - delete() * - getKeyByPos() * Classes list: * - Yl_MemcacheQueue */class Yl_MemcacheQueue {	private static $instance;	private $memcache;	private $name;	private $prefix;	private $maxSize;		private function __construct() {	}		static function singleton() {				if (! (self::$instance instanceof self)) {			self::$instance = new Yl_MemcacheQueue ();				}				return self::$instance;	}		public function init($max_size, $name, $prefix = "__queue__") {		$max_size = 1000;		$name = '_war_';		$prefix = '_queue';				$this->memcache = Yl_Memcache::singleton ();		$this->name = $name;		$this->prefix = $prefix;		$this->maxSize = $max_size;				$this->add ( 'front', 0 );		$this->add ( 'rear', 0 );		$this->add ( 'size', 0 );	}		function isEmpty() {		return $this->get ( 'size' ) == 0;	}		function isFull() {		return $this->get ( 'size' ) >= $this->maxSize;	}		function enQueue($data) {		if ($this->isFull ()) {			throw new Exception ( "Queue is Full" );		}				$size = $this->increment ( 'size' );		$rear = $this->increment ( 'rear' );				$this->set ( ($rear - 1) % $this->maxSize, $data );				return $this;	}		function deQueue() {		if ($this->isEmpty ()) {			throw new Exception ( "Queue is Empty" );		}				$this->decrement ( 'size' );		$front = $this->increment ( 'front' );		$this->delete ( ($front - 1) % $this->maxSize );				return $this;	}		function getTop() {		return $this->get ( $this->get ( 'front' ) % $this->maxSize );	}		function getAll() {		return $this->getPage ();	}		function getPage($offset = 0, $limit = 0) {		$size = $this->get ( 'size' );				if (0 == $size || $size get ( 'front' ) % $this->maxSize;		$rear = $this->get ( 'rear' ) % $this->maxSize;				$keys [] = $this->getKeyByPos ( ($front + $offset) % $this->maxSize );		$num = 1;				for($pos = ($front + $offset + 1) % $this->maxSize; $pos != $rear; $pos = ($pos + 1) % $this->maxSize) {			$keys [] = $this->getKeyByPos ( $pos );			$num ++;						if ($limit > 0 && $limit == $num) {				break;			}		}				return array_values ( $this->memcache->get ( $keys ) );	}		function makeEmpty() {		$keys = $this->getAllKeys ();				foreach ( $keys as $value ) {			$this->delete ( $value );		}				$this->delete ( "rear" );		$this->delete ( "front" );		$this->delete ( 'size' );		$this->delete ( "maxSize" );	}		private function getAllKeys() {		if ($this->isEmpty ()) {			return array ();		}				$keys [] = $this->get ( 'front' );				for($pos = ($this->get ( 'front' ) % $this->maxSize + 1) % $this->maxSize; $pos != $this->get ( 'rear' ) % $this->maxSize; $pos = ($pos + 1) % $this->maxSize) {			$keys [] = $pos;		}				return $keys;	}		private function add($pos, $data) {		$this->memcache->add ( $this->getKeyByPos ( $pos ), $data );				return $this;	}		private function increment($pos) {				return $this->memcache->increment ( $this->getKeyByPos ( $pos ) );	}		private function decrement($pos) {		$this->memcache->decrement ( $this->getKeyByPos ( $pos ) );	}		private function set($pos, $data) {		$this->memcache->save ( $data, $this->getKeyByPos ( $pos ) );				return $this;	}		private function get($pos) {				return $this->memcache->get ( $this->getKeyByPos ( $pos ) );	}		private function delete($pos) {				return $this->memcache->delete ( $this->getKeyByPos ( $pos ) );	}		private function getKeyByPos($pos) {				return $this->prefix . $this->name . $pos;	}}?>
使用共享内存队列实现 点击查看原文地址

?

利用PHP操作Linux消息队列完成进程间通信

当我们开发的系统需要使用多进程方式运行时,进程间通信便成了至关重要的环节。消息队列(message queue)是Linux系统进程间通信的一种方式。
  关于Linux系统进程通信的概念及实现可查看:http://www.ibm.com/developerworks/cn/linux/l-ipc/
  关于Linux系统消息队列的概念及实现可查看:http://www.ibm.com/developerworks/cn/linux/l-ipc/part4/
  PHP的sysvmsg模块是对Linux系统支持的System V IPC中的System V消息队列函数族的封装。我们需要利用sysvmsg模块提供的函数来进进程间通信。先来看一段示例代码_1:

<?php $message_queue_key = ftok(__FILE__, 'a');$message_queue = msg_get_queue($message_queue_key, 0666);var_dump($message_queue);$message_queue_status = msg_stat_queue($message_queue);print_r($message_queue_status);//向消息队列中写msg_send($message_queue, 1, "Hello,World!");$message_queue_status = msg_stat_queue($message_queue);print_r($message_queue_status);//从消息队列中读msg_receive($message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWAIT);print_r($message."\r\n");msg_remove_queue($message_queue);?>
?这段代码的运行结果如下:
resource(4) of type (sysvmsg queue)Array(    [msg_perm.uid] => 1000    [msg_perm.gid] => 1000    [msg_perm.mode] => 438    [msg_stime] => 0    [msg_rtime] => 0    [msg_ctime] => 1279849495    [msg_qnum] => 0    [msg_qbytes] => 16384    [msg_lspid] => 0    [msg_lrpid] => 0)Array(    [msg_perm.uid] => 1000    [msg_perm.gid] => 1000    [msg_perm.mode] => 438    [msg_stime] => 1279849495    [msg_rtime] => 0    [msg_ctime] => 1279849495    [msg_qnum] => 1    [msg_qbytes] => 16384    [msg_lspid] => 2184    [msg_lrpid] => 0)Hello,World!
?可以看到已成功从消息队列中读取“Hello,World!”字符串

下面列举一下示例代码中的主要函数:

ftok ( string $pathname , string $proj ) 	手册上给出的解释是:Convert a pathname and a project identifier to a System V IPC key。这个函数返回的键值唯一对应linux系统中一个消息队列。在获得消息队列的引用之前都需要调用这个函数。msg_get_queue ( int $key [, int $perms ] )	msg_get_queue()会根据传入的键值返回一个消息队列的引用。如果linux系统中没有消息队列与键值对应,msg_get_queue()将会创建一个新的消息队列。函数的第二个参数需要传入一个int值,作为新创建的消息队列的权限值,默认为0666。这个权限值与linux命令chmod中使用的数值是同一个意思,因为在linux系统中一切皆是文件。msg_send ( resource $queue , int $msgtype , mixed $message [, bool $serialize [, bool $blocking [, int &$errorcode ]]] )	顾名思义,该函数用来向消息队列中写数据。msg_stat_queue ( resource $queue ) 	这个函数会返回消息队列的元数据。消息队列元数据中的信息很完整,包括了消息队列中待读取的消息数、最后读写队列的进程ID等。示例代码在第8行调用该函数返回的数组中队列中待读取的消息数msg_qnum值为0。msg_receive ( resource $queue , int $desiredmsgtype , int &$msgtype , int $maxsize , mixed &$message [, bool $unserialize [, int $flags [, int &$errorcode ]]] ) 	msg_receive用于读取消息队列中的数据。msg_remove_queue ( resource $queue )     msg_remove_queue用于销毁一个队列。
?示例代码_1只是展示了PHP操作消息队列函数的应用。下面的代码具体描述了进程间通信的场景
<?php $message_queue_key = ftok ( __FILE__, 'a' );$message_queue = msg_get_queue ( $message_queue_key, 0666 );$pids = array ();for($i = 0; $i < 5; $i ++) {	//创建子进程	$pids [$i] = pcntl_fork ();		if ($pids [$i]) {		echo "No.$i child process was created, the pid is $pids[$i]\r\n";	} elseif ($pids [$i] == 0) {		$pid = posix_getpid ();		echo "process.$pid is writing now\r\n";				msg_send ( $message_queue, 1, "this is process.$pid's data\r\n" );		posix_kill ( $pid, SIGTERM );	}}do {	msg_receive ( $message_queue, 0, $message_type, 1024, $message, true, MSG_IPC_NOWAIT );	echo $message;	//需要判断队列是否为空,如果为空就退出//break;} while ( true )?>
运行结果为:
No.0 child process was created, the pid is 5249No.1 child process was created, the pid is 5250No.2 child process was created, the pid is 5251No.3 child process was created, the pid is 5252No.4 child process was created, the pid is 5253process.5251 is writing nowthis is process.5251's dataprocess.5253 is writing nowprocess.5252 is writing nowprocess.5250 is writing nowthis is process.5253's datathis is process.5252's datathis is process.5250's dataprocess.5249 is writing nowthis is process.5249's data

redis
http://www.neatstudio.com/show-976-1.shtml

?

php自带的三个消息队列相关的函数
http://www.zhangguangda.com/?p=89?

Statement
The content of this article is voluntarily contributed by netizens, and the copyright belongs to the original author. This site does not assume corresponding legal responsibility. If you find any content suspected of plagiarism or infringement, please contact admin@php.cn
PHP Performance Tuning for High Traffic WebsitesPHP Performance Tuning for High Traffic WebsitesMay 14, 2025 am 12:13 AM

ThesecrettokeepingaPHP-poweredwebsiterunningsmoothlyunderheavyloadinvolvesseveralkeystrategies:1)ImplementopcodecachingwithOPcachetoreducescriptexecutiontime,2)UsedatabasequerycachingwithRedistolessendatabaseload,3)LeverageCDNslikeCloudflareforservin

Dependency Injection in PHP: Code Examples for BeginnersDependency Injection in PHP: Code Examples for BeginnersMay 14, 2025 am 12:08 AM

You should care about DependencyInjection(DI) because it makes your code clearer and easier to maintain. 1) DI makes it more modular by decoupling classes, 2) improves the convenience of testing and code flexibility, 3) Use DI containers to manage complex dependencies, but pay attention to performance impact and circular dependencies, 4) The best practice is to rely on abstract interfaces to achieve loose coupling.

PHP Performance: is it possible to optimize the application?PHP Performance: is it possible to optimize the application?May 14, 2025 am 12:04 AM

Yes,optimizingaPHPapplicationispossibleandessential.1)ImplementcachingusingAPCutoreducedatabaseload.2)Optimizedatabaseswithindexing,efficientqueries,andconnectionpooling.3)Enhancecodewithbuilt-infunctions,avoidingglobalvariables,andusingopcodecaching

PHP Performance Optimization: The Ultimate GuidePHP Performance Optimization: The Ultimate GuideMay 14, 2025 am 12:02 AM

ThekeystrategiestosignificantlyboostPHPapplicationperformanceare:1)UseopcodecachinglikeOPcachetoreduceexecutiontime,2)Optimizedatabaseinteractionswithpreparedstatementsandproperindexing,3)ConfigurewebserverslikeNginxwithPHP-FPMforbetterperformance,4)

PHP Dependency Injection Container: A Quick StartPHP Dependency Injection Container: A Quick StartMay 13, 2025 am 12:11 AM

APHPDependencyInjectionContainerisatoolthatmanagesclassdependencies,enhancingcodemodularity,testability,andmaintainability.Itactsasacentralhubforcreatingandinjectingdependencies,thusreducingtightcouplingandeasingunittesting.

Dependency Injection vs. Service Locator in PHPDependency Injection vs. Service Locator in PHPMay 13, 2025 am 12:10 AM

Select DependencyInjection (DI) for large applications, ServiceLocator is suitable for small projects or prototypes. 1) DI improves the testability and modularity of the code through constructor injection. 2) ServiceLocator obtains services through center registration, which is convenient but may lead to an increase in code coupling.

PHP performance optimization strategies.PHP performance optimization strategies.May 13, 2025 am 12:06 AM

PHPapplicationscanbeoptimizedforspeedandefficiencyby:1)enablingopcacheinphp.ini,2)usingpreparedstatementswithPDOfordatabasequeries,3)replacingloopswitharray_filterandarray_mapfordataprocessing,4)configuringNginxasareverseproxy,5)implementingcachingwi

PHP Email Validation: Ensuring Emails Are Sent CorrectlyPHP Email Validation: Ensuring Emails Are Sent CorrectlyMay 13, 2025 am 12:06 AM

PHPemailvalidationinvolvesthreesteps:1)Formatvalidationusingregularexpressionstochecktheemailformat;2)DNSvalidationtoensurethedomainhasavalidMXrecord;3)SMTPvalidation,themostthoroughmethod,whichchecksifthemailboxexistsbyconnectingtotheSMTPserver.Impl

See all articles

Hot AI Tools

Undresser.AI Undress

Undresser.AI Undress

AI-powered app for creating realistic nude photos

AI Clothes Remover

AI Clothes Remover

Online AI tool for removing clothes from photos.

Undress AI Tool

Undress AI Tool

Undress images for free

Clothoff.io

Clothoff.io

AI clothes remover

Video Face Swap

Video Face Swap

Swap faces in any video effortlessly with our completely free AI face swap tool!

Hot Article

Hot Tools

Notepad++7.3.1

Notepad++7.3.1

Easy-to-use and free code editor

SecLists

SecLists

SecLists is the ultimate security tester's companion. It is a collection of various types of lists that are frequently used during security assessments, all in one place. SecLists helps make security testing more efficient and productive by conveniently providing all the lists a security tester might need. List types include usernames, passwords, URLs, fuzzing payloads, sensitive data patterns, web shells, and more. The tester can simply pull this repository onto a new test machine and he will have access to every type of list he needs.

MantisBT

MantisBT

Mantis is an easy-to-deploy web-based defect tracking tool designed to aid in product defect tracking. It requires PHP, MySQL and a web server. Check out our demo and hosting services.

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

Powerful PHP integrated development environment

SublimeText3 Chinese version

SublimeText3 Chinese version

Chinese version, very easy to use