php讯息队列
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!
下面列举一下示例代码中的主要函数:
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用于销毁一个队列。
<?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 5249 No.1 child process was created, the pid is 5250 No.2 child process was created, the pid is 5251 No.3 child process was created, the pid is 5252 No.4 child process was created, the pid is 5253 process.5251 is writing now this is process.5251's data process.5253 is writing now process.5252 is writing now process.5250 is writing now this is process.5253's data this is process.5252's data this is process.5250's data process.5249 is writing now this is process.5249's data
redis
http://www.neatstudio.com/show-976-1.shtml
?
php自带的三个消息队列相关的函数
http://www.zhangguangda.com/?p=89?

Heiße KI -Werkzeuge

Undresser.AI Undress
KI-gestützte App zum Erstellen realistischer Aktfotos

AI Clothes Remover
Online-KI-Tool zum Entfernen von Kleidung aus Fotos.

Undress AI Tool
Ausziehbilder kostenlos

Clothoff.io
KI-Kleiderentferner

AI Hentai Generator
Erstellen Sie kostenlos Ai Hentai.

Heißer Artikel

Heiße Werkzeuge

Notepad++7.3.1
Einfach zu bedienender und kostenloser Code-Editor

SublimeText3 chinesische Version
Chinesische Version, sehr einfach zu bedienen

Senden Sie Studio 13.0.1
Leistungsstarke integrierte PHP-Entwicklungsumgebung

Dreamweaver CS6
Visuelle Webentwicklungstools

SublimeText3 Mac-Version
Codebearbeitungssoftware auf Gottesniveau (SublimeText3)

Heiße Themen

Viele Benutzer werden sich bei der Auswahl von Smartwatches für die Marke Huawei entscheiden. Viele Benutzer sind neugierig auf den Unterschied zwischen Huawei GT3pro und GT4. Was sind die Unterschiede zwischen Huawei GT3pro und GT4? 1. Aussehen GT4: 46 mm und 41 mm, das Material ist Glasspiegel + Edelstahlgehäuse + hochauflösende Faserrückschale. GT3pro: 46,6 mm und 42,9 mm, das Material ist Saphirglas + Titangehäuse/Keramikgehäuse + Keramikrückschale 2. Gesundes GT4: Mit dem neuesten Huawei Truseen5.5+-Algorithmus werden die Ergebnisse genauer. GT3pro: EKG-Elektrokardiogramm sowie Blutgefäß und Sicherheit hinzugefügt

Da Anwendungen immer komplexer werden, ist die Handhabung und Verwaltung großer Daten- und Prozessmengen eine Herausforderung. Um mit dieser Situation umzugehen, stellt Laravel den Benutzern ein sehr leistungsfähiges Tool zur Verfügung, die Laravel Queue (Queue). Es ermöglicht Entwicklern, Aufgaben wie das Versenden von E-Mails, das Erstellen von PDFs, das Zuschneiden von Bildern usw. im Hintergrund auszuführen, ohne dass dies Auswirkungen auf die Benutzeroberfläche hat. In diesem Artikel befassen wir uns mit der Verwendung von Laravel-Warteschlangen. Was ist die LaravelQueue-Warteschlange?

Warum das Snipping-Tool unter Windows 11 nicht funktioniert Das Verständnis der Grundursache des Problems kann dabei helfen, die richtige Lösung zu finden. Hier sind die häufigsten Gründe, warum das Snipping Tool möglicherweise nicht ordnungsgemäß funktioniert: Focus Assistant ist aktiviert: Dies verhindert, dass das Snipping Tool geöffnet wird. Beschädigte Anwendung: Wenn das Snipping-Tool beim Start abstürzt, ist es möglicherweise beschädigt. Veraltete Grafiktreiber: Inkompatible Treiber können das Snipping-Tool beeinträchtigen. Störungen durch andere Anwendungen: Andere laufende Anwendungen können mit dem Snipping Tool in Konflikt geraten. Das Zertifikat ist abgelaufen: Ein Fehler während des Upgrade-Vorgangs kann zu diesem Problem führen. Diese einfache Lösung ist für die meisten Benutzer geeignet und erfordert keine besonderen technischen Kenntnisse. 1. Aktualisieren Sie Windows- und Microsoft Store-Apps

Teil 1: Erste Schritte zur Fehlerbehebung Überprüfen des Apple-Systemstatus: Bevor wir uns mit komplexen Lösungen befassen, beginnen wir mit den Grundlagen. Das Problem liegt möglicherweise nicht an Ihrem Gerät; die Server von Apple sind möglicherweise ausgefallen. Besuchen Sie die Systemstatusseite von Apple, um zu sehen, ob der AppStore ordnungsgemäß funktioniert. Wenn es ein Problem gibt, können Sie nur warten, bis Apple es behebt. Überprüfen Sie Ihre Internetverbindung: Stellen Sie sicher, dass Sie über eine stabile Internetverbindung verfügen, da das Problem „Verbindung zum AppStore nicht möglich“ manchmal auf eine schlechte Verbindung zurückzuführen ist. Versuchen Sie, zwischen WLAN und mobilen Daten zu wechseln oder die Netzwerkeinstellungen zurückzusetzen (Allgemein > Zurücksetzen > Netzwerkeinstellungen zurücksetzen > Einstellungen). Aktualisieren Sie Ihre iOS-Version:

vue3 verwendet element-plus, um die Nachrichtenumgebung aufzurufen: vue3+typescript+element-plus1 Nach der globalen Einführung von element hat element die globale Methode $message in app.config.globalProperties hinzugefügt, sodass Sie mount(){( thisasany) direkt in der OptionsAPI. $message.success("this.$message");}2 In der CompositionAPI übergibt die Setup-Methode zwei Variablen props und

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

Sicherheitsprobleme und Lösungen für JavaQueue-Warteschlangen in Multithread-Umgebungen Einführung: Bei der Multithread-Programmierung können gemeinsam genutzte Ressourcen im Programm Race Conditions ausgesetzt sein, die zu Dateninkonsistenzen oder Fehlern führen können. In Java ist die Warteschlange eine häufig verwendete Datenstruktur. Wenn mehrere Threads gleichzeitig die Warteschlange betreiben, treten Sicherheitsprobleme auf. In diesem Artikel werden die Sicherheitsprobleme von JavaQueue-Warteschlangen in Multithread-Umgebungen erörtert und verschiedene Lösungen vorgestellt, wobei der Schwerpunkt auf Erklärungen in Form von Codebeispielen liegt. eins

Verwendung von Queue in Java In Java ist Queue (Warteschlange) eine häufig verwendete Datenstruktur, die dem First-In-First-Out-Prinzip (FIFO) folgt. Mit der Warteschlange können Nachrichtenwarteschlangen, Aufgabenplanung und andere Szenarien implementiert und die Anordnung und Verarbeitungsreihenfolge von Daten gut verwaltet werden. In diesem Artikel wird die Verwendung von Queue vorgestellt und spezifische Codebeispiele bereitgestellt. Die Definition und die allgemeinen Methoden von Queue sind in Java. Queue ist eine Schnittstelle im JavaCollectionsFramework
