{"id":457511,"date":"2025-04-26T15:00:43","date_gmt":"2025-04-26T15:00:43","guid":{"rendered":"http:\/\/savepearlharbor.com\/?p=457511"},"modified":"-0001-11-30T00:00:00","modified_gmt":"2025-04-26T15:00:43","slug":"","status":"publish","type":"post","link":"https:\/\/savepearlharbor.com\/?p=457511","title":{"rendered":"<span>\u0420\u0430\u0431\u043e\u0442\u0430\u0435\u043c \u0441 Nats \u0432 PHP<\/span>"},"content":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0437\u0430\u0442\u0440\u043e\u043d\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u0443\u044e \u0442\u0435\u043c\u0443 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 <a href=\"https:\/\/nats.io\/\" rel=\"noopener noreferrer nofollow\">Nats<\/a> \u0438 PHP. \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0435\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443, \u0447\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e, <s>\u0432\u0435\u0434\u044c PHP &#8212; \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0438\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/s> \u041d\u0435 \u0437\u043d\u0430\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u0432\u044b\u0448\u043b\u043e, \u043d\u043e \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u044b \ud83d\ude42<\/p>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e Nats<\/h2>\n<p>Nats \u2013 \u044d\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Go \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443, \u0441\u0445\u043e\u0436\u0435\u043c\u0443 \u0441 Kafka (\u0435\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c JetStream, \u0430 \u043d\u0435 Nats Core). \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 PUB\/SUB \u043c\u043e\u0434\u0435\u043b\u044c \u0438 \u0442\u043e\u043f\u0438\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043a\u0442\u043e, \u0447\u0442\u043e \u0438 \u043a\u0443\u0434\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438 \u043a\u0442\u043e, \u0447\u0442\u043e \u0438 \u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442.<\/p>\n<h3>\u041f\u0440\u043e\u0442\u043a\u043e\u043b Nats<\/h3>\n<p>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b Nats \u2013 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043d\u0430 \u0431\u0430\u0437\u0435 TCP\/IP, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439. \u041c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0438\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e telnet.<\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a nats \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e telnet \u0438 \u043f\u043e\u0437\u0434\u043e\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c nats \u0432 Docker<\/p>\n<pre><code class=\"bash\">docker run --rm -it -p 4222:4222 nats<\/code><\/pre>\n<p>\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043e\u043a\u043d\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f:<\/p>\n<pre><code class=\"bash\">telnet 127.0.0.1 4222<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (INFO):<\/p>\n<pre><code>Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. INFO {\"server_id\":\"ND6UPRIAIQ4K4EOMCQFI7NEGEEN7NW7CQCELNB3F2IVK3RGKHCA3UC36\",\"server_name\":\"ND6UPRIAIQ4K4EOMCQFI7NEGEEN7NW7CQCELNB3F2IVK3RGKHCA3UC36\",\"version\":\"2.11.1-binary\",\"proto\":1,\"git_commit\":\"6cebef9\",\"go\":\"go1.24.1\",\"host\":\"0.0.0.0\",\"port\":4222,\"headers\":true,\"max_payload\":1048576,\"client_id\":5,\"client_ip\":\"192.168.215.1\",\"cluster\":\"my_cluster\",\"xkey\":\"XCTTMXJ3T65TODSZEAHRFDMDUIMH2BP4SARGLKSFYRYOLH3MIQTUODC2\"}<\/code><\/pre>\n<p>\u041d\u0443\u0436\u043d\u043e \u0435\u043c\u0443 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c:<\/p>\n<pre><code>CONNECT {}<\/code><\/pre>\n<p>\u041e\u043d \u043e\u0442\u0432\u0435\u0442\u0438\u0442:<\/p>\n<pre><code>+OK<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>PING<\/code><\/p>\n<pre><code>PING<\/code><\/pre>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440 \u043e\u0442\u0432\u0435\u0442\u0438\u0442<\/p>\n<pre><code>PONG<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u043a\u043e\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0435\u0441\u0442\u044c \u043d\u0435\u043f\u043b\u043e\u0445\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0441 \u0434\u0435\u043c\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 <a href=\"https:\/\/docs.nats.io\/reference\/reference-protocols\/nats-protocol-demo\" rel=\"noopener noreferrer nofollow\">https:\/\/docs.nats.io\/reference\/reference-protocols\/nats-protocol-demo<\/a><\/p>\n<p>\u041d\u0443\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e Nats Core \u2013 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0438 \u0447\u0442\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u0422\u043e, \u0447\u0442\u043e \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043f\u0438\u043a, \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u0431\u0440\u0430\u0442\u044c consumer. \u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u043e\u0432 \u043d\u0435\u0442, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442\u0441\u044f. <\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0438 \u0435\u0441\u0442\u044c Nats JetStream, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u0430\u043c \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438.<\/p>\n<p>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b JetStream \u0443\u0436\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0438\u043c \u0447\u0435\u0440\u0435\u0437 telnet &#8212; \u0431\u043e\u043b\u044c\u043d\u0430\u044f \u0431\u043e\u043b\u044c, \u0442\u0430\u043a \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0431\u0440\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b <code>nats-box<\/code><\/p>\n<h2>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 PHP<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u043c, \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e. \u042f \u043d\u0430\u0448\u0435\u043b \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0435:<\/p>\n<ul>\n<li>\n<p>nats.php \u043e\u0442 basis-company (<a href=\"https:\/\/github.com\/basis-company\/nats.php\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0430<\/a>)<\/p>\n<\/li>\n<li>\n<p>nats \u043e\u0442 flownative (<a href=\"https:\/\/github.com\/flownative\/nats\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0430<\/a>)<\/p>\n<\/li>\n<\/ul>\n<p>\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <code>nats.php<\/code>.<\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043d\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u043c\u0438\u043c\u043e debug \u043b\u043e\u0433\u043e\u0432. \u041d\u043e \u043d\u0438\u0447\u0435\u0433\u043e, \u043f\u0440\u043e\u0440\u0432\u0435\u043c\u0441\u044f \ud83d\ude42<\/p>\n<p>\u0414\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043c\u0435\u043c, \u0447\u0442\u043e \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443<\/p>\n<pre><code class=\"bash\">composer require basis-company\/nats<\/code><\/pre>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 composer autoload. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u0430\u0439\u043b\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u044c:<\/p>\n<pre><code class=\"php\">&lt;?php require_once 'vendor\/autoload.php';<\/code><\/pre>\n<h2>\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439<\/h2>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 function style PHP \u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u0434\u0430 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f.<br \/>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/p>\n<pre><code class=\"php\">function connect(): \\Basis\\Nats\\Client   {       $configuration = new \\Basis\\Nats\\Configuration(           host: '127.0.0.1',           port: 4222,       );          return new \\Basis\\Nats\\Client($configuration);   }      function disconnect(\\Basis\\Nats\\Client $client): void   {       $client-&gt;disconnect();   }<\/code><\/pre>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u041d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 &#8212; \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \ud83d\ude42<\/p>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043d\u0435\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e<\/p>\n<pre><code class=\"php\">function init_stream(\\Basis\\Nats\\Client $client): \\Basis\\Nats\\Stream\\Stream   {       $api = $client-&gt;getApi();       $stream = $api-&gt;getStream('php-nats-test');       \/\/ \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f:       \/\/ \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 - \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435,         \/\/ \u0441\u0430\u0431\u0436\u0435\u043a\u0442\u044b, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443 - \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u044f \u043f\u043e\u0442\u043e\u043a\u0430.         $stream-&gt;getConfiguration()           -&gt;setRetentionPolicy(\\Basis\\Nats\\Stream\\RetentionPolicy::WORK_QUEUE);       $stream-&gt;create();          return $stream;   }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>init_stream<\/code> \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c (WORK_QUEUE). \u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u0437\u044f\u0442\u0430 \u0438 ack-\u043d\u0443\u0442\u0430, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435: \u043d\u0430 \u043e\u0434\u0438\u043d \u0442\u043e\u043f\u0438\u043a &#8212; \u043e\u0434\u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u043e\u0432 (\u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u044b \u0441 \u043e\u0434\u043d\u0438\u043c name), \u0442\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 exactly once.<\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Nats \u043f\u043e JetStream Streams: <a href=\"https:\/\/docs.nats.io\/nats-concepts\/jetstream\/streams\" rel=\"noopener noreferrer nofollow\">https:\/\/docs.nats.io\/nats-concepts\/jetstream\/streams<\/a><\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u0434\u0430\u0447 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438. \u0412 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0435 \u043c\u043e\u0436\u043d\u043e \u0432 \u044d\u0442\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, JSON \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<br \/>\u041a\u043e\u0434 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u0432 \u043f\u043e\u0442\u043e\u043a:<\/p>\n<pre><code class=\"php\">function push_message(\\Basis\\Nats\\Client $client, string $message): string   {       $id = uniqid('', true);       $client-&gt;publish(           'php-nats-test',           new \\Basis\\Nats\\Message\\Payload($message, [               \/\/ \u042d\u0442\u043e \u043f\u043e\u043b\u0435 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u0435\u0434\u0443\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0438 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u043e\u0432 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435               'Nats-Msg-ID' =&gt; $id,               \/\/ \u041d\u043e\u043c\u0435\u0440 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f               'x-attempt' =&gt; 1,           ]),       );       return $id;   }<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0435\u0451 ID. \u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0442 ID \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0434\u0435\u0442 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0445, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0421\u043c\u044b\u0441\u043b \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 <code>x-attempt<\/code> \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>\u041d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043a\u043e\u0434, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c.<br \/>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c Nats \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0434\u043e\u043a\u0435\u0440\u0435 \u0441 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c jetstream:<\/p>\n<pre><code class=\"bash\">docker run --rm -it -p 4222:4222 nats -js<\/code><\/pre>\n<p>\u041a\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430:<\/p>\n<pre><code class=\"php\">$client = connect(); init_stream($client);    $id = push_message($client, 'Hello World!');   echo 'pushed message id: ' . $id . PHP_EOL;   $id = push_message($client, 'Hello World, again!');   echo 'pushed message id: ' . $id . PHP_EOL;   $id = push_message($client, 'Hello World, once more!');   echo 'pushed message id: ' . $id . PHP_EOL;      disconnect($client);<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043b\u043e\u0433\u0438:<\/p>\n<pre><code>% php producer.php pushed message id: 68028fce39f239.23978889 pushed message id: 68028fce3b55a9.67959494 pushed message id: 68028fce3b56d1.07523175<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 producer.php<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"php\">&lt;?php  require_once 'vendor\/autoload.php';  function connect(): \\Basis\\Nats\\Client {     $configuration = new \\Basis\\Nats\\Configuration(         host: '127.0.0.1',         port: 4222,     );      return new \\Basis\\Nats\\Client($configuration); }  function disconnect(\\Basis\\Nats\\Client $client): void {     $client-&gt;disconnect(); }  function init_stream(\\Basis\\Nats\\Client $client): \\Basis\\Nats\\Stream\\Stream {     $api = $client-&gt;getApi();     $stream = $api-&gt;getStream('php-nats-test');     \/\/ \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f:     \/\/ \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 - \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435,     \/\/ \u0441\u0430\u0431\u0436\u0435\u043a\u0442\u044b, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443 - \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u044f \u043f\u043e\u0442\u043e\u043a\u0430.     $stream-&gt;getConfiguration()         -&gt;setRetentionPolicy(\\Basis\\Nats\\Stream\\RetentionPolicy::WORK_QUEUE);     $stream-&gt;create();      return $stream; }  function push_message(\\Basis\\Nats\\Client $client, string $message): string {     $id = uniqid('', true);     $client-&gt;publish(         'php-nats-test',         new \\Basis\\Nats\\Message\\Payload($message, [             \/\/ \u042d\u0442\u043e \u043f\u043e\u043b\u0435 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u0435\u0434\u0443\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0438 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u043e\u0432 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435             'Nats-Msg-ID' =&gt; $id,             \/\/ \u041d\u043e\u043c\u0435\u0440 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f             'x-attempt' =&gt; 1,         ]),     );     return $id; }   $client = connect();  init_stream($client); $id = push_message($client, 'Hello World!'); echo 'pushed message id: ' . $id . PHP_EOL; $id = push_message($client, 'Hello World, again!'); echo 'pushed message id: ' . $id . PHP_EOL; $id = push_message($client, 'Hello World, once more!'); echo 'pushed message id: ' . $id . PHP_EOL;  disconnect($client); <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u044d\u0442\u0430\u043f\u0443. \u041d\u0430\u043c \u0432\u0435\u0434\u044c \u043d\u0443\u0436\u043d\u043e \u044d\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0437\u0430\u0431\u0440\u0430\u0442\u044c!<\/p>\n<h3>\u041f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438<\/h3>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0442\u0440\u0430\u0435\u0432. \u0412 \u0446\u0435\u043b\u043e\u043c, \u0434\u043b\u044f \u0435\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430:<\/p>\n<ul>\n<li>\n<p>\u0428\u0442\u0430\u0442\u043d\u044b\u0439 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u0435\u043b\u044c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u0430 &#171;\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u043d\u0435 \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 X \u0440\u0430\u0437, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 nack-\u043d\u0443\u0442\u0430&#187;, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0438 \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043d\u0438\u0438 \u043f\u043e\u043f\u044b\u0442\u043e\u043a, \u0437\u0430\u0434\u0430\u0447\u0430 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0430 <strong>\u043d\u0435<\/strong> \u0431\u0443\u0434\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0441\u0442\u043e\u043c\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u043a\u043e\u043d\u0435\u0446 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 (\u0441\u043f\u043e\u0439\u043b\u0435\u0440: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e) <\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439:<\/p>\n<ul>\n<li>\n<p>\u0411\u0435\u0440\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443<\/p>\n<\/li>\n<li>\n<p>\u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 attempt = attempt + 1 <\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u043b\u0438 <code>attempt === MAX_ATTEMPTS<\/code>, \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c:<\/p>\n<pre><code class=\"php\">function redeliver(\\Basis\\Nats\\Client $client, \\Basis\\Nats\\Message\\Msg $msg): void   {       $id = uniqid('', true);       $client-&gt;publish(           $msg-&gt;subject,           new \\Basis\\Nats\\Message\\Payload($msg-&gt;payload-&gt;body, [               'Nats-Msg-ID' =&gt; $id,               'x-attempt' =&gt; $msg-&gt;payload-&gt;getHeader('x-attempt') + 1,           ])       );   }<\/code><\/pre>\n<p>\u041d\u0443 \u0438 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 &#8212; \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0430 \u0434\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"php\">function handle_message(string $id, string $payload, int $attempt): bool   {       echo \"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 ID {$id}, \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u043f\u044b\u0442\u043a\u0438: {$attempt}, \u0442\u0435\u043b\u043e: {$payload}\\n\";          if ($payload === 'Hello World!' &amp;&amp; $attempt === 1) {           \/\/ Hello world - \u0437\u0430\u0434\u0430\u0447\u0430 \u0442\u044f\u0436\u0435\u043b\u0430\u044f, \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f           return false;       }          return true;   }<\/code><\/pre>\n<p>\u0418 \u043a\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438:<\/p>\n<pre><code class=\"php\">const MAX_ATTEMPTS = 3;   function process_message(\\Basis\\Nats\\Client $client, \\Basis\\Nats\\Message\\Msg $message): void   {       $payload = $message-&gt;payload;          $id = $payload-&gt;getHeader('Nats-Msg-ID');       $attempt = (int)$payload-&gt;getHeader('x-attempt');       try {           if (handle_message($id, $payload-&gt;body, $attempt)) {               $message-&gt;ack();           } else {               if ($attempt &lt; MAX_ATTEMPTS) {                   redeliver($client, $message);               }               $message-&gt;ack();           }       } catch (Throwable $e) {           if ($attempt &lt; MAX_ATTEMPTS) {               redeliver($client, $message);           }           $message-&gt;ack();           throw $e;       }   }<\/code><\/pre>\n<p>\u041a\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u043e\u0439 \u0438 \u043f\u043e\u043d\u044f\u0442\u043d\u044b\u0439:<\/p>\n<ul>\n<li>\n<p>\u041e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435<\/p>\n<\/li>\n<li>\n<p>\u0412 \u0441\u043b\u0443\u0447\u0430\u0435 \u043e\u0448\u0438\u0431\u043a\u0438 \u043f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0440\u0435\u0442\u0440\u0430\u0438\u0442\u044c <\/p>\n<ul>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0443\u0436\u043d\u043e, \u0434\u0435\u043b\u0430\u0435\u043c \u0440\u0435\u0442\u0440\u0430\u0439<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u043d\u0435 \u043d\u0443\u0436\u043d\u043e, \u0437\u0430\u043a\u0430\u043d\u0447\u0438\u0432\u0430\u0435\u043c \u043d\u0430 \u044d\u0442\u043e\u043c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f<\/p>\n<\/li>\n<li>\n<p>\u0415\u0441\u043b\u0438 \u0432\u044b\u043b\u0435\u0442\u0435\u043b\u043e \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435, \u043f\u0443\u0441\u0442\u044c \u0435\u0433\u043e \u043e\u0431\u0440\u0430\u0431\u0430\u0442\u044b\u0432\u0430\u0435\u0442 \u0432\u043d\u0435\u0448\u043d\u0438\u0439 \u0441\u043b\u043e\u0439<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u0410 \u0442\u0435\u043f\u0435\u0440\u044c \u0441\u0430\u043c\u043e\u0435 \u0442\u0440\u0443\u0434\u043d\u043e\u0435 \u2013 \u0440\u0430\u0431\u043e\u0442\u0430 \u0441 \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u0435\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u0438. \u0414\u043b\u044f \u044d\u0442\u043e\u0433\u043e \u043d\u0430\u043c \u043f\u043e\u043d\u0430\u0434\u043e\u0431\u0438\u0442\u0441\u044f \u0440\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u0438\u0435 <code>ext-pcntl<\/code>, \u0447\u0442\u043e\u0431\u044b \u0441\u043a\u0440\u0438\u043f\u0442 \u043c\u043e\u0436\u043d\u043e \u0431\u044b\u043b\u043e \u0437\u0430\u0432\u0435\u0440\u0448\u0438\u0442\u044c \u043f\u043e CTRL+C:<\/p>\n<pre><code class=\"php\">\/\/ \u0414\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 CTRL+C   $canContinue = true;   pcntl_signal(SIGINT, function () use (&amp;$canContinue) {       $canContinue = false;   });      function listen(\\Basis\\Nats\\Client $client, \\Basis\\Nats\\Stream\\Stream $stream): void   {       global $canContinue;          $consumer = $stream-&gt;getConsumer('my-wonderful-consumer');       $consumer-&gt;getConfiguration()           \/\/ \u0411\u0435\u0440\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0442\u043e\u043f\u0438\u043a\u043e\u0432           -&gt;setSubjectFilter('php-nats-test');       $queue = $consumer-&gt;create()-&gt;getQueue();          while ($canContinue) {           $message = $queue-&gt;fetch();           if ($message &amp;&amp; !$message-&gt;payload-&gt;isEmpty()) {               \/\/ \u0418\u043d\u043e\u0433\u0434\u0430 \u0432 $message \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0439\u0442\u0438 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c,               \/\/ \u0447\u0442\u043e \u0432 fetch \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430). \u0422\u043e\u0433\u0434\u0430 payload \u0431\u0443\u0434\u0435\u0442 \u043f\u0443\u0441\u0442\u044b\u043c                         try {                   process_message($client, $message);               } catch (Throwable $e) {                   \/\/ \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f                   echo $e-&gt;getMessage() . PHP_EOL;               }           }   \/\/ \u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c \u043d\u0443\u0436\u043d\u043e \u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0447\u0438\u043a\u0438 \u0441\u0438\u0433\u043d\u0430\u043b\u0430 \u0432\u044b\u0445\u043e\u0434\u0430         pcntl_signal_dispatch();       }          $client-&gt;unsubscribe($queue);   }<\/code><\/pre>\n<p>\u0421\u0442\u0440\u043e\u043a\u0430 <code>my-wonderful-consumer<\/code> &#8212; \u044d\u0442\u043e \u0438\u043c\u044f \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u0430. \u0415\u0441\u043b\u0438 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u043d\u0435\u0441\u043a\u043e\u043b\u044c\u043a\u043e \u0441\u043a\u0440\u0438\u043f\u0442\u043e\u0432 \u043f\u0430\u0440\u0430\u043b\u043b\u0435\u043b\u044c\u043d\u043e, \u043e\u043d\u0438 \u0432\u0441\u0435 \u0431\u0443\u0434\u0443\u0442 \u0432 \u043e\u0434\u043d\u043e\u0439 \u0433\u0440\u0443\u043f\u043f\u0435 \u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043e\u0434\u0438\u043d \u0438\u0437 \u043d\u0438\u0445 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u043b\u0443\u0447\u0430\u0442\u044c \u043e\u0434\u043d\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435. \u0422\u0430\u043a\u0438\u043c \u043e\u0431\u0440\u0430\u0437\u043e\u043c \u0434\u043e\u0441\u0442\u0438\u0433\u0430\u0435\u0442\u0441\u044f \u0433\u043e\u0440\u0438\u0437\u043e\u043d\u0442\u0430\u043b\u044c\u043d\u043e\u0435 \u043c\u0430\u0441\u0448\u0442\u0430\u0431\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u0435 \u0431\u0435\u0437 \u0434\u0443\u0431\u043b\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439.<\/p>\n<p>\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \ud83d\ude42<\/p>\n<pre><code class=\"php\">$client = connect();   $stream = init_stream($client);      listen($client, $stream));      disconnect($client);<\/code><\/pre>\n<p>\u0412 \u0432\u044b\u0432\u043e\u0434\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c:<\/p>\n<pre><code class=\"bash\">% php consumer.php \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 ID 6802976d4347b5.08190035, \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u043f\u044b\u0442\u043a\u0438: 1, \u0442\u0435\u043b\u043e: Hello World! \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 ID 6802976d434999.77061748, \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u043f\u044b\u0442\u043a\u0438: 1, \u0442\u0435\u043b\u043e: Hello World, again! \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 ID 6802976d434a18.95887182, \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u043f\u044b\u0442\u043a\u0438: 1, \u0442\u0435\u043b\u043e: Hello World, once more! \u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 ID 6802976d43e417.25517113, \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u043f\u044b\u0442\u043a\u0438: 2, \u0442\u0435\u043b\u043e: Hello World!<\/code><\/pre>\n<p>\u041c\u043e\u0436\u043d\u043e \u0437\u0430\u043c\u0435\u0442\u0438\u0442\u044c. \u0447\u0442\u043e \u0437\u0430\u0434\u0430\u0447\u0430 Hello world! \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u043b\u0430\u0441\u044c \u0434\u0432\u0430\u0436\u0434\u044b, \u043f\u0435\u0440\u0432\u043e\u0439 \u0438 \u043f\u043e\u0441\u043b\u0435\u0434\u043d\u0435\u0439. \u042d\u0442\u043e \u0441\u0432\u044f\u0437\u0430\u043d\u043e \u0441 \u043f\u0435\u0440\u0435\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u043e\u0439. \u0423 \u043d\u0435\u0451 \u0434\u0430\u0436\u0435 \u043f\u043e\u043c\u0435\u043d\u044f\u043b\u0441\u044f ID, \u043a\u0430\u043a \u0438 \u0434\u043e\u043b\u0436\u043d\u043e \u0431\u044b\u0442\u044c \ud83d\ude42<\/p>\n<details class=\"spoiler\">\n<summary>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 consumer.php<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"php\">&lt;?php  require_once 'vendor\/autoload.php';  function connect(): \\Basis\\Nats\\Client {     $configuration = new \\Basis\\Nats\\Configuration(         host: '127.0.0.1',         port: 4222,     );      return new \\Basis\\Nats\\Client($configuration); }  function disconnect(\\Basis\\Nats\\Client $client): void {     $client-&gt;disconnect(); }  function init_stream(\\Basis\\Nats\\Client $client): \\Basis\\Nats\\Stream\\Stream {     $api = $client-&gt;getApi();     $stream = $api-&gt;getStream('php-nats-test');     \/\/ \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f:     \/\/ \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 - \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435,     \/\/ \u0441\u0430\u0431\u0436\u0435\u043a\u0442\u044b, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443 - \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u044f \u043f\u043e\u0442\u043e\u043a\u0430.     $stream-&gt;getConfiguration()         -&gt;setRetentionPolicy(\\Basis\\Nats\\Stream\\RetentionPolicy::WORK_QUEUE);     $stream-&gt;create();      return $stream; }  function redeliver(\\Basis\\Nats\\Client $client, \\Basis\\Nats\\Message\\Msg $msg): void {     $id = uniqid('', true);     $client-&gt;publish(         $msg-&gt;subject,         new \\Basis\\Nats\\Message\\Payload($msg-&gt;payload-&gt;body, [             'Nats-Msg-ID' =&gt; $id,             'x-attempt' =&gt; $msg-&gt;payload-&gt;getHeader('x-attempt') + 1,         ])     ); }  function handle_message(string $id, string $payload, int $attempt): bool {     echo \"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 ID {$id}, \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u043f\u044b\u0442\u043a\u0438: {$attempt}, \u0442\u0435\u043b\u043e: {$payload}\\n\";      if ($payload === 'Hello World!' &amp;&amp; $attempt === 1) {         \/\/ Hello world - \u0437\u0430\u0434\u0430\u0447\u0430 \u0442\u044f\u0436\u0435\u043b\u0430\u044f, \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f         return false;     }      return true; }  const MAX_ATTEMPTS = 3; function process_message(\\Basis\\Nats\\Client $client, \\Basis\\Nats\\Message\\Msg $message): void {     $payload = $message-&gt;payload;      $id = $payload-&gt;getHeader('Nats-Msg-ID');     $attempt = (int)$payload-&gt;getHeader('x-attempt');     try {         if (handle_message($id, $payload-&gt;body, $attempt)) {             $message-&gt;ack();         } else {             if ($attempt &lt; MAX_ATTEMPTS) {                 redeliver($client, $message);             }             $message-&gt;ack();         }     } catch (Throwable $e) {         if ($attempt &lt; MAX_ATTEMPTS) {             redeliver($client, $message);         }         $message-&gt;ack();         throw $e;     } }   \/\/ \u0414\u043b\u044f \u0437\u0430\u0432\u0435\u0440\u0448\u0435\u043d\u0438\u044f \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438 \u043d\u0430\u0436\u0430\u0442\u0438\u0438 CTRL+C $canContinue = true; pcntl_signal(SIGINT, function () use (&amp;$canContinue) {     $canContinue = false; });  function listen(\\Basis\\Nats\\Client $client, \\Basis\\Nats\\Stream\\Stream $stream): void {     global $canContinue;      $consumer = $stream-&gt;getConsumer('my-wonderful-consumer');     $consumer-&gt;getConfiguration()         \/\/ \u0411\u0435\u0440\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u0437 \u0443\u043a\u0430\u0437\u0430\u043d\u043d\u044b\u0445 \u0442\u043e\u043f\u0438\u043a\u043e\u0432         -&gt;setSubjectFilter('php-nats-test');     $queue = $consumer-&gt;create()-&gt;getQueue();      while ($canContinue) {         $message = $queue-&gt;fetch();         if ($message &amp;&amp; !$message-&gt;payload-&gt;isEmpty()) {             \/\/ \u0418\u043d\u043e\u0433\u0434\u0430 \u0432 $message \u043c\u043e\u0436\u0435\u0442 \u043f\u0440\u0438\u0439\u0442\u0438 \u0441\u043b\u0443\u0436\u0435\u0431\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u043e \u0442\u043e\u043c,             \/\/ \u0447\u0442\u043e \u0432 fetch \u043d\u0435 \u0443\u0434\u0430\u043b\u043e\u0441\u044c \u043f\u043e\u043b\u0443\u0447\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f (\u043e\u0447\u0435\u0440\u0435\u0434\u044c \u043f\u0443\u0441\u0442\u0430). \u0422\u043e\u0433\u0434\u0430 payload \u0431\u0443\u0434\u0435\u0442 \u043f\u0443\u0441\u0442\u044b\u043c             try {                 process_message($client, $message);             } catch (Throwable $e) {                 \/\/ \u041c\u0430\u043a\u0441\u0438\u043c\u0430\u043b\u044c\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u0430\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0438\u0441\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u044f                 echo $e-&gt;getMessage() . PHP_EOL;             }         }          pcntl_signal_dispatch();     }      $client-&gt;unsubscribe($queue); }   $client = connect(); $stream = init_stream($client);  listen($client, $stream);  disconnect($client); <\/code><\/pre>\n<\/div>\n<\/details>\n<h2>\u0412\u044b\u0432\u043e\u0434\u044b<\/h2>\n<p>\u041c\u044b \u043f\u043e\u043f\u0440\u043e\u0431\u043e\u0432\u0430\u043b\u0438 \u043f\u043e\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 Nats \u0432 PHP, \u0440\u0435\u0430\u043b\u0438\u0437\u043e\u0432\u0430\u043b\u0438 \u0431\u0430\u0437\u043e\u0432\u0443\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0438 \u043f\u043e\u043d\u044f\u043b\u0438 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0442 \u0431\u0430\u0437\u043e\u0432\u044b\u0435 \u0441\u0443\u0449\u043d\u043e\u0441\u0442\u0438 JetStream. \u0414\u0430\u043b\u044c\u0448\u0435 \u0442\u043e\u043b\u044c\u043a\u043e \u0431\u043e\u043b\u044c\u0448\u0435 \u0438 \u043a\u0440\u0443\u0447\u0435. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0432\u043d\u0435\u0434\u0440\u0438\u0442\u044c \u043e\u0442\u043b\u043e\u0436\u0435\u043d\u043d\u0443\u044e \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0443, \u043f\u0440\u0438\u043e\u0440\u0438\u0442\u0435\u0442\u044b (\u043a\u043e\u0442\u043e\u0440\u044b\u0445 \u0432 nats \u043a \u0441\u043e\u0436\u0430\u043b\u0435\u043d\u0438\u044e \u043d\u0435\u0442).<\/p>\n<p>\u041d\u0430 \u0434\u0430\u043d\u043d\u044b\u0439 \u043c\u043e\u043c\u0435\u043d\u0442 \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 Nats \u044f\u0432\u043b\u044f\u0435\u0442\u0441\u044f \u043d\u0435\u0442\u0440\u0438\u0432\u0438\u0430\u043b\u044c\u043d\u043e\u0439 \u0437\u0430\u0434\u0430\u0447\u0435\u0439, \u043f\u043e \u043a\u043e\u0442\u043e\u0440\u043e\u0439 \u043a\u0440\u0430\u0439\u043d\u0435 \u043c\u0430\u043b\u043e \u0438\u043d\u0444\u043e\u0440\u043c\u0430\u0446\u0438\u0438. \u042f \u043d\u0430\u0434\u0435\u044e\u0441\u044c, \u0432 \u0431\u0443\u0434\u0443\u0449\u0435\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u0441\u0442\u0432\u043e \u0437\u0430\u0438\u043d\u0442\u0435\u0440\u0435\u0441\u0443\u0435\u0442\u0441\u044f \u044d\u0442\u0438\u043c \u043c\u043e\u0449\u043d\u044b\u043c  \u0438 \u043e\u0434\u043d\u043e\u0432\u0440\u0435\u043c\u0435\u043d\u043d\u043e \u043f\u0440\u043e\u0441\u0442\u044b\u043c \u0432 \u043e\u0431\u0441\u043b\u0443\u0436\u0438\u0432\u0430\u043d\u0438\u0438 \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u043c \u043e\u0447\u0435\u0440\u0435\u0434\u0435\u0439, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0431\u0443\u0434\u0435\u0442 \u043f\u043e\u044f\u0432\u043b\u044f\u0442\u044c\u0441\u044f \u0431\u043e\u043b\u044c\u0448\u0435 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a \u0438 \u0430\u0434\u0430\u043f\u0442\u0435\u0440\u043e\u0432, \u0447\u0442\u043e\u0431\u044b \u0435\u0433\u043e \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u043d\u0430 PHP \u0441\u0442\u0430\u043b\u043e \u043f\u0440\u043e\u0449\u0435 \u0438 \u043d\u0430\u0434\u0435\u0436\u043d\u0435\u0435.<\/p>\n<p>\u0423\u0434\u0430\u0447\u0438 \u0432\u0430\u043c, \u043a\u043e\u043b\u043b\u0435\u0433\u0438 \ud83d\ude42<\/p>\n<\/div>\n<\/div>\n<\/div>\n<p><!----><!----><\/div>\n<p><!----><!----><br \/> \u0441\u0441\u044b\u043b\u043a\u0430 \u043d\u0430 \u043e\u0440\u0438\u0433\u0438\u043d\u0430\u043b \u0441\u0442\u0430\u0442\u044c\u0438 <a href=\"https:\/\/habr.com\/ru\/articles\/904638\/\"> https:\/\/habr.com\/ru\/articles\/904638\/<\/a><\/p>\n","protected":false},"excerpt":{"rendered":"<div><!--[--><!--]--><\/div>\n<div id=\"post-content-body\">\n<div>\n<div class=\"article-formatted-body article-formatted-body article-formatted-body_version-2\">\n<div xmlns=\"http:\/\/www.w3.org\/1999\/xhtml\">\n<p>\u0421\u0435\u0433\u043e\u0434\u043d\u044f \u0437\u0430\u0442\u0440\u043e\u043d\u0435\u043c \u0442\u0430\u043a\u0443\u044e \u043d\u0435\u043e\u0436\u0438\u0434\u0430\u043d\u043d\u0443\u044e \u0442\u0435\u043c\u0443 \u043a\u0430\u043a \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u043c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 <a href=\"https:\/\/nats.io\/\" rel=\"noopener noreferrer nofollow\">Nats<\/a> \u0438 PHP. \u041a\u0430\u043a \u043e\u043a\u0430\u0437\u0430\u043b\u043e\u0441\u044c, \u0435\u0441\u0442\u044c \u043e\u0447\u0435\u043d\u044c \u043c\u0430\u043b\u043e \u0441\u0442\u0430\u0442\u0435\u0439 \u043d\u0430 \u044d\u0442\u0443 \u0442\u0435\u043c\u0443, \u0447\u0442\u043e \u0441\u0442\u0440\u0430\u043d\u043d\u043e, <s>\u0432\u0435\u0434\u044c PHP &#8212; \u044d\u0442\u043e \u043b\u0443\u0447\u0448\u0438\u0439 \u044f\u0437\u044b\u043a \u043f\u0440\u043e\u0433\u0440\u0430\u043c\u043c\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f.<\/s> \u041d\u0435 \u0437\u043d\u0430\u044e, \u043f\u043e\u0447\u0435\u043c\u0443 \u0442\u0430\u043a \u0432\u044b\u0448\u043b\u043e, \u043d\u043e \u043d\u0430\u043f\u0438\u0448\u0438\u0442\u0435 \u0432 \u043a\u043e\u043c\u043c\u0435\u043d\u0442\u044b \ud83d\ude42<\/p>\n<h2>\u041d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u0440\u043e Nats<\/h2>\n<p>Nats \u2013 \u044d\u0442\u043e \u043d\u0430\u043f\u0438\u0441\u0430\u043d\u043d\u044b\u0439 \u043d\u0430 Go \u0432\u044b\u0441\u043e\u043a\u043e\u043f\u0440\u043e\u0438\u0437\u0432\u043e\u0434\u0438\u0442\u0435\u043b\u044c\u043d\u044b\u0439 \u0431\u0440\u043e\u043a\u0435\u0440 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439, \u0440\u0430\u0431\u043e\u0442\u0430\u044e\u0449\u0438\u0439 \u043f\u043e \u043f\u0440\u0438\u043d\u0446\u0438\u043f\u0443, \u0441\u0445\u043e\u0436\u0435\u043c\u0443 \u0441 Kafka (\u0435\u0441\u043b\u0438 \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c JetStream, \u0430 \u043d\u0435 Nats Core). \u041e\u043d \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442 PUB\/SUB \u043c\u043e\u0434\u0435\u043b\u044c \u0438 \u0442\u043e\u043f\u0438\u043a\u0438 \u0434\u043b\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u044f, \u043a\u0442\u043e, \u0447\u0442\u043e \u0438 \u043a\u0443\u0434\u0430 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u0442 \u0438 \u043a\u0442\u043e, \u0447\u0442\u043e \u0438 \u043e\u0442\u043a\u0443\u0434\u0430 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442.<\/p>\n<h3>\u041f\u0440\u043e\u0442\u043a\u043e\u043b Nats<\/h3>\n<p>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b Nats \u2013 \u044d\u0442\u043e \u043f\u0440\u043e\u0441\u0442\u043e \u0442\u0435\u043a\u0441\u0442\u043e\u0432\u044b\u0439 \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b \u043d\u0430 \u0431\u0430\u0437\u0435 TCP\/IP, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0440\u0430\u0437\u0434\u0435\u043b\u044f\u044e\u0442\u0441\u044f \u043d\u043e\u0432\u043e\u0439 \u0441\u0442\u0440\u043e\u043a\u043e\u0439. \u041c\u043e\u0436\u043d\u043e \u0434\u0430\u0436\u0435 \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0438\u043c \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e telnet.<\/p>\n<p>\u041f\u043e\u043f\u0440\u043e\u0431\u0443\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f \u043a nats \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e telnet \u0438 \u043f\u043e\u0437\u0434\u043e\u0440\u043e\u0432\u0430\u0442\u044c\u0441\u044f.<\/p>\n<p>\u0417\u0430\u043f\u0443\u0441\u043a\u0430\u0435\u043c nats \u0432 Docker<\/p>\n<pre><code class=\"bash\">docker run --rm -it -p 4222:4222 nats<\/code><\/pre>\n<p>\u0438 \u0442\u0435\u043f\u0435\u0440\u044c \u0432 \u0434\u0440\u0443\u0433\u043e\u043c \u043e\u043a\u043d\u0435 \u0442\u0435\u0440\u043c\u0438\u043d\u0430\u043b\u0430 \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u0442\u044c\u0441\u044f:<\/p>\n<pre><code class=\"bash\">telnet 127.0.0.1 4222<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0438 \u043c\u044b \u0441\u0440\u0430\u0437\u0443 \u0436\u0435 \u043f\u043e\u043b\u0443\u0447\u0438\u043c \u043f\u0440\u0438\u0432\u0435\u0442\u0441\u0442\u0432\u0435\u043d\u043d\u043e\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0441\u0435\u0440\u0432\u0435\u0440\u0430 (INFO):<\/p>\n<pre><code>Trying 127.0.0.1... Connected to localhost. Escape character is '^]'. INFO {\"server_id\":\"ND6UPRIAIQ4K4EOMCQFI7NEGEEN7NW7CQCELNB3F2IVK3RGKHCA3UC36\",\"server_name\":\"ND6UPRIAIQ4K4EOMCQFI7NEGEEN7NW7CQCELNB3F2IVK3RGKHCA3UC36\",\"version\":\"2.11.1-binary\",\"proto\":1,\"git_commit\":\"6cebef9\",\"go\":\"go1.24.1\",\"host\":\"0.0.0.0\",\"port\":4222,\"headers\":true,\"max_payload\":1048576,\"client_id\":5,\"client_ip\":\"192.168.215.1\",\"cluster\":\"my_cluster\",\"xkey\":\"XCTTMXJ3T65TODSZEAHRFDMDUIMH2BP4SARGLKSFYRYOLH3MIQTUODC2\"}<\/code><\/pre>\n<p>\u041d\u0443\u0436\u043d\u043e \u0435\u043c\u0443 \u043e\u0442\u0432\u0435\u0442\u0438\u0442\u044c \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435\u043c:<\/p>\n<pre><code>CONNECT {}<\/code><\/pre>\n<p>\u041e\u043d \u043e\u0442\u0432\u0435\u0442\u0438\u0442:<\/p>\n<pre><code>+OK<\/code><\/pre>\n<p>\u041f\u043e\u0441\u043b\u0435 \u044d\u0442\u043e\u0433\u043e \u043c\u043e\u0436\u043d\u043e \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u043a\u043e\u043c\u0430\u043d\u0434\u044b. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, <code>PING<\/code><\/p>\n<pre><code>PING<\/code><\/pre>\n<p>\u0421\u0435\u0440\u0432\u0435\u0440 \u043e\u0442\u0432\u0435\u0442\u0438\u0442<\/p>\n<pre><code>PONG<\/code><\/pre>\n<p>\u0415\u0441\u043b\u0438 \u0443 \u043a\u043e\u0433\u043e-\u043d\u0438\u0431\u0443\u0434\u044c \u0432\u043e\u0437\u043d\u0438\u043a\u043d\u0435\u0442 \u0436\u0435\u043b\u0430\u043d\u0438\u0435 \u0440\u0430\u0437\u043e\u0431\u0440\u0430\u0442\u044c\u0441\u044f \u043f\u043e\u043f\u043e\u0434\u0440\u043e\u0431\u043d\u0435\u0435 \u0441 \u0442\u0435\u043c, \u043a\u0430\u043a \u044d\u0442\u043e \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442, \u0435\u0441\u0442\u044c \u043d\u0435\u043f\u043b\u043e\u0445\u0430\u044f \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u044e \u0441 \u0434\u0435\u043c\u043e \u043f\u0440\u043e\u0442\u043e\u043a\u043e\u043b\u0430 <a href=\"https:\/\/docs.nats.io\/reference\/reference-protocols\/nats-protocol-demo\" rel=\"noopener noreferrer nofollow\">https:\/\/docs.nats.io\/reference\/reference-protocols\/nats-protocol-demo<\/a><\/p>\n<p>\u041d\u0443\u0436\u043d\u043e \u043e\u0442\u043c\u0435\u0442\u0438\u0442\u044c, \u0447\u0442\u043e Nats Core \u2013 \u044d\u0442\u043e \u043e\u0431\u044b\u0447\u043d\u0430\u044f \u043f\u043e\u0447\u0442\u0438 \u0447\u0442\u043e \u0441\u0438\u043d\u0445\u0440\u043e\u043d\u043d\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c. \u0422\u043e, \u0447\u0442\u043e \u043f\u0443\u0431\u043b\u0438\u043a\u0443\u0435\u0442\u0441\u044f \u0432 \u0442\u043e\u043f\u0438\u043a, \u0434\u043e\u043b\u0436\u0435\u043d \u0437\u0430\u0431\u0440\u0430\u0442\u044c consumer. \u0415\u0441\u043b\u0438 \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u043e\u0432 \u043d\u0435\u0442, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u043d\u0438\u0447\u0442\u043e\u0436\u0430\u0435\u0442\u0441\u044f. <\/p>\n<p>\u0414\u043b\u044f \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0432 \u043d\u0430\u0448\u0435\u043c \u043e\u0431\u044b\u0447\u043d\u043e\u043c \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u0438 \u0435\u0441\u0442\u044c Nats JetStream, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442 \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u043d\u0430 \u0441\u0435\u0440\u0432\u0435\u0440\u0435, \u0432\u043e\u0437\u043c\u043e\u0436\u043d\u043e\u0441\u0442\u044c \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u0430\u043c \u043e\u0442\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f \u0438 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0430\u0442\u044c\u0441\u044f, \u0430 \u0442\u0430\u043a\u0436\u0435 \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u0438 \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438.<\/p>\n<p>\u041f\u0440\u043e\u0442\u043e\u043a\u043e\u043b JetStream \u0443\u0436\u0435 \u0441\u0438\u043b\u044c\u043d\u043e \u0441\u043b\u043e\u0436\u043d\u0435\u0435, \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u043d\u0438\u043c \u0447\u0435\u0440\u0435\u0437 telnet &#8212; \u0431\u043e\u043b\u044c\u043d\u0430\u044f \u0431\u043e\u043b\u044c, \u0442\u0430\u043a \u0447\u0442\u043e \u043b\u0443\u0447\u0448\u0435 \u0431\u0440\u0430\u0442\u044c \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u0438\u043b\u0438 \u0445\u043e\u0442\u044f \u0431\u044b <code>nats-box<\/code><\/p>\n<h2>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 \u043d\u0430 PHP<\/h2>\n<p>\u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u0442\u043e\u0433\u043e, \u0447\u0442\u043e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a, \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u044e\u0449\u0438\u0445 \u0440\u0430\u0431\u043e\u0442\u0443 \u0441 \u0431\u0440\u043e\u043a\u0435\u0440\u043e\u043c, \u043d\u0435 \u0442\u0430\u043a \u043c\u043d\u043e\u0433\u043e. \u042f \u043d\u0430\u0448\u0435\u043b \u0432\u043e\u043e\u0431\u0449\u0435 \u0432\u0441\u0435\u0433\u043e \u0434\u0432\u0435:<\/p>\n<ul>\n<li>\n<p>nats.php \u043e\u0442 basis-company (<a href=\"https:\/\/github.com\/basis-company\/nats.php\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0430<\/a>)<\/p>\n<\/li>\n<li>\n<p>nats \u043e\u0442 flownative (<a href=\"https:\/\/github.com\/flownative\/nats\" rel=\"noopener noreferrer nofollow\">\u0421\u0441\u044b\u043b\u043a\u0430<\/a>)<\/p>\n<\/li>\n<\/ul>\n<p>\u0438 \u0442\u043e\u043b\u044c\u043a\u043e \u043f\u0435\u0440\u0432\u0430\u044f \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442\u0441\u044f, \u0442\u0430\u043a \u0447\u0442\u043e \u0432 \u0440\u0430\u043c\u043a\u0430\u0445 \u0434\u0430\u043d\u043d\u043e\u0439 \u0441\u0442\u0430\u0442\u044c\u0438 \u0440\u0430\u0441\u0441\u043c\u043e\u0442\u0440\u0438\u043c \u0432\u043d\u0435\u0434\u0440\u0435\u043d\u0438\u0435 \u0441 \u043f\u043e\u043c\u043e\u0449\u044c\u044e \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0438 <code>nats.php<\/code>.<\/p>\n<p>\u0420\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u044d\u0442\u043e\u0439 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439 \u0434\u043e\u0441\u0442\u0430\u0442\u043e\u0447\u043d\u043e \u0443\u0434\u043e\u0431\u043d\u043e, \u043d\u043e \u043d\u0435 \u0445\u0432\u0430\u0442\u0430\u0435\u0442 \u0431\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e\u0439 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 \u0438 \u043b\u043e\u0433\u0438\u0440\u043e\u0432\u0430\u043d\u0438\u044f, \u043f\u043e\u043c\u0438\u043c\u043e debug \u043b\u043e\u0433\u043e\u0432. \u041d\u043e \u043d\u0438\u0447\u0435\u0433\u043e, \u043f\u0440\u043e\u0440\u0432\u0435\u043c\u0441\u044f \ud83d\ude42<\/p>\n<p>\u0414\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u0440\u0430\u0431\u043e\u0442\u044b \u043f\u0440\u0438\u043c\u0435\u043c, \u0447\u0442\u043e \u043c\u044b \u0443\u0441\u0442\u0430\u043d\u043e\u0432\u0438\u043b\u0438 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0443<\/p>\n<pre><code class=\"bash\">composer require basis-company\/nats<\/code><\/pre>\n<p>\u0410 \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0438\u043b\u0438 composer autoload. \u041d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, \u043c\u043e\u0436\u043d\u043e \u0432 \u043d\u0430\u0447\u0430\u043b\u0435 \u0444\u0430\u0439\u043b\u0430 \u0443\u043a\u0430\u0437\u0430\u0442\u044c:<\/p>\n<pre><code class=\"php\">&lt;?php require_once 'vendor\/autoload.php';<\/code><\/pre>\n<h2>\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c \u0441 \u0431\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u043e\u0439<\/h2>\n<p>\u0414\u043b\u044f \u043f\u0440\u043e\u0441\u0442\u043e\u0442\u044b \u0440\u0430\u0441\u0441\u043a\u0430\u0437\u0430 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0439 function style PHP \u0441 \u0440\u0430\u0437\u0434\u0435\u043b\u0435\u043d\u0438\u0435\u043c \u043a\u043e\u0434\u0430 \u043d\u0430 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u0434\u043b\u044f \u0445\u043e\u0440\u043e\u0448\u0435\u0433\u043e \u043f\u043e\u043d\u0438\u043c\u0430\u043d\u0438\u044f.<br \/>\u0420\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u043c \u043f\u043e\u0434\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435 \u0438 \u043e\u0442\u043a\u043b\u044e\u0447\u0435\u043d\u0438\u0435<\/p>\n<pre><code class=\"php\">function connect(): \\Basis\\Nats\\Client   {       $configuration = new \\Basis\\Nats\\Configuration(           host: '127.0.0.1',           port: 4222,       );          return new \\Basis\\Nats\\Client($configuration);   }      function disconnect(\\Basis\\Nats\\Client $client): void   {       $client-&gt;disconnect();   }<\/code><\/pre>\n<p>\u0411\u0438\u0431\u043b\u0438\u043e\u0442\u0435\u043a\u0430 \u043f\u043e\u0434\u0434\u0435\u0440\u0436\u0438\u0432\u0430\u0435\u0442 \u043c\u043d\u043e\u0433\u043e \u0440\u0430\u0437\u043d\u044b\u0445 \u0441\u043f\u043e\u0441\u043e\u0431\u043e\u0432 \u0430\u0443\u0442\u0435\u043d\u0442\u0438\u0444\u0438\u043a\u0430\u0446\u0438\u0438. \u041d\u043e \u0432 \u043d\u0430\u0448\u0435\u043c \u043f\u0440\u0438\u043c\u0435\u0440\u0435 &#8212; \u043d\u0438\u043a\u0430\u043a\u043e\u0439 \u0431\u0435\u0437\u043e\u043f\u0430\u0441\u043d\u043e\u0441\u0442\u0438 \ud83d\ude42<\/p>\n<p>\u0414\u043b\u044f \u0441\u043e\u0437\u0434\u0430\u043d\u0438\u044f \u043f\u043e\u0442\u043e\u043a\u0430 \u0438 \u043e\u0431\u0440\u0430\u0449\u0435\u043d\u0438\u044f \u043a \u043d\u0435\u043c\u0443 \u0431\u0443\u0434\u0435\u043c \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0443\u044e \u0444\u0443\u043d\u043a\u0446\u0438\u044e<\/p>\n<pre><code class=\"php\">function init_stream(\\Basis\\Nats\\Client $client): \\Basis\\Nats\\Stream\\Stream   {       $api = $client-&gt;getApi();       $stream = $api-&gt;getStream('php-nats-test');       \/\/ \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f:       \/\/ \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 - \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435,         \/\/ \u0441\u0430\u0431\u0436\u0435\u043a\u0442\u044b, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443 - \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u044f \u043f\u043e\u0442\u043e\u043a\u0430.         $stream-&gt;getConfiguration()           -&gt;setRetentionPolicy(\\Basis\\Nats\\Stream\\RetentionPolicy::WORK_QUEUE);       $stream-&gt;create();          return $stream;   }<\/code><\/pre>\n<p>\u0424\u0443\u043d\u043a\u0446\u0438\u044f <code>init_stream<\/code> \u0441\u043e\u0437\u0434\u0430\u0435\u0442 \u043f\u043e\u0442\u043e\u043a, \u043a\u043e\u0442\u043e\u0440\u044b\u0439 \u0440\u0430\u0431\u043e\u0442\u0430\u0435\u0442 \u043a\u0430\u043a \u043a\u043b\u0430\u0441\u0441\u0438\u0447\u0435\u0441\u043a\u0430\u044f \u043e\u0447\u0435\u0440\u0435\u0434\u044c (WORK_QUEUE). \u0415\u0441\u043b\u0438 \u0437\u0430\u0434\u0430\u0447\u0430 \u0432\u0437\u044f\u0442\u0430 \u0438 ack-\u043d\u0443\u0442\u0430, \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0435 \u0443\u0434\u0430\u043b\u044f\u0435\u0442\u0441\u044f. \u041f\u0440\u0438 \u044d\u0442\u043e\u043c, \u043d\u0430\u043a\u043b\u0430\u0434\u044b\u0432\u0430\u0435\u0442\u0441\u044f \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0435\u043d\u0438\u0435: \u043d\u0430 \u043e\u0434\u0438\u043d \u0442\u043e\u043f\u0438\u043a &#8212; \u043e\u0434\u043d\u0430 \u0433\u0440\u0443\u043f\u043f\u0430 \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u043e\u0432 (\u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u044b \u0441 \u043e\u0434\u043d\u0438\u043c name), \u0442\u0430\u043a \u0440\u0435\u0430\u043b\u0438\u0437\u0443\u0435\u0442\u0441\u044f \u0433\u0430\u0440\u0430\u043d\u0442\u0438\u044f \u0434\u043e\u0441\u0442\u0430\u0432\u043a\u0438 exactly once.<\/p>\n<p>\u0411\u043e\u043b\u0435\u0435 \u043f\u043e\u0434\u0440\u043e\u0431\u043d\u043e \u043c\u043e\u0436\u043d\u043e \u043f\u043e\u0441\u043c\u043e\u0442\u0440\u0435\u0442\u044c \u0432 \u0434\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430\u0446\u0438\u0438 Nats \u043f\u043e JetStream Streams: <a href=\"https:\/\/docs.nats.io\/nats-concepts\/jetstream\/streams\" rel=\"noopener noreferrer nofollow\">https:\/\/docs.nats.io\/nats-concepts\/jetstream\/streams<\/a><\/p>\n<p>\u0412 \u043a\u0430\u0447\u0435\u0441\u0442\u0432\u0435 \u0437\u0430\u0434\u0430\u0447 \u0431\u0443\u0434\u0435\u043c \u0440\u0430\u0441\u0441\u043c\u0430\u0442\u0440\u0438\u0432\u0430\u0442\u044c \u043e\u0431\u044b\u0447\u043d\u044b\u0435 \u0441\u0442\u0440\u043e\u043a\u0438. \u0412 \u043f\u0435\u0440\u0441\u043f\u0435\u043a\u0442\u0438\u0432\u0435 \u043c\u043e\u0436\u043d\u043e \u0432 \u044d\u0442\u0438 \u0441\u0442\u0440\u043e\u043a\u0438 \u0437\u0430\u043f\u0438\u0441\u044b\u0432\u0430\u0442\u044c \u043b\u044e\u0431\u044b\u0435 \u0437\u043d\u0430\u0447\u0435\u043d\u0438\u044f, \u043d\u0430\u043f\u0440\u0438\u043c\u0435\u0440, JSON \u0437\u0430\u043a\u043e\u0434\u0438\u0440\u043e\u0432\u0430\u043d\u043d\u044b\u0435 \u0441\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u044b \u0434\u0430\u043d\u043d\u044b\u0445.<br \/>\u041a\u043e\u0434 \u0434\u043e\u0431\u0430\u0432\u043b\u0435\u043d\u0438\u044f \u0437\u0430\u0434\u0430\u0447 \u0432 \u043f\u043e\u0442\u043e\u043a:<\/p>\n<pre><code class=\"php\">function push_message(\\Basis\\Nats\\Client $client, string $message): string   {       $id = uniqid('', true);       $client-&gt;publish(           'php-nats-test',           new \\Basis\\Nats\\Message\\Payload($message, [               \/\/ \u042d\u0442\u043e \u043f\u043e\u043b\u0435 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u0435\u0434\u0443\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0438 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u043e\u0432 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435               'Nats-Msg-ID' =&gt; $id,               \/\/ \u041d\u043e\u043c\u0435\u0440 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f               'x-attempt' =&gt; 1,           ]),       );       return $id;   }<\/code><\/pre>\n<p>\u041f\u0440\u0438 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0435 \u0437\u0430\u0434\u0430\u0447\u0438 \u0433\u0435\u043d\u0435\u0440\u0438\u0440\u0443\u0435\u0442\u0441\u044f \u0435\u0451 ID. \u041f\u0440\u0438 \u043f\u043e\u043b\u0443\u0447\u0435\u043d\u0438\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u044d\u0442\u043e\u0442 ID \u0442\u0430\u043a\u0436\u0435 \u043f\u0440\u0438\u0434\u0435\u0442 \u0432 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430\u0445, \u0447\u0442\u043e \u043c\u043e\u0436\u0435\u0442 \u0431\u044b\u0442\u044c \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0434\u043b\u044f \u0434\u0430\u043b\u044c\u043d\u0435\u0439\u0448\u0435\u0439 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438. \u0421\u043c\u044b\u0441\u043b \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u0430 <code>x-attempt<\/code> \u0440\u0430\u0437\u0431\u0435\u0440\u0435\u043c \u043d\u0435\u043c\u043d\u043e\u0433\u043e \u043f\u043e\u0437\u0436\u0435.<\/p>\n<p>\u041d\u0430 \u0442\u0435\u043a\u0443\u0449\u0438\u0439 \u043c\u043e\u043c\u0435\u043d\u0442, \u0435\u0441\u043b\u0438 \u0441\u043e\u0431\u0440\u0430\u0442\u044c \u0432\u0435\u0441\u044c \u043a\u043e\u0434, \u043c\u044b \u0441\u043c\u043e\u0436\u0435\u043c \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0442\u044c \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c.<br \/>\u0414\u043b\u044f \u043d\u0430\u0447\u0430\u043b\u0430 \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u043c Nats \u0432 \u043b\u043e\u043a\u0430\u043b\u044c\u043d\u043e\u043c \u0434\u043e\u043a\u0435\u0440\u0435 \u0441 \u0432\u043a\u043b\u044e\u0447\u0435\u043d\u043d\u044b\u043c jetstream:<\/p>\n<pre><code class=\"bash\">docker run --rm -it -p 4222:4222 nats -js<\/code><\/pre>\n<p>\u041a\u043e\u0434 \u0437\u0430\u043f\u0443\u0441\u043a\u0430:<\/p>\n<pre><code class=\"php\">$client = connect(); init_stream($client);    $id = push_message($client, 'Hello World!');   echo 'pushed message id: ' . $id . PHP_EOL;   $id = push_message($client, 'Hello World, again!');   echo 'pushed message id: ' . $id . PHP_EOL;   $id = push_message($client, 'Hello World, once more!');   echo 'pushed message id: ' . $id . PHP_EOL;      disconnect($client);<\/code><\/pre>\n<p>\u041f\u0440\u043e\u0431\u0443\u0435\u043c \u0437\u0430\u043f\u0443\u0441\u0442\u0438\u0442\u044c \u0438 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043b\u043e\u0433\u0438:<\/p>\n<pre><code>% php producer.php pushed message id: 68028fce39f239.23978889 pushed message id: 68028fce3b55a9.67959494 pushed message id: 68028fce3b56d1.07523175<\/code><\/pre>\n<details class=\"spoiler\">\n<summary>\u0418\u0442\u043e\u0433\u043e\u0432\u044b\u0439 \u043a\u043e\u0434 \u0444\u0430\u0439\u043b\u0430 producer.php<\/summary>\n<div class=\"spoiler__content\">\n<pre><code class=\"php\">&lt;?php  require_once 'vendor\/autoload.php';  function connect(): \\Basis\\Nats\\Client {     $configuration = new \\Basis\\Nats\\Configuration(         host: '127.0.0.1',         port: 4222,     );      return new \\Basis\\Nats\\Client($configuration); }  function disconnect(\\Basis\\Nats\\Client $client): void {     $client-&gt;disconnect(); }  function init_stream(\\Basis\\Nats\\Client $client): \\Basis\\Nats\\Stream\\Stream {     $api = $client-&gt;getApi();     $stream = $api-&gt;getStream('php-nats-test');     \/\/ \u041f\u043e \u0443\u043c\u043e\u043b\u0447\u0430\u043d\u0438\u044e \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f:     \/\/ \u0445\u0440\u0430\u043d\u0438\u043b\u0438\u0449\u0435 - \u0444\u0430\u0439\u043b\u043e\u0432\u043e\u0435,     \/\/ \u0441\u0430\u0431\u0436\u0435\u043a\u0442\u044b, \u043e\u0442\u043d\u043e\u0441\u044f\u0449\u0438\u0435\u0441\u044f \u043a \u044d\u0442\u043e\u043c\u0443 \u043f\u043e\u0442\u043e\u043a\u0443 - \u0442\u043e\u043b\u044c\u043a\u043e \u0438\u043c\u044f \u043f\u043e\u0442\u043e\u043a\u0430.     $stream-&gt;getConfiguration()         -&gt;setRetentionPolicy(\\Basis\\Nats\\Stream\\RetentionPolicy::WORK_QUEUE);     $stream-&gt;create();      return $stream; }  function push_message(\\Basis\\Nats\\Client $client, string $message): string {     $id = uniqid('', true);     $client-&gt;publish(         'php-nats-test',         new \\Basis\\Nats\\Message\\Payload($message, [             \/\/ \u042d\u0442\u043e \u043f\u043e\u043b\u0435 \u0442\u0430\u043a\u0436\u0435 \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u0443\u0435\u0442\u0441\u044f \u0434\u043b\u044f \u0434\u0435\u0434\u0443\u043f\u043b\u0438\u043a\u0430\u0446\u0438\u0438, \u043d\u043e \u0442\u0430\u043a\u0436\u0435 \u043f\u043e\u043b\u0435\u0437\u043d\u043e \u0438 \u0434\u043b\u044f \u043e\u0442\u043e\u0431\u0440\u0430\u0436\u0435\u043d\u0438\u0435 \u043b\u043e\u0433\u043e\u0432 \u0432 \u0441\u0438\u0441\u0442\u0435\u043c\u0435             'Nats-Msg-ID' =&gt; $id,             \/\/ \u041d\u043e\u043c\u0435\u0440 \u043f\u043e\u043f\u044b\u0442\u043a\u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f             'x-attempt' =&gt; 1,         ]),     );     return $id; }   $client = connect();  init_stream($client); $id = push_message($client, 'Hello World!'); echo 'pushed message id: ' . $id . PHP_EOL; $id = push_message($client, 'Hello World, again!'); echo 'pushed message id: ' . $id . PHP_EOL; $id = push_message($client, 'Hello World, once more!'); echo 'pushed message id: ' . $id . PHP_EOL;  disconnect($client); <\/code><\/pre>\n<\/div>\n<\/details>\n<p>\u0414\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0445\u043e\u0434\u0438\u043c \u043a \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0435\u043c\u0443 \u044d\u0442\u0430\u043f\u0443. \u041d\u0430\u043c \u0432\u0435\u0434\u044c \u043d\u0443\u0436\u043d\u043e \u044d\u0442\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0437\u0430\u0431\u0440\u0430\u0442\u044c!<\/p>\n<h3>\u041f\u043e\u0442\u0440\u0435\u0431\u043b\u0435\u043d\u0438\u0435 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438<\/h3>\n<p>\u0412\u0435\u0440\u043d\u0435\u043c\u0441\u044f \u043a \u0432\u043e\u043f\u0440\u043e\u0441\u0443 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0440\u0435\u0442\u0440\u0430\u0435\u0432. \u0412 \u0446\u0435\u043b\u043e\u043c, \u0434\u043b\u044f \u0435\u0451 \u0440\u0435\u0430\u043b\u0438\u0437\u0430\u0446\u0438\u0438 \u0435\u0441\u0442\u044c \u0434\u0432\u0430 \u0432\u0430\u0440\u0438\u0430\u043d\u0442\u0430:<\/p>\n<ul>\n<li>\n<p>\u0428\u0442\u0430\u0442\u043d\u044b\u0439 \u043e\u0433\u0440\u0430\u043d\u0438\u0447\u0438\u0442\u0435\u043b\u044c \u0432 \u043d\u0430\u0441\u0442\u0440\u043e\u0439\u043a\u0430\u0445 \u043a\u043e\u043d\u0441\u044c\u044e\u043c\u0435\u0440\u0430 &#171;\u0434\u043e\u0441\u0442\u0430\u0432\u043b\u044f\u0442\u044c \u043c\u043d\u0435 \u043e\u0434\u043d\u0443 \u0437\u0430\u0434\u0430\u0447\u0443 \u043d\u0435 \u0431\u043e\u043b\u0435\u0435 X \u0440\u0430\u0437, \u0435\u0441\u043b\u0438 \u043e\u043d\u0430 nack-\u043d\u0443\u0442\u0430&#187;, \u043f\u0440\u0438 \u044d\u0442\u043e\u043c \u043f\u0440\u0438 \u0438\u0441\u0447\u0435\u0440\u043f\u0430\u043d\u0438\u0438 \u043f\u043e\u043f\u044b\u0442\u043e\u043a, \u0437\u0430\u0434\u0430\u0447\u0430 \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0443\u0434\u0430\u043b\u0435\u043d\u0430 <strong>\u043d\u0435<\/strong> \u0431\u0443\u0434\u0435\u0442<\/p>\n<\/li>\n<li>\n<p>\u041a\u0430\u0441\u0442\u043e\u043c\u043d\u0430\u044f \u043b\u043e\u0433\u0438\u043a\u0430 \u043d\u0430 \u043e\u0441\u043d\u043e\u0432\u0435 \u0437\u0430\u0433\u043e\u043b\u043e\u0432\u043a\u043e\u0432 \u0438 \u043e\u0431\u0440\u0430\u0442\u043d\u043e\u0439 \u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u043a\u043e\u043d\u0435\u0446 \u043e\u0447\u0435\u0440\u0435\u0434\u0438 (\u0441\u043f\u043e\u0439\u043b\u0435\u0440: \u0438\u0441\u043f\u043e\u043b\u044c\u0437\u043e\u0432\u0430\u0442\u044c \u0431\u0443\u0434\u0435\u043c \u0438\u043c\u0435\u043d\u043d\u043e \u0435\u0433\u043e) <\/p>\n<p>\u0421\u0430\u043c\u044b\u0439 \u043e\u0447\u0435\u0432\u0438\u0434\u043d\u044b\u0439 \u0441\u043f\u043e\u0441\u043e\u0431 \u0441\u043b\u0435\u0434\u0443\u044e\u0449\u0438\u0439:<\/p>\n<ul>\n<li>\n<p>\u0411\u0435\u0440\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443<\/p>\n<\/li>\n<li>\n<p>\u041f\u044b\u0442\u0430\u0435\u043c\u0441\u044f \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u0430\u0442\u044c<\/p>\n<\/li>\n<li>\n<p>\u041f\u043e\u043b\u0443\u0447\u0430\u0435\u043c \u043e\u0448\u0438\u0431\u043a\u0443<\/p>\n<\/li>\n<li>\n<p>\u041e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c \u0441 attempt = attempt + 1 <\/p>\n<ul>\n<li>\n<p>\u041f\u0440\u043e\u0432\u0435\u0440\u044f\u0435\u043c, \u0435\u0441\u043b\u0438 <code>attempt === MAX_ATTEMPTS<\/code>, \u043d\u0435 \u043e\u0442\u043f\u0440\u0430\u0432\u043b\u044f\u0435\u043c \u0437\u0430\u0434\u0430\u0447\u0443 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c<\/p>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p>\u041a\u043e\u0434 \u0444\u0443\u043d\u043a\u0446\u0438\u0438 \u043f\u0435\u0440\u0435\u043e\u0442\u043f\u0440\u0430\u0432\u043a\u0438 \u0437\u0430\u0434\u0430\u0447\u0438 \u0432 \u043e\u0447\u0435\u0440\u0435\u0434\u044c:<\/p>\n<pre><code class=\"php\">function redeliver(\\Basis\\Nats\\Client $client, \\Basis\\Nats\\Message\\Msg $msg): void   {       $id = uniqid('', true);       $client-&gt;publish(           $msg-&gt;subject,           new \\Basis\\Nats\\Message\\Payload($msg-&gt;payload-&gt;body, [               'Nats-Msg-ID' =&gt; $id,               'x-attempt' =&gt; $msg-&gt;payload-&gt;getHeader('x-attempt') + 1,           ])       );   }<\/code><\/pre>\n<p>\u041d\u0443 \u0438 \u0441\u0430\u043c\u043e\u0435 \u0438\u043d\u0442\u0435\u0440\u0435\u0441\u043d\u043e\u0435 &#8212; \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439. \u041d\u0430\u0447\u043d\u0435\u043c \u0441 \u043e\u0434\u043d\u043e\u0433\u043e \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f, \u0430 \u0434\u0430\u043b\u0435\u0435 \u043f\u0435\u0440\u0435\u0439\u0434\u0435\u043c \u043a \u043f\u0440\u043e\u0441\u043b\u0443\u0448\u0438\u0432\u0430\u043d\u0438\u044e \u043e\u0447\u0435\u0440\u0435\u0434\u0438 \u0438 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0435 \u0431\u0435\u0441\u043a\u043e\u043d\u0435\u0447\u043d\u043e\u0433\u043e \u043a\u043e\u043b\u0438\u0447\u0435\u0441\u0442\u0432\u0430 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u0439:<\/p>\n<pre><code class=\"php\">function handle_message(string $id, string $payload, int $attempt): bool   {       echo \"\u041e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0430 \u0437\u0430\u0434\u0430\u0447\u0438 ID {$id}, \u043d\u043e\u043c\u0435\u0440 \u043f\u043e\u043f\u044b\u0442\u043a\u0438: {$attempt}, \u0442\u0435\u043b\u043e: {$payload}\\n\";          if ($payload === 'Hello World!' &amp;&amp; $attempt === 1) {           \/\/ Hello world - \u0437\u0430\u0434\u0430\u0447\u0430 \u0442\u044f\u0436\u0435\u043b\u0430\u044f, \u0441 \u043f\u0435\u0440\u0432\u043e\u0433\u043e \u0440\u0430\u0437\u0430 \u043d\u0438\u043a\u043e\u0433\u0434\u0430 \u043d\u0435 \u043f\u043e\u043b\u0443\u0447\u0430\u0435\u0442\u0441\u044f           return false;       }          return true;   }<\/code><\/pre>\n<p>\u0418 \u043a\u043e\u0434 \u043e\u0431\u0440\u0430\u0431\u043e\u0442\u043a\u0438 \u0441\u043e\u043e\u0431\u0449\u0435\u043d\u0438\u044f \u0438\u0437 \u043e\u0447\u0435\u0440\u0435\u0434\u0438:<\/p>\n<pre><code class=\"php\">const MAX_ATTEMPTS = 3;   function process_message(\\Basis\\Nats\\Client $client, \\Basis\\Nats\\Message\\Msg $message): void   {       $payload = $message-&gt;payload;          $id = $payload-&gt;getHeader('Nats-Msg-ID');       $attempt = (int)$payload-&gt;getHeader('x-attempt');       try {           if (handle_message($id, $payload-&gt;body, $attempt)) {               $message-&gt;ack();           } else {               if ($attempt &lt; MAX_ATTEMPTS) {                   redeliver($client, $message);               }               $message-&gt;ack();           }       } catch (Throwable $e) {<\/code><\/pre>\n<\/div>\n<\/div>\n<\/div>\n<\/div>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[],"tags":[],"class_list":["post-457511","post","type-post","status-publish","format-standard","hentry"],"_links":{"self":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/457511","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=457511"}],"version-history":[{"count":0,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=\/wp\/v2\/posts\/457511\/revisions"}],"wp:attachment":[{"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=457511"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=457511"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/savepearlharbor.com\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=457511"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}