{"id":54,"date":"2014-07-09T12:23:54","date_gmt":"2014-07-09T03:23:54","guid":{"rendered":"http:\/\/appw.jp\/2014\/?p=54"},"modified":"2016-10-28T14:16:08","modified_gmt":"2016-10-28T05:16:08","slug":"mongodb-%e3%81%ab%e4%bf%9d%e5%ad%98%e3%81%97%e3%81%9f-mosquitto-%e3%81%ae-payload-%e3%82%92-server-sent-events-%e3%81%a7%e8%a1%a8%e7%a4%ba%e3%81%97%e3%81%a6%e3%81%bf%e3%82%8b","status":"publish","type":"post","link":"http:\/\/appw.jp\/2014\/?p=54","title":{"rendered":"MongoDB \u306b\u4fdd\u5b58\u3057\u305f Mosquitto \u306e payload \u3092 Server-Sent Events \u3067\u8868\u793a\u3057\u3066\u307f\u308b"},"content":{"rendered":"<p>\u524d\u56de\u306e\u300c<a href=\"http:\/\/appw.jp\/2014\/?p=47\">Mosquitto \u306e payload \u3092 MongoDB \u306b\u4fdd\u5b58\u3057\u3066\u307f\u308b<\/a>\u300d\u306e\u7d9a\u7bc7\u3067\u3059\u3002<\/p>\n<p>\u4eca\u56de\u306f\u3001\u305d\u306e MongoDB \u304b\u3089\u53d6\u308a\u51fa\u3057\u3066\u3001HTML5 \u306e Server-Sent Events\uff08EventSource\uff09\u3092\u5229\u7528\u3057\u3066\u30d6\u30e9\u30a6\u30b6\u306b\u8868\u793a\u3057\u3066\u3044\u304f\u30d7\u30ed\u30b0\u30e9\u30e0\u3092 PHP \u3067\u4f5c\u6210\u3057\u307e\u3059\u3002Server-Sent Events \u306b\u3064\u3044\u3066\u306f\u3001\u4ee5\u524d\u306e\u8a18\u4e8b\u300c<a href=\"http:\/\/appw.jp\/html5x\/?p=51\">Server-Sent Events\uff08EventSource\uff09\u3092\u8a66\u3057\u3066\u307f\u307e\u3059<\/a>\u300d\u304c\u30d9\u30fc\u30b9\u3068\u306a\u308a\u307e\u3059\u3002<\/p>\n<p>\u307e\u305a\u3001<a href=\"http:\/\/px.a8.net\/svt\/ejp?a8mat=25TTDR+2BY85U+50+4ATZKY\" target=\"_blank\">ConoHa VPS<\/a><img loading=\"lazy\" decoding=\"async\" border=\"0\" width=\"1\" height=\"1\" src=\"http:\/\/www19.a8.net\/0.gif?a8mat=25TTDR+2BY85U+50+4ATZKY\" alt=\"\"> \u306e CentOS 6.5 \u306e\u74b0\u5883\u3067\u3001PHP \u304b\u3089 MongoDB \u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u305f\u3081\u3001MongoDB PHP \u30c9\u30e9\u30a4\u30d0\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: bash; title: ; notranslate\" title=\"\">\r\nsudo pecl install mongo\r\n<\/pre>\n<p>\u305d\u3057\u3066\u3001php.ini \u306b\u6b21\u306e\u884c\u3092\u8ffd\u52a0\u3057\u307e\u3059\u3002<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\nextension=mongo.so\r\n<\/pre>\n<p>\u6b21\u306f\u3001\u30d6\u30e9\u30a6\u30b6\u5074\u306e HTML \u3067\u3059\u3002<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n&lt;!DOCTYPE html&gt;\r\n&lt;html&gt;\r\n&lt;head&gt;\r\n&lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text\/html; charset=utf-8&quot;&gt;\r\n&lt;script src=&quot;http:\/\/ajax.googleapis.com\/ajax\/libs\/jquery\/1.11.1\/jquery.min.js&quot;&gt;&lt;\/script&gt;\r\n&lt;\/head&gt;\r\n&lt;body&gt;\r\n&lt;div id=&quot;out&quot;&gt;\r\n&lt;?php\r\n\/\/ DB\u3078\u63a5\u7d9a\r\n$mongo = new Mongo();\r\n\/\/ \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u6307\u5b9a\r\n$db = $mongo-&gt;selectDB(&quot;chattest&quot;);\r\n\/\/ \u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u3092\u6307\u5b9a\r\n$con = $db-&gt;selectCollection(&quot;conn_log&quot;);\r\n$col = $db-&gt;selectCollection(&quot;chat_log&quot;);\r\n\/\/ \u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u53d6\u5f97\r\n$connid = time();\r\n$lastid = 0;\r\n$wid = $lastid;\r\n$cursor = $col-&gt;find()-&gt;sort(array('created_at'=&gt;-1))-&gt;limit(5);\r\nforeach ($cursor as $doc) {\r\n  echo '&lt;p&gt;' . $doc&#x5B;&quot;text&quot;] . '&lt;\/p&gt;';\r\n  $wt = date('Y\/m\/d H:i:s', $doc&#x5B;&quot;created_at&quot;]);\r\n  echo '&lt;p&gt;- ' . $wt . ' -&lt;\/p&gt;';\r\n  if ($wid == $lastid) {\r\n    $wid = $doc&#x5B;&quot;created_at&quot;];\r\n  }\r\n}\r\n$con-&gt;insert(array('connid' =&gt; $connid, 'lastid' =&gt; $wid, 'user' =&gt; 'php'));\r\n\/\/\u00a0\u63a5\u7d9a\u306e\u5207\u65ad\r\n$mongo-&gt;close();\r\n?&gt;\r\n&lt;\/div&gt;\r\n&lt;script&gt;\r\n&lt;?php\r\n  echo &quot;  var lastid = '&quot; . $wid . &quot;';&quot; . PHP_EOL;\r\n?&gt;\r\n  function sse(){\r\n    if (typeof (EventSource) !== 'undefined') {\r\n&lt;?php\r\n  echo &quot;      sv = 'sse.php?id=&quot; . $connid . &quot;';&quot; . PHP_EOL;\r\n?&gt;\r\n      source = new EventSource(sv);\r\n\r\n      source.addEventListener('messages', function(event){\r\n        if (event.lastEventId &gt; lastid) {\r\n   \u3000     document.getElementById('out').innerHTML = event.data + document.getElementById('out').innerHTML ;\r\n          lastid = event.lastEventId;\r\n        }\r\n      },false);\r\n         \r\n      source.addEventListener('end', function(event){\r\n        if (event.lastEventId &gt; lastid) {\r\n   \u3000     document.getElementById('out').innerHTML = event.data + document.getElementById('out').innerHTML ;\r\n          lastid = event.lastEventId;\r\n        }\r\n        source.close();\r\n      },false);\r\n\r\n      source.onerror = function (event) {\r\n        if (source.readyState === EventSource.CLOSED) {\r\n          document.getElementById('out').innerHTML = '&lt;p&gt;\u7d42\u4e86\u3057\u3066\u3044\u307e\u3059\u3002&lt;\/p&gt;' + document.getElementById('out').innerHTML ;\r\n        }\r\n        else if (source.readyState === EventSource.OPEN) {\r\n          document.getElementById('out').innerHTML = '&lt;p&gt;\u7d42\u4e86\u3057\u307e\u3059\u3002&lt;\/p&gt;' + document.getElementById('out').innerHTML ;\r\n          source.close();\r\n        }\r\n        else if (source.readyState === EventSource.CONNECTING) {\r\n        }\r\n      }\r\n    } else {\r\n      document.getElementById('out').innerHTML = '&lt;p&gt;Server-Sent Events \u306f\u30b5\u30dd\u30fc\u30c8\u3055\u308c\u3066\u3044\u307e\u305b\u3093\u3002&lt;\/p&gt;' ;\r\n    }\r\n  }\r\n  window.onload = sse;\r\n&lt;\/script&gt;\r\n&lt;\/body&gt;\r\n&lt;\/html&gt;\r\n<\/pre>\n<p>\u521d\u671f\u8868\u793a\u306b\u6700\u65b0\u306e\uff15\u4ef6\u3092\u8868\u793a\u3059\u308b\u305f\u3081\u3001PHP \u3067 MongoDB \u306b\u30a2\u30af\u30bb\u30b9\u3059\u308b\u30b3\u30fc\u30c9\u304c\u542b\u307e\u308c\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u3055\u3089\u306b\u3001HTML5 \u306e Server-Sent Events \u306e\u5b9f\u969b\u306e\u3057\u304f\u307f\u3092\u8003\u616e\u3057\u3066\u3001\u63a5\u7d9a\u3054\u3068\u306b Server-Sent Events \u3067\u9001\u4fe1\u3057\u305f\u6700\u7d42\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e created_at \u3092\u7ba1\u7406\u3057\u3066\u3001\u6b21\u56de\u306e\u9001\u4fe1\u30c7\u30fc\u30bf\u306e\u5224\u5b9a\u306b\u4f7f\u7528\u3059\u308b\u3057\u304f\u307f\u3092\u8ffd\u52a0\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<p>\u3044\u304f\u3064\u304b\u65b9\u5f0f\u3092\u8003\u3048\u3066\u8a66\u3057\u305f\u75d5\u8de1\u304c\u3046\u3063\u3059\u3089\u3068\u30b3\u30fc\u30c9\u306b\u6b8b\u3063\u3066\u3057\u307e\u3044\u307e\u3057\u305f\u304c\u3001\u6700\u7d42\u7684\u306b\u306f\u3001EventSource \u306b\u8a2d\u5b9a\u3057\u305f url \u306e sse.php \u306b GET \u30e1\u30bd\u30c3\u30c9\u3067 \u8b58\u5225\u60c5\u5831\u3092\u6e21\u3059\u3053\u3068\u306b\u3057\u3066\u3001\u305d\u306e\u5185\u5bb9\u306b\u306f\u3001\u6700\u521d\u306b\u30d6\u30e9\u30a6\u30b6\u304b\u3089\u63a5\u7d9a\u3057\u305f UNIXTIME \u3092\u30bb\u30c3\u30c8\u3059\u308b\u3053\u3068\u306b\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>\u3053\u306e\u60c5\u5831\u3068\u6700\u7d42\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u306e created_at \u3092 conn_log \u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u306b\u4fdd\u5b58\u3057\u3066\u3001\u9001\u4fe1\u30c7\u30fc\u30bf\u306e\u30c0\u30d6\u308a\u3084\u30e2\u30ec\u3092\u56de\u907f\u3059\u308b\u3088\u3046\u306b\u3057\u307e\u3057\u305f\u3002\u5927\u91cf\u30a2\u30af\u30bb\u30b9\u306b\u306f\u5411\u304b\u306a\u3044\u65b9\u6cd5\u3067\u3059\u306e\u3067\u691c\u8a0e\u306e\u4f59\u5730\u304c\u3042\u308a\u307e\u3059\u304c\u3001\u5148\u306b\u9032\u307f\u307e\u3059\u3002<\/p>\n<p>\u7d9a\u3044\u3066\u3001\u30b5\u30fc\u30d0\u30fc\u5074\u3067\u3059\u3002<\/p>\n<p>\u524d\u56de\u9001\u4fe1\u3057\u305f\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u4ee5\u964d\u3092\u691c\u7d22\u3057\u3066\u3044\u307e\u3059\u3002<\/p>\n<pre class=\"brush: php; title: ; notranslate\" title=\"\">\r\n&lt;?php\r\nheader('Content-Type: text\/event-stream');\r\nheader('Cache-Control: no-cache');\r\n\r\n$lastid = 0;\r\n$connid = 0;\r\nif (isset($_GET&#x5B;'id'])) {\r\n   $connid = intval($_GET&#x5B;'id']);\r\n}\r\n\r\n\/\/ DB\u3078\u63a5\u7d9a\r\n$mongo = new Mongo();\r\n\/\/ \u30c7\u30fc\u30bf\u30d9\u30fc\u30b9\u3092\u6307\u5b9a\r\n$db = $mongo-&gt;selectDB(&quot;chattest&quot;);\r\n\/\/ \u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u3092\u6307\u5b9a\r\n$con = $db-&gt;selectCollection(&quot;conn_log&quot;);\r\n$col = $db-&gt;selectCollection(&quot;chat_log&quot;);\r\n\/\/ \u30b3\u30ec\u30af\u30b7\u30e7\u30f3\u306e\u30c9\u30ad\u30e5\u30e1\u30f3\u30c8\u3092\u53d6\u5f97\r\n$curcon = $con-&gt;findOne(array('connid' =&gt; $connid));\r\n$lastid = $curcon&#x5B;&quot;lastid&quot;];\r\n$wid = $lastid;\r\n$cursor = $col-&gt;find(array('created_at' =&gt; array('$gt' =&gt; $lastid)))-&gt;sort(array('created_at' =&gt; -1));\r\necho 'event: ' . 'messages' . PHP_EOL;\r\nforeach ($cursor as $doc) {\r\n  if ($wid == $lastid) {\r\n    $wid = $doc&#x5B;&quot;created_at&quot;];\r\n  }\r\n  echo 'data: &lt;p&gt;' . $doc&#x5B;&quot;text&quot;] . '&lt;\/p&gt;' . PHP_EOL ;\r\n  $wt = date('Y\/m\/d H:i:s', $doc&#x5B;&quot;created_at&quot;]);\r\n  echo 'data: &lt;p&gt;- ' . $wt . ' -&lt;\/p&gt;' . PHP_EOL ;\r\n}\r\necho 'id: ' . strval($wid) . PHP_EOL;\r\n\r\n$curcon&#x5B;&quot;lastid&quot;] = $wid;\r\n$con-&gt;save($curcon);\r\n\/\/\u00a0\u63a5\u7d9a\u306e\u5207\u65ad\r\n$mongo-&gt;close();\r\n\r\n$retry = 10000;\r\nif ( $retry == 0 ) {\r\n  echo 'event: ' . 'end' . PHP_EOL;\r\n} else {\r\n  echo 'retry: ' . $retry . '' . PHP_EOL;\r\n}\r\necho PHP_EOL;\r\nob_flush();\r\nflush();\r\n\r\n?&gt;\r\n<\/pre>\n<svg width=\"320\" height=\"320\"><image width=\"320\" height=\"320\" xlink:href=\"\/\/appw.jp\/images\/ChatSample.svg\" src=\"http:\/\/appw.jp\/2014\/files\/2014\/07\/sketch-140467369307801.jpg\" \/><\/svg>\n<p>\u7b2c\uff11\u56de\u306e\u300c<a href=\"http:\/\/appw.jp\/2014\/?p=47\">Mosquitto \u306e payload \u3092 MongoDB \u306b\u4fdd\u5b58\u3057\u3066\u307f\u308b<\/a>\u300d\u3067\u306f\u3001Mosquitto \u306e payload \u3092 MongoDB \u306b\u4fdd\u5b58\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>\u4eca\u56de\u306e\u7b2c\uff12\u56de\u306f\u3001HTML5 \u306e Server-Sent Events \u3068 PHP \u3067\u30d6\u30e9\u30a6\u30b6\u306b\u8868\u793a\u3057\u307e\u3057\u305f\u3002<\/p>\n<p>\u6b21\u56de\u306e\u7b2c\uff13\u56de\u306f\u3001Python \u3067 WebSocket \u3092\u5229\u7528\u3057\u305f\u7c21\u5358\u306a\u30c1\u30e3\u30c3\u30c8\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u53c2\u8003\u306b MongoDB \u30a2\u30af\u30bb\u30b9\u3092\u66f8\u304d\u52a0\u3048\u3066\u307f\u307e\u3059\u3002<br \/>\n\u300c<a href=\"http:\/\/appw.jp\/2014\/?p=59\">Python WebSocket \u306e\u30c1\u30e3\u30c3\u30c8\u30b5\u30f3\u30d7\u30eb\u306b\u3001MongoDB \u4fdd\u5b58\u3092\u4ed8\u3051\u52a0\u3048\u307e\u3057\u305f<\/a>\u300d<\/p>\n<p>\u7b2c\uff14\u56de\u306f\u3001\u7b2c\uff13\u56de\u306e Python \u306e WebSocket \u30c1\u30e3\u30c3\u30c8\u30d7\u30ed\u30b0\u30e9\u30e0\u3092\u53c2\u8003\u306b\u3057\u3064\u3064\u3001\u30d6\u30e9\u30a6\u30b6\u304b\u3089 POST \u30e1\u30bd\u30c3\u30c9\u3067 Mosquitto \u3078 Publish \u3057\u3001\u307e\u305f\u3001Server-Sent Events \u3067\u30d6\u30e9\u30a6\u30b6\u306b\u8868\u793a\u3059\u308b\u65b9\u5f0f\u3092 Python \u3067\u8a66\u3057\u3066\u307f\u307e\u3059\u3002<br \/>\n\u300c<a href=\"http:\/\/appw.jp\/2014\/?p=68\">Mosquitto Publish \u3068 Server-Sent Events \u3067 Python \u30c1\u30e3\u30c3\u30c8\u30b5\u30f3\u30d7\u30eb\u3092\u6539\u9020<\/a>\u300d<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u524d\u56de\u306e\u300cMosquitto \u306e payload \u3092 MongoDB \u306b\u4fdd\u5b58\u3057\u3066\u307f\u308b\u300d\u306e\u7d9a\u7bc7\u3067\u3059\u3002 \u4eca\u56de\u306f\u3001\u305d\u306e MongoDB \u304b\u3089\u53d6\u308a\u51fa\u3057\u3066\u3001HTML5 \u306e Server-Sent Events\uff08EventSource [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[2],"tags":[],"class_list":["post-54","post","type-post","status-publish","format-standard","hentry","category-vps"],"_links":{"self":[{"href":"http:\/\/appw.jp\/2014\/index.php?rest_route=\/wp\/v2\/posts\/54","targetHints":{"allow":["GET"]}}],"collection":[{"href":"http:\/\/appw.jp\/2014\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/appw.jp\/2014\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/appw.jp\/2014\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/appw.jp\/2014\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=54"}],"version-history":[{"count":9,"href":"http:\/\/appw.jp\/2014\/index.php?rest_route=\/wp\/v2\/posts\/54\/revisions"}],"predecessor-version":[{"id":162,"href":"http:\/\/appw.jp\/2014\/index.php?rest_route=\/wp\/v2\/posts\/54\/revisions\/162"}],"wp:attachment":[{"href":"http:\/\/appw.jp\/2014\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=54"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/appw.jp\/2014\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=54"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/appw.jp\/2014\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=54"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}