рдореИрдВ
рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рд╛рдЗрдЯ рд╕реЗ рдкрд╛рдареЛрдВ
рдХреЗ рдЕрдиреБрд╡рд╛рдж рдХреА
рд╢реНрд░реГрдВрдЦрд▓рд╛ рдЬрд╛рд░реА рд░рдЦрддрд╛ рд╣реВрдВред рдЙрджрд╛рд╣рд░рдг php рдореЗрдВ рд╣реЛрдВрдЧреЗ, рд▓реЗрдХрд┐рди рдЙрдиреНрд╣реЗрдВ рдЕрдзрд┐рдХрд╛рдВрд╢ рд▓реЛрдХрдкреНрд░рд┐рдп
рднрд╛рд╖рд╛рдУрдВ рдкрд░ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИред
рдкрд┐рдЫрд▓реЗ
рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдПрдХ рд▓реЙрдЧрд┐рдВрдЧ рд╕рд┐рд╕реНрдЯрдо рд╡рд┐рдХрд╕рд┐рдд рдХрд┐рдпрд╛ рдерд╛ред рд╣рдо рдХрдИ рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛рдУрдВ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдореЗрдВ рд╕рдХреНрд╖рдо рдереЗред рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ рд╣рдо рдЕрдкрдиреЗ рдХрд╛рд░реНрдпрдХреНрд░рдо рдХрд╛ рдЖрдзреБрдирд┐рдХреАрдХрд░рдг рдХрд░реЗрдВрдЧреЗ - рд╣рдо рдкреНрд░рд╛рдкреНрддрдХрд░реНрддрд╛ рдХреЛ рдХреЗрд╡рд▓ рд╕рдВрджреЗрд╢реЛрдВ рдХрд╛ рд╣рд┐рд╕реНрд╕рд╛ рднреЗрдЬреЗрдВрдЧреЗред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдбрд┐рд╕реНрдХ рдкрд░ рдорд╣рддреНрд╡рдкреВрд░реНрдг рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рдХреЗрд╡рд▓ рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдмрдЪрд╛ рд╕рдХрддреЗ рд╣реИрдВ (рдбрд┐рд╕реНрдХ рд╕реНрдерд╛рди рдХреА рдмрдЪрдд), рдФрд░ рд╣рдо рдХрдВрд╕реЛрд▓ рдореЗрдВ рд╕рднреА рд╕рдВрджреЗрд╢ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░реЗрдВрдЧреЗред
рдмрд╛рдЗрдВрдбрд┐рдВрдЧ
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдордиреЗ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛рдИред рдХреЛрдб рдпрд╛рдж рдХрд░реЗрдВ:
$channel->queue_bind($queue_name, 'logs');
рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдПрдХреНрд╕реЗрд╕ рдкреНрд╡рд╛рдЗрдВрдЯ рдФрд░ рдХрддрд╛рд░ рдХреЗ рдмреАрдЪ рдХрд╛ рд╕рдВрдмрдВрдз рд╣реИред рдЗрд╕рдХреА рд╡реНрдпрд╛рдЦреНрдпрд╛ рдЗрд╕ рдкреНрд░рдХрд╛рд░ рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИ: рдХрддрд╛рд░ рдкрд╣реБрдБрдЪ рдмрд┐рдВрджреБ рд╕реЗ рд╕рдВрджреЗрд╢ рдкреНрд░рд╛рдкреНрдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреА рд╣реИред
рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рд░рд╛рдЙрдЯрд┐рдВрдЧ_рдХреА рдкреИрд░рд╛рдореАрдЯрд░ рд▓реЗ рд╕рдХрддреА рд╣реИред рдкреИрд░рд╛рдореАрдЯрд░ $ рдЪреИрдирд▓ рдХреЗ рд╕рд╛рде рднреНрд░рдорд┐рдд рди рд╣реЛрдиреЗ рдХреЗ рд▓рд┐рдП :: рдмреЗрд╕рд┐рдХ_рдкреНрд░рдХрд╛рд╢ (рдЗрд╕рдореЗрдВ рд░рд╛рдЙрдЯрд┐рдВрдЧ_рдХреА рдкреИрд░рд╛рдореАрдЯрд░ рднреА рд╢рд╛рдорд┐рд▓ рд╣реИ), рд╣рдо рдЗрд╕реЗ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдЬреЗрдХ рдХрд╣рддреЗ рд╣реИрдВред рдмрд╛рдЗрдВрдбрд┐рдВрдЧ_рдХреЗ рд╕рд╛рде рдмрд╛рдЗрдВрдбрд┐рдВрдЧ рдмрдирд╛рдиреЗ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:
$binding_key = 'black'; $channel->queue_bind($queue_name, $exchange_name, $binding_key);
рдЗрд╕ рдХреБрдВрдЬреА рдХрд╛ рдорд╛рди рдПрдХреНрд╕реЗрд╕ рдмрд┐рдВрджреБ рдХреЗ рдкреНрд░рдХрд╛рд░ рдкрд░ рдирд┐рд░реНрднрд░ рдХрд░рддрд╛ рд╣реИред рдкреНрд░рдХрд╛рд░ рдХреЗ рдкреНрд░рд╢рдВрд╕рдХ рдХрд╛ рдПрдХ рдкрд╣реБрдВрдЪ рдмрд┐рдВрджреБ рдмрд╕ рдЗрд╕реЗ рдЕрдирджреЗрдЦрд╛ рдХрд░реЗрдЧрд╛ред
рдбрд╛рдпрд░реЗрдХреНрдЯ рдПрдХреНрд╕реЗрд╕ рдкреНрд╡рд╛рдЗрдВрдЯ
рдкрд┐рдЫрд▓реЗ рд▓реЗрдЦ рдореЗрдВ рд╣рдорд╛рд░реА рд▓реЙрдЧрд┐рдВрдЧ рдкреНрд░рдгрд╛рд▓реА рдиреЗ рд╕рднреА рдЧреНрд░рд╛рд╣рдХреЛрдВ рдХреЛ рд╕рднреА рд╕рдВрджреЗрд╢ рднреЗрдЬреЗ рдереЗред рд╣рдо рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ рдорд╣рддреНрд╡ рджреЗрдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдкрдиреА рдкреНрд░рдгрд╛рд▓реА рдХрд╛ рд╡рд┐рд╕реНрддрд╛рд░ рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рд╣рдо рдЗрд╕реЗ рдмрдирд╛ рджреЗрдВрдЧреЗ рддрд╛рдХрд┐ рд▓реЙрдЧ рдХреЛ рдбрд┐рд╕реНрдХ рдкрд░ рд▓рд┐рдЦрдиреЗ рд╡рд╛рд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдЪреЗрддрд╛рд╡рдиреА рдпрд╛ рд╕реВрдЪрдирд╛ рдкреНрд░рдХрд╛рд░ рдХреЗ рд╕рдВрджреЗрд╢реЛрдВ рдкрд░ рдЕрдкрдиреА рдЬрдЧрд╣ рдмрд░реНрдмрд╛рдж рди рдХрд░реЗред
рдЗрд╕рд╕реЗ рдкрд╣рд▓реЗ рд╣рдордиреЗ рдЯрд╛рдЗрдк рдлреИрдирдЖрдЙрдЯ рдХреЗ рд╕рд╛рде рдПрдХ рдПрдХреНрд╕реЗрд╕ рдкреНрд╡рд╛рдЗрдВрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛, рдЬреЛ рд╣рдореЗрдВ рдкреВрд░реНрдг рд▓рдЪреАрд▓рд╛рдкрди рдирд╣реАрдВ рджреЗрддрд╛ рд╣реИ - рдпрд╣ рдХреЗрд╡рд▓ рд╕рд░рд▓ рдкреНрд░рд╕рд╛рд░рдг рдХреЗ рд▓рд┐рдП рдЙрдкрдпреБрдХреНрдд рд╣реИред
рдЗрд╕рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рдЗрд╕рдХрд╛ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИ - рд╕рдВрджреЗрд╢ рдХрддрд╛рд░ рдореЗрдВ рдЬрд╛рддреЗ рд╣реИрдВ рдЬрд┐рд╕рдХрд╛ рдмрд╛рдЗрдВрдбрд┐рдВрдЧ_рдХреА рд╕рдВрджреЗрд╢ рдХреА рд░реВрдЯрд┐рдВрдЧ рдХреБрдВрдЬреА рд╕реЗ рдореЗрд▓ рдЦрд╛рддрд╛ рд╣реИред
рдЪрд┐рддреНрд░ рдореЗрдВ рдЖрд░реЗрдЦ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░реЗрдВ:

рдЖрд░реЗрдЦ рдПрдХреНрд╕ рд╕реЗ рдкрддрд╛ рдЪрд▓рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд╕рд╛рде рджреЛ рдХрддрд╛рд░реЗрдВ рдЬреБрдбрд╝реА рд╣реБрдИ рд╣реИрдВред рдкрд╣рд▓рд╛ рдЪрд░рдг рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреБрдВрдЬреА = рдирд╛рд░рдВрдЧреА рдХреЗ рд╕рд╛рде рдЬреБрдбрд╝рд╛ рд╣реБрдЖ рд╣реИ, рдФрд░ рджреВрд╕рд░реЗ рдЪрд░рдг рдореЗрдВ рджреЛ рдХрдиреЗрдХреНрд╢рди рд╣реИрдВред рдПрдХ рдХреБрдВрдЬреА рдмрдВрдзрди рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде = рдХрд╛рд▓рд╛, рдФрд░ рджреВрд╕рд░рд╛ рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рд╣рд░рд╛ рд╣реИред
рд░реВрдЯрд┐рдВрдЧ рдХреБрдВрдЬреА рд╡рд╛рд▓реЗ рд╕рдВрджреЗрд╢ = рдирд╛рд░рдВрдЧреА рдХреЛ Q1 рдореЗрдВ рд░реВрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рдФрд░ рдХрд╛рд▓реЗ рдпрд╛ рд╣рд░реЗ рд░рдВрдЧ рдХреЗ рд╕рд╛рде рд╕рдВрджреЗрд╢реЛрдВ рдХреЛ Q2 рдореЗрдВ рд░реВрдЯ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред рдЕрдиреНрдп рд╕рднреА рд╕рдВрджреЗрд╢ рд╣рдЯрд╛ рджрд┐рдП рдЬрд╛рдПрдВрдЧреЗред
рдПрдХрд╛рдзрд┐рдХ рдмрд╛рдБрдз

рдпрд╣ рдПрдХ рд╣реА рдмрд╛рдзреНрдпрдХрд╛рд░реА рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рдХрдИ рдХрддрд╛рд░реЛрдВ рдХреЛ рдмрд╛рдВрдзрдиреЗ рдХреЗ рд▓рд┐рдП рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕реНрд╡реАрдХрд╛рд░реНрдп рд╣реИред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рд╣рдо рдПрдХреНрд╕реЗрд╕ рдкреНрд╡рд╛рдЗрдВрдЯ X рдФрд░ рдХрддрд╛рд░ Q1 рдХреЛ рд╕рдорд╛рди рдХреНрдпреВ 2 рдХреНрдпреВ рдХреЗ рд╕рд╛рде рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЗрд╕ рдЙрджрд╛рд╣рд░рдг рдореЗрдВ, рдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рд╢рдВрд╕рдХ рдХреА рддрд░рд╣ рд╡реНрдпрд╡рд╣рд╛рд░ рдХрд░рддрд╛ рд╣реИ: рд╕рднреА рд╕рдВрдмрдВрдзрд┐рдд рдХрддрд╛рд░реЛрдВ рдХреЛ рд╕рдВрджреЗрд╢ рднреЗрдЬрддрд╛ рд╣реИред рдХреБрдВрдЬреА рдХрд╛рд▓реЗ рд░рдВрдЧ рдХреЗ рд╕рдВрджреЗрд╢ Q1 рдФрд░ Q2 рджреЛрдиреЛрдВ рдХрддрд╛рд░реЛрдВ рдореЗрдВ рдкрдбрд╝реЗрдВрдЧреЗред
рд╕рдмрдорд┐рд╢рди рд▓реЙрдЧ рдХрд░реЗрдВ
рд╣рдо рд╕рдВрджреЗрд╢ рднреЗрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдПрдХ рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗред рдлреИрдирдЖрдЙрдЯ рдХреЗ рдмрдЬрд╛рдп, рд╣рдо рдкрд╣реБрдВрдЪ рдмрд┐рдВрджреБ рдХреЗ рд▓рд┐рдП рдкреНрд░рддреНрдпрдХреНрд╖ рдкреНрд░рдХрд╛рд░ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░реЗрдВрдЧреЗред рд░реВрдЯрд┐рдВрдЧ рдХреБрдВрдЬреА рд▓реЙрдЧ рдкреНрд░рдХрд╛рд░ рдХреЗ рдирд╛рдо рд╕реЗ рдореЗрд▓ рдЦрд╛рдПрдЧреАред рдорд╛рди рд▓реАрдЬрд┐рдП рдХрд┐ рд▓реЙрдЧ рднреЗрдЬрдиреЗ рд╡рд╛рд▓реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рд▓реЙрдЧ рдХреЗ рдкреНрд░рдХрд╛рд░ рдХреЛ рдЬрд╛рди рдЬрд╛рдПрдЧреАред
рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдПрдХ рдкрд╣реБрдВрдЪ рдмрд┐рдВрджреБ рдмрдирд╛рдПрдБ:
$channel->exchange_declare('direct_logs', 'direct', false, false, false);
рдЕрдм рдПрдХ рд╕рдВрджреЗрд╢ рднреЗрдЬреЗрдВ:
$channel->exchange_declare('direct_logs', 'direct', false, false, false); $channel->basic_publish($msg, 'direct_logs', $severity);
рд▓реЙрдЧ рдореЗрдВ 3 рдкреНрд░рдХрд╛рд░ рд╣реЛрдВрдЧреЗ: 'рдЬрд╛рдирдХрд╛рд░реА', 'рдЪреЗрддрд╛рд╡рдиреА', 'рддреНрд░реБрдЯрд┐'ред
рдЕрдВрд╢рджрд╛рди
рд╕рдВрджреЗрд╢ рднреЗрдЬрдирд╛ рдкрд┐рдЫрд▓реЗ
рд▓реЗрдЦ рдХреЗ рдЙрджрд╛рд╣рд░рдг рдХреЗ рд╕рдорд╛рди рд╣реЛрдЧрд╛, рдПрдХ рд╢рд░реНрдд рдХреЗ рд╕рд╛рде - рдЖрдкрдХреЛ рдкреНрд░рддреНрдпреЗрдХ рдкреНрд░рдХрд╛рд░ рдХреЗ рд▓реЙрдЧ рдХреЗ рд▓рд┐рдП рдЕрдкрдирд╛ рдЦреБрдж рдХрд╛ рдмрдВрдзрди рд╕рдВрдмрдВрдз рдмрдирд╛рдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИред
foreach($severities as $severity) { $channel->queue_bind($queue_name, 'direct_logs', $severity); }
рдХреБрд▓ рд╣рдореЗрдВ рдорд┐рд▓рддрд╛ рд╣реИ

рдирд┐рд░реНрдорд╛рддрд╛ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб emit_log_direct.php:
<?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPConnection; use PhpAmqpLib\Message\AMQPMessage; $connection = new AMQPConnection('localhost', 5672, 'guest', 'guest'); $channel = $connection->channel(); $channel->exchange_declare('direct_logs', 'direct', false, false, false); $severity = $argv[1]; if(empty($severity)) $severity = "info"; $data = implode(' ', array_slice($argv, 2)); if(empty($data)) $data = "Hello World!"; $msg = new AMQPMessage($data); $channel->basic_publish($msg, 'direct_logs', $severity); echo " [x] Sent ",$severity,':',$data," \n"; $channel->close(); $connection->close(); ?>
Receive_logs_direct.php рд╕рдмреНрд╕рдХреНрд░рд╛рдЗрдмрд░ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХреЛрдб:
<?php require_once __DIR__ . '/vendor/autoload.php'; use PhpAmqpLib\Connection\AMQPConnection; $connection = new AMQPConnection('localhost', 5672, 'guest', 'guest'); $channel = $connection->channel(); $channel->exchange_declare('direct_logs', 'direct', false, false, false); list($queue_name, ,) = $channel->queue_declare("", false, false, true, false); $severities = array_slice($argv, 1); if(empty($severities )) { file_put_contents('php://stderr', "Usage: $argv[0] [info] [warning] [error]\n"); exit(1); } foreach($severities as $severity) { $channel->queue_bind($queue_name, 'direct_logs', $severity); } echo ' [*] Waiting for logs. To exit press CTRL+C', "\n"; $callback = function($msg){ echo ' [x] ',$msg->delivery_info['routing_key'], ':', $msg->body, "\n"; }; $channel->basic_consume($queue_name, '', false, true, false, false, $callback); while(count($channel->callbacks)) { $channel->wait(); } $channel->close(); $connection->close(); ?>
рдпрджрд┐ рдЖрдк рдлрд╝рд╛рдЗрд▓ рдореЗрдВ рддреНрд░реБрдЯрд┐ рдФрд░ рдЪреЗрддрд╛рд╡рдиреА рдкреНрд░рдХрд╛рд░ рдХреЗ рдХреЗрд╡рд▓ рд▓реЙрдЧ рдХреЛ рд╕рд╣реЗрдЬрдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВ:
$ php receive_logs_direct.php warning error > logs_from_rabbit.log
рдпрджрд┐ рдЖрдк рд╕реНрдХреНрд░реАрди рдкрд░ рд╕рднреА рд▓реЙрдЧ рдкреНрд░рджрд░реНрд╢рд┐рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддреЗ рд╣реИрдВ, рддреЛ рдХрдВрд╕реЛрд▓ рдореЗрдВ рдЯрд╛рдЗрдк рдХрд░реЗрдВ
$ php receive_logs_direct.php info warning error [*] Waiting for logs. To exit press CTRL+C
рдпрд╛ рдХреЗрд╡рд▓ рддреНрд░реБрдЯрд┐ рд▓реЙрдЧ рдирд┐рдХрд╛рд▓рдиреЗ рдХреЗ рд▓рд┐рдП:
$ php emit_log_direct.php error "Run. Run. Or it will explode." [x] Sent 'error':'Run. Run. Or it will explode.'
(рд╕реНрд░реЛрдд
(emit_log_direct.php рд╕реНрд░реЛрдд) рдФрд░
(get_logs_direct.php рд╕реНрд░реЛрдд) )
рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рдХреБрдЫ рдкреИрдЯрд░реНрди рдХреЗ рдЕрдиреБрд░реВрдк рд╕рдВрджреЗрд╢реЛрдВ рдХреЗ рд╡рд╛рдпрд░рдЯреИрдкрд┐рдВрдЧ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред