{"id":26985,"date":"2024-11-24T18:38:51","date_gmt":"2024-11-24T10:38:51","guid":{"rendered":"https:\/\/fwq.ai\/blog\/?p=26985"},"modified":"2024-11-24T18:38:51","modified_gmt":"2024-11-24T10:38:51","slug":"rabbitmq%e7%9a%84php%e6%95%99%e7%a8%8b%e4%b9%8btopic-%e4%ba%94","status":"publish","type":"post","link":"https:\/\/fwq.ai\/blog\/26985\/","title":{"rendered":"RabbitMQ\u7684PHP\u6559\u7a0b\u4e4btopic (\u4e94)"},"content":{"rendered":"<p>\u5b66\u4e60\u5b8c\u4e86RabbitMQ\u7684PHP\u6559\u7a0b\u4e4bRouting (\u56db)\uff0croute\u7684\u6838\u5fc3\u601d\u60f3\u5c31\u662f\u544a\u8bc9\u6211\u4eec\uff0cqueue\u662f\u53ef\u4ee5\u7ed1\u5b9a\u591a\u5c11routeKey\uff0c\u540c\u65f6\u63a5\u6536\u591a\u4e2arouteKey\u7684\u6d88\u606f\uff0c\u5728\u6587\u7ae0\u7684\u672b\u5c3e\uff0c\u6211\u4e5f\u603b\u7ed3exchange\u3001routeKey\u3001queue\u3001message\u4e4b\u95f4\u7684\u5bf9\u5e94\u5173\u7cfb \u3002\u5728\u6587\u4e2d\u6709\u4ee5\u4e0b\u51e0\u884c\u4ee3\u7801\uff1a<\/p>\n<p>&nbsp;<\/p>\n<pre>$queue-&gt;bind('exchange.log','warning');\r\n$queue-&gt;bind('exchange.logs','error');\r\n$queue-&gt;bind('exchange.logs','critical');\r\n$queue-&gt;bind('exchange.logs','alert');\r\n$queue-&gt;bind('exchange.logs','emergency');<\/pre>\n<p>\u6211\u4eec\u641ePHP\u4e5f\u77e5\u9053\uff0c\u8fd9\u79cd\u5199\u6cd5\u592a\u8fc7\u4e8e\u6b7b\u677f\u3002\u5982\u679c\u63a5\u6536\u7684\u6d88\u606frouteKey\u5f88\u591a\uff0c\u90a3\u6211\u4eec\u5c31\u7684\u4e00\u884c\u884c\u6dfb\u52a0\uff08\u5f53\u7136\u4f60\u53ef\u4ee5\u91c7\u7528foreach\u5faa\u73af\uff09\uff0c\u5982\u679c\u6211\u4eec\u8981\u5bf9\u65e5\u5fd7\u7684\u6765\u6e90\u8fdb\u884c\u518d\u5206\u7c7b\uff0c\u6bd4\u65b9\u8bf4\u6709register\u3001login\u3001mail\u7b49\u7b49\uff0c\u90a3\u4e48\u4e45\u9700\u8981bind\u5f88\u591a\u7684routeKey\uff0c\u5927\u6982\u4f1a\u5982\u4e0b\uff1a<\/p>\n<pre>$queue-&gt;bind('exchange.log','register.warning');\r\n$queue-&gt;bind('exchange.logs','register.error');\r\n$queue-&gt;bind('exchange.logs','register.critical');\r\n$queue-&gt;bind('exchange.logs','register.alert');\r\n$queue-&gt;bind('exchange.logs','register.emergency');\r\n\r\n.......\r\n\r\n$queue-&gt;bind('exchange.log','mail.warning');\r\n$queue-&gt;bind('exchange.logs','mail.error');\r\n$queue-&gt;bind('exchange.logs','mail.critical');\r\n$queue-&gt;bind('exchange.logs','mail.alert');\r\n$queue-&gt;bind('exchange.logs','mail.emergency');<\/pre>\n<p>\u90a3\u4e48\u6211\u4eec\u6709\u6ca1\u6709\u4e00\u79cd\u529e\u6cd5\u6765\u5904\u7406\u8fd9\u79cd\u60c5\u51b5\u5462\uff0c\u8fd9\u5c31\u662f\u672c\u7ae0\u7684\u5b66\u4e60\u7684exchange\u4e2dtopic\u7c7b\u578b\u3002 \u4f7f\u7528topic\u7c7b\u578b\u540e\uff0croutKey\u652f\u6301\u6a21\u7cca\u5339\u914d\uff0c\u4f46\u4ec5\u652f\u6301\u4ee5\u4e0b2\u79cd\u5199\u6cd5\uff1a<\/p>\n<pre>*\uff08\u661f\u53f7\uff09\u53ef\u4ee5\u4ee3\u8868\u4e00\u4e2a<strong>\u5355\u8bcd<\/strong>\r\n#\uff08\u4e95\u53f7\uff09\u53ef\u4ee5\u4ee3\u8868\u96f6\u4e2a\u6216\u591a\u4e2a<strong>\u5355\u8bcd \/\/\u8bf7\u52a1\u5fc5\u6ce8\u610f\u662f\u5355\u8bcd\uff0c\u6b64\u65f6\u7684routeKey\u662f\u4f7f\u7528.\u94fe\u63a5\u7684\u5b57\u7b26\u4e32\u3002<\/strong><\/pre>\n<p>\u6211\u8fd8\u662f\u4e3e\u4f8b\u8bf4\u660e\u5427\uff0c\u5047\u8bbe\u6211\u4eec\u6709\u4e00\u4e2a\u9700\u6c42\uff0c\u9700\u8981\u5bf9\u65e5\u5fd7\u7684\u6765\u6e90\u8fdb\u884c\u5206\u7c7b\u5904\u7406\u3002<br \/>\n\u4e0d\u7ba1\u662f\u4eceregister\u3001login\u8fd8\u662fmail\u4e2d\uff0cwarning, error, critical, alert, emergency\u90fd\u8f6c\u53d1\u5230queue.log.error\u961f\u5217\uff0cnotice\u90fd\u8f6c\u53d1\u5230queue.log.notice\u961f\u5217\uff0cdebug\u3001info\u90fd\u8f6c\u53d1\u5230queue.log.debug\u4e2d\u3002\u4ee3\u7801\u5982\u4e0b\uff1a<\/p>\n<h2>send.php<\/h2>\n<pre>$channel = new \\AMQPChannel($conn);\r\n$channel-&gt;qos(0,0);\r\n\r\n$exchange = new \\AMQPExchange($channel);\r\n$exchange-&gt;setName('exchange.all.logs');\r\n$exchange-&gt;setType(AMQP_EX_TYPE_TOPIC);\r\n$exchange-&gt;setFlags(AMQP_DURABLE);\r\n$exchange-&gt;declareExchange();\r\n\r\n\/\/\u5faa\u73af\u751f\u6210\u6d88\u606f\u9700\u8981\u53d1\u5e03\u7684\u6d88\u606f\r\n$origins = ['register','login','mail'];\r\n$levels = ['debug','info','notice','warning','error','critical','alert','emergency'];\r\nforeach ($origins as $origin) {\r\n    foreach ($levels as $level) {\r\n        $message = \"[$origin]Message[$level]\";\r\n        $routeKey = \"$origin.$level\";\r\n        \/\/echo $message.\"======\".$routeKey.\"\\n\";\r\n        $result = $exchange-&gt;publish($message, $routeKey);\r\n        var_dump($result);\r\n    }\r\n}<\/pre>\n<h2>receive.php<\/h2>\n<pre>$channel = new \\AMQPChannel($conn);\r\n$channel-&gt;qos(0,1);\r\n\r\n$queue = new \\AMQPQueue($channel);\r\n$queue-&gt;setName(\"queue.all.errors\");\r\n$queue-&gt;setFlags(AMQP_DURABLE);\r\n$queue-&gt;declareQueue();\r\n$queue-&gt;bind('exchange.all.logs','#.warning');\r\n$queue-&gt;bind('exchange.all.logs','#.error');\r\n$queue-&gt;bind('exchange.all.logs','#.critical');\r\n$queue-&gt;bind('exchange.all.logs','#.alert');\r\n$queue-&gt;bind('exchange.all.logs','#.emergency');\r\n$queue-&gt;consume('processMessage',AMQP_AUTOACK);\r\n\r\nfunction processMessage($envelope, $queue) {\r\n    global $i;\r\n    echo \"Message $i: \" . $envelope-&gt;getBody() . \"\\n\";\r\n    $i++;\r\n}<\/pre>\n","protected":false},"excerpt":{"rendered":"<p>\u5b66\u4e60\u5b8c\u4e86RabbitMQ\u7684PHP\u6559\u7a0b\u4e4bRouting (\u56db)\uff0croute\u7684\u6838\u5fc3\u601d\u60f3\u5c31\u662f\u544a\u8bc9\u6211\u4eec\uff0cqueue\u662f\u53ef\u4ee5\u7ed1\u5b9a\u591a\u5c11routeKey\uff0c\u540c\u65f6\u63a5\u6536\u591a\u4e2arouteKey\u7684\u6d88\u606f\uff0c\u5728\u6587\u7ae0\u7684\u672b\u5c3e\uff0c\u6211\u4e5f\u603b\u7ed3exchange\u3001routeKey\u3001queue\u3001message\u4e4b\u95f4\u7684\u5bf9\u5e94\u5173\u7cfb \u3002\u5728\u6587\u4e2d\u6709\u4ee5\u4e0b\u51e0\u884c\u4ee3\u7801\uff1a &nbsp; $queue-&gt;bind(&#8216;exchange.log&#8217;,&#8217;warning&#8217;); $queue-&gt;bind(&#8216;exchange.logs&#8217;,&#8217;error&#8217;); $queue-&gt;bind(&#8216;exchange.logs&#8217;,&#8217;critical&#8217;); $queue-&gt;bind(&#8216;exchange.logs&#8217;,&#8217;alert&#8217;); $queue-&gt;bind(&#8216;exchange.logs&#8217;,&#8217;emergency&#8217;); \u6211\u4eec\u641ePHP\u4e5f\u77e5\u9053\uff0c\u8fd9\u79cd\u5199\u6cd5\u592a\u8fc7\u4e8e\u6b7b\u677f\u3002\u5982\u679c\u63a5\u6536\u7684\u6d88\u606frouteKey\u5f88\u591a\uff0c\u90a3\u6211\u4eec\u5c31\u7684\u4e00\u884c\u884c\u6dfb\u52a0\uff08\u5f53\u7136\u4f60\u53ef\u4ee5\u91c7\u7528foreach\u5faa\u73af\uff09\uff0c\u5982\u679c\u6211\u4eec\u8981\u5bf9\u65e5\u5fd7\u7684\u6765\u6e90\u8fdb\u884c\u518d\u5206\u7c7b\uff0c\u6bd4\u65b9\u8bf4\u6709register\u3001login\u3001mail\u7b49\u7b49\uff0c\u90a3\u4e48\u4e45\u9700\u8981bind\u5f88\u591a\u7684routeKey\uff0c\u5927\u6982\u4f1a\u5982\u4e0b\uff1a $queue-&gt;bind(&#8216;exchange.log&#8217;,&#8217;register.warning&#8217;); $queue-&gt;bind(&#8216;exchange.logs&#8217;,&#8217;register.error&#8217;); $queue-&gt;bind(&#8216;exchange.logs&#8217;,&#8217;register.critical&#8217;); $queue-&gt;bind(&#8216;exchange.logs&#8217;,&#8217;register.alert&#8217;); $queue-&gt;bind(&#8216;exchange.logs&#8217;,&#8217;register.emergency&#8217;); &#8230;&#8230;. $queue-&gt;bind(&#8216;exchange.log&#8217;,&#8217;mail.warning&#8217;); $queue-&gt;bind(&#8216;exchange.logs&#8217;,&#8217;mail.error&#8217;); $queue-&gt;bind(&#8216;exchange.logs&#8217;,&#8217;mail.critical&#8217;); $queue-&gt;bind(&#8216;exchange.logs&#8217;,&#8217;mail.alert&#8217;); $queue-&gt;bind(&#8216;exchange.logs&#8217;,&#8217;mail.emergency&#8217;); \u90a3\u4e48\u6211\u4eec\u6709\u6ca1\u6709\u4e00\u79cd\u529e\u6cd5\u6765\u5904\u7406\u8fd9\u79cd\u60c5\u51b5\u5462\uff0c\u8fd9\u5c31\u662f\u672c\u7ae0\u7684\u5b66\u4e60\u7684exchange\u4e2dtopic\u7c7b\u578b\u3002 \u4f7f\u7528topic\u7c7b\u578b\u540e\uff0croutKey\u652f\u6301\u6a21\u7cca\u5339\u914d\uff0c\u4f46\u4ec5\u652f\u6301\u4ee5\u4e0b2\u79cd\u5199\u6cd5\uff1a *\uff08\u661f\u53f7\uff09\u53ef\u4ee5\u4ee3\u8868\u4e00\u4e2a\u5355\u8bcd #\uff08\u4e95\u53f7\uff09\u53ef\u4ee5\u4ee3\u8868\u96f6\u4e2a\u6216\u591a\u4e2a\u5355\u8bcd \/\/\u8bf7\u52a1\u5fc5\u6ce8\u610f\u662f\u5355\u8bcd\uff0c\u6b64\u65f6\u7684routeKey\u662f\u4f7f\u7528.\u94fe\u63a5\u7684\u5b57\u7b26\u4e32\u3002 \u6211\u8fd8\u662f\u4e3e\u4f8b\u8bf4\u660e\u5427\uff0c\u5047\u8bbe\u6211\u4eec\u6709\u4e00\u4e2a\u9700\u6c42\uff0c\u9700\u8981\u5bf9\u65e5\u5fd7\u7684\u6765\u6e90\u8fdb\u884c\u5206\u7c7b\u5904\u7406\u3002 \u4e0d\u7ba1\u662f\u4eceregister\u3001login\u8fd8\u662fmail\u4e2d\uff0cwarning, error, critical, alert, emergency\u90fd\u8f6c\u53d1\u5230queue.log.error\u961f\u5217\uff0cnotice\u90fd\u8f6c\u53d1\u5230queue.log.notice\u961f\u5217\uff0cdebug\u3001info\u90fd\u8f6c\u53d1\u5230queue.log.debug\u4e2d\u3002\u4ee3\u7801\u5982\u4e0b\uff1a send.php $channel = new \\AMQPChannel($conn); $channel-&gt;qos(0,0); $exchange = new \\AMQPExchange($channel); $exchange-&gt;setName(&#8216;exchange.all.logs&#8217;); $exchange-&gt;setType(AMQP_EX_TYPE_TOPIC); $exchange-&gt;setFlags(AMQP_DURABLE); $exchange-&gt;declareExchange(); \/\/\u5faa\u73af\u751f\u6210\u6d88\u606f\u9700\u8981\u53d1\u5e03\u7684\u6d88\u606f $origins = [&#8216;register&#8217;,&#8217;login&#8217;,&#8217;mail&#8217;]; $levels = [&#8216;debug&#8217;,&#8217;info&#8217;,&#8217;notice&#8217;,&#8217;warning&#8217;,&#8217;error&#8217;,&#8217;critical&#8217;,&#8217;alert&#8217;,&#8217;emergency&#8217;]; foreach ($origins [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[],"class_list":["post-26985","post","type-post","status-publish","format-standard","hentry","category-docker"],"_links":{"self":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/26985","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/comments?post=26985"}],"version-history":[{"count":1,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/26985\/revisions"}],"predecessor-version":[{"id":26993,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/posts\/26985\/revisions\/26993"}],"wp:attachment":[{"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/media?parent=26985"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/categories?post=26985"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/fwq.ai\/blog\/wp-json\/wp\/v2\/tags?post=26985"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}