{"id":34338,"date":"2023-05-30T07:47:42","date_gmt":"2023-06-18T00:10:02","guid":{"rendered":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8docker%e3%80%81laravel%e3%80%81redis%e5%92%8claravel-echo%e5%ae%9e%e7%8e%b0%e5%ae%9e%e6%97%b6%e9%80%9a%e4%bf%a1\/"},"modified":"2024-04-30T06:34:56","modified_gmt":"2024-04-29T22:34:56","slug":"%e4%bd%bf%e7%94%a8docker%e3%80%81laravel%e3%80%81redis%e5%92%8claravel-echo%e5%ae%9e%e7%8e%b0%e5%ae%9e%e6%97%b6%e9%80%9a%e4%bf%a1","status":"publish","type":"post","link":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8docker%e3%80%81laravel%e3%80%81redis%e5%92%8claravel-echo%e5%ae%9e%e7%8e%b0%e5%ae%9e%e6%97%b6%e9%80%9a%e4%bf%a1\/","title":{"rendered":"\u4f7f\u7528Docker\u3001Laravel\u3001Redis\u548cLaravel Echo\u5b9e\u73b0\u5b9e\u65f6\u901a\u4fe1"},"content":{"rendered":"<h1>\u9996\u5148<\/h1>\n<p>\u5728Google\u4e0a\u641c\u7d22\u65f6\uff0c\u6211\u627e\u5230\u4e86\u5f88\u591a\u5173\u4e8e\u4f7f\u7528Laravel\u548cRedis\u8fdb\u884cWebSocket\u901a\u4fe1\u7684\u5b98\u65b9\u6587\u6863\u548c\u5176\u4ed6\u6587\u7ae0\uff0c\u4f46\u662f\u6211\u5c1d\u8bd5\u4e86\u5f88\u591a\u65b9\u6cd5\u5374\u4e00\u76f4\u4e0d\u592a\u6210\u529f\uff0c\u6240\u4ee5\u6211\u51b3\u5b9a\u5c06\u8fd9\u4e9b\u8fc7\u7a0b\u8bb0\u5f55\u5728\u8fd9\u7bc7\u6587\u7ae0\u4e2d\u4f5c\u4e3a\u5907\u5fd8\u3002\u7531\u4e8e\u7bc7\u5e45\u539f\u56e0\uff0c\u6211\u5c06\u7701\u7565\u5404\u4e2a\u5de5\u5177\u7684\u8bf4\u660e\u3002\u6211\u8ba4\u4e3a\u641c\u7d22\u4f1a\u6709\u5f88\u591a\u66f4\u6613\u7406\u89e3\u7684\u6587\u7ae0\u51fa\u73b0&#8230;\u3002<\/p>\n<h1>\u73af\u5883<\/h1>\n<p>Docker Desktop for Mac 3.6.0<br \/>\nPHP 8.0.9\u7248\u672c<br \/>\nLaravel 8.40\u7248\u672c<br \/>\nredis-server 6.2.5\u7248\u672c<br \/>\nLaravel-echo-server 1.6.2\u7248\u672c<br \/>\nnode 14.16.0\u7248\u672c<br \/>\nnpm 7.8.0\u7248\u672c<br \/>\ncomposer 1.10.19\u7248\u672c<\/p>\n<h1>\u4f7f\u7528Docker\u6784\u5efa\u5bb9\u5668\u3002<\/h1>\n<p>\u8fd9\u6b21\u6211\u4eec\u5728\u4ee5\u4e0b\u6587\u7ae0\u7684\u57fa\u7840\u4e0a\u6dfb\u52a0\u4e86\u6240\u9700\u5185\u5bb9\u7684Docker\u73af\u5883\u3002\u975e\u5e38\u611f\u8c22 @ucan-lab \u5148\u751f\u3002<br \/>\n\u3010\u8d85\u5165\u95e8\u3011\u4f7f\u7528Docker\u5feb\u901f\u6784\u5efa20\u5206\u949f\u5185\u7684Laravel\u5f00\u53d1\u73af\u5883 Hands-on\u6559\u7a0b\u3002<\/p>\n<h2>\u9879\u76ee\u7ec4\u6210<\/h2>\n<pre class=\"post-pre\"><code>.\r\n\u251c\u2500\u2500 infra\r\n\u2502   \u251c\u2500\u2500 echo-server\r\n\u2502   \u2502   \u2514\u2500\u2500Dockerfile\r\n\u2502   \u251c\u2500\u2500 mysql\r\n\u2502   \u2502   \u251c\u2500\u2500 Dockerfile\r\n\u2502   \u2502   \u2514\u2500\u2500 my.cnf\r\n\u2502   \u251c\u2500\u2500 nginx \r\n\u2502   \u2502   \u2514\u2500\u2500 default.conf\r\n\u2502   \u251c\u2500\u2500 php\r\n\u2502   \u2502   \u251c\u2500\u2500 Dockerfile (\u3053\u306e\u540d\u524d\u306b\u3059\u308b\u3068\u30d5\u30a1\u30a4\u30eb\u540d\u306e\u6307\u5b9a\u3092\u7701\u7565\u3067\u304d\u308b)\r\n\u2502   \u2502   \u2514\u2500\u2500 php.ini\r\n\u2502   \u2514\u2500\u2500 redis\r\n\u2502       \u2514\u2500\u2500 data(\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\u3067\u3059)\r\n\u251c\u2500\u2500 docker-compose.yml (\u3053\u306e\u540d\u524d\u306b\u3059\u308b\u3068\u30d5\u30a1\u30a4\u30eb\u540d\u306e\u6307\u5b9a\u3092\u7701\u7565\u3067\u304d\u308b)\r\n\u2514\u2500\u2500 backend\r\n    \u2514\u2500\u2500 Laravel\u3092\u30a4\u30f3\u30b9\u30c8\u30fc\u30eb\u3059\u308b\u30c7\u30a3\u30ec\u30af\u30c8\u30ea\r\n<\/code><\/pre>\n<h2>\u5404\u4e2a\u6587\u4ef6\u7684\u5185\u5bb9<\/h2>\n<pre class=\"post-pre\"><code><span class=\"na\">version<\/span><span class=\"pi\">:<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">3.9\"<\/span>\r\n<span class=\"na\">services<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">app<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.\/infra\/php<\/span>\r\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">.\/backend:\/work<\/span>\r\n  <span class=\"na\">web<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">nginx:1.20-alpine<\/span>\r\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">8080:80<\/span>\r\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">.\/backend:\/work<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">.\/infra\/nginx\/default.conf:\/etc\/nginx\/conf.d\/default.conf<\/span>\r\n    <span class=\"na\">working_dir<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/work<\/span>\r\n  <span class=\"na\">db<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.\/infra\/mysql<\/span>\r\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">33060:3306<\/span>\r\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">db-store:\/var\/lib\/mysql<\/span>\r\n  <span class=\"na\">echo-server<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">broadcast-echo-server<\/span>\r\n    <span class=\"na\">build<\/span><span class=\"pi\">:<\/span> <span class=\"s\">.\/infra\/echo-server<\/span>\r\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">6001:6001\"<\/span>\r\n    <span class=\"na\">command<\/span><span class=\"pi\">:<\/span> <span class=\"s\">laravel-echo-server start<\/span>\r\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"pi\">-<\/span> <span class=\"s\">.\/backend:\/work<\/span>\r\n    <span class=\"na\">working_dir<\/span><span class=\"pi\">:<\/span> <span class=\"s\">\/work<\/span>\r\n  <span class=\"na\">redis<\/span><span class=\"pi\">:<\/span>\r\n    <span class=\"na\">image<\/span><span class=\"pi\">:<\/span> <span class=\"s\">redis:latest<\/span>\r\n    <span class=\"na\">ports<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s\">6379:6379<\/span>\r\n    <span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n      <span class=\"pi\">-<\/span> <span class=\"s2\">\"<\/span><span class=\"s\">.\/infra\/redis\/data:\/data\"<\/span>\r\n<span class=\"na\">volumes<\/span><span class=\"pi\">:<\/span>\r\n  <span class=\"na\">db-store<\/span><span class=\"pi\">:<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">FROM<\/span><span class=\"s\"> node:13.8-alpine<\/span>\r\n<span class=\"k\">RUN <\/span>npm <span class=\"nb\">install<\/span> <span class=\"nt\">-g<\/span> laravel-echo-server\r\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/work<\/span>\r\n<span class=\"k\">CMD<\/span><span class=\"s\"> [\"laravel-echo-server\", \"start\"]<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">FROM<\/span><span class=\"s\"> mysql\/mysql-server:8.0<\/span>\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> MYSQL_DATABASE=laravel_local \\<\/span>\r\n  MYSQL_USER=phper \\\r\n  MYSQL_PASSWORD=secret \\\r\n  MYSQL_ROOT_PASSWORD=secret \\\r\n  TZ=Asia\/Tokyo\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> .\/my.cnf \/etc\/my.cnf<\/span>\r\n<span class=\"k\">RUN <\/span><span class=\"nb\">chmod <\/span>644 \/etc\/my.cnf\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code>[<span class=\"n\">mysqld<\/span>]\r\n<span class=\"c\"># default\r\n<\/span><span class=\"n\">skip<\/span>-<span class=\"n\">host<\/span>-<span class=\"n\">cache<\/span>\r\n<span class=\"n\">skip<\/span>-<span class=\"n\">name<\/span>-<span class=\"n\">resolve<\/span>\r\n<span class=\"n\">datadir<\/span>=\/<span class=\"n\">var<\/span>\/<span class=\"n\">lib<\/span>\/<span class=\"n\">mysql<\/span>\r\n<span class=\"n\">socket<\/span>=\/<span class=\"n\">var<\/span>\/<span class=\"n\">lib<\/span>\/<span class=\"n\">mysql<\/span>\/<span class=\"n\">mysql<\/span>.<span class=\"n\">sock<\/span>\r\n<span class=\"n\">secure<\/span>-<span class=\"n\">file<\/span>-<span class=\"n\">priv<\/span>=\/<span class=\"n\">var<\/span>\/<span class=\"n\">lib<\/span>\/<span class=\"n\">mysql<\/span>-<span class=\"n\">files<\/span>\r\n<span class=\"n\">user<\/span>=<span class=\"n\">mysql<\/span>\r\n<span class=\"n\">pid<\/span>-<span class=\"n\">file<\/span>=\/<span class=\"n\">var<\/span>\/<span class=\"n\">run<\/span>\/<span class=\"n\">mysqld<\/span>\/<span class=\"n\">mysqld<\/span>.<span class=\"n\">pid<\/span>\r\n<span class=\"c\"># character set \/ collation\r\n<\/span><span class=\"n\">character_set_server<\/span> = <span class=\"n\">utf8mb4<\/span>\r\n<span class=\"n\">collation_server<\/span> = <span class=\"n\">utf8mb4_ja_0900_as_cs_ks<\/span>\r\n<span class=\"c\"># timezone\r\n<\/span><span class=\"n\">default<\/span>-<span class=\"n\">time<\/span>-<span class=\"n\">zone<\/span> = <span class=\"n\">SYSTEM<\/span>\r\n<span class=\"n\">log_timestamps<\/span> = <span class=\"n\">SYSTEM<\/span>\r\n<span class=\"c\"># Error Log\r\n<\/span><span class=\"n\">log<\/span>-<span class=\"n\">error<\/span> = <span class=\"n\">mysql<\/span>-<span class=\"n\">error<\/span>.<span class=\"n\">log<\/span>\r\n<span class=\"c\"># Slow Query Log\r\n<\/span><span class=\"n\">slow_query_log<\/span> = <span class=\"m\">1<\/span>\r\n<span class=\"n\">slow_query_log_file<\/span> = <span class=\"n\">mysql<\/span>-<span class=\"n\">slow<\/span>.<span class=\"n\">log<\/span>\r\n<span class=\"n\">long_query_time<\/span> = <span class=\"m\">1<\/span>.<span class=\"m\">0<\/span>\r\n<span class=\"n\">log_queries_not_using_indexes<\/span> = <span class=\"m\">0<\/span>\r\n<span class=\"c\"># General Log\r\n<\/span><span class=\"n\">general_log<\/span> = <span class=\"m\">1<\/span>\r\n<span class=\"n\">general_log_file<\/span> = <span class=\"n\">mysql<\/span>-<span class=\"n\">general<\/span>.<span class=\"n\">log<\/span>\r\n[<span class=\"n\">mysql<\/span>]\r\n<span class=\"n\">default<\/span>-<span class=\"n\">character<\/span>-<span class=\"n\">set<\/span> = <span class=\"n\">utf8mb4<\/span>\r\n[<span class=\"n\">client<\/span>]\r\n<span class=\"n\">default<\/span>-<span class=\"n\">character<\/span>-<span class=\"n\">set<\/span> = <span class=\"n\">utf8mb4<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"n\">server<\/span> {\r\n    <span class=\"n\">listen<\/span> <span class=\"m\">80<\/span>;\r\n    <span class=\"n\">server_name<\/span> <span class=\"n\">example<\/span>.<span class=\"n\">com<\/span>;\r\n    <span class=\"n\">root<\/span> \/<span class=\"n\">work<\/span>\/<span class=\"n\">public<\/span>;\r\n    <span class=\"n\">add_header<\/span> <span class=\"n\">X<\/span>-<span class=\"n\">Frame<\/span>-<span class=\"n\">Options<\/span> <span class=\"s2\">\"SAMEORIGIN\"<\/span>;\r\n    <span class=\"n\">add_header<\/span> <span class=\"n\">X<\/span>-<span class=\"n\">XSS<\/span>-<span class=\"n\">Protection<\/span> <span class=\"s2\">\"1; mode=block\"<\/span>;\r\n    <span class=\"n\">add_header<\/span> <span class=\"n\">X<\/span>-<span class=\"n\">Content<\/span>-<span class=\"n\">Type<\/span>-<span class=\"n\">Options<\/span> <span class=\"s2\">\"nosniff\"<\/span>;\r\n    <span class=\"n\">index<\/span> <span class=\"n\">index<\/span>.<span class=\"n\">php<\/span>;\r\n    <span class=\"n\">charset<\/span> <span class=\"n\">utf<\/span>-<span class=\"m\">8<\/span>;\r\n    <span class=\"n\">location<\/span> \/ {\r\n        <span class=\"n\">try_files<\/span> $<span class=\"n\">uri<\/span> $<span class=\"n\">uri<\/span>\/ \/<span class=\"n\">index<\/span>.<span class=\"n\">php<\/span>?$<span class=\"n\">query_string<\/span>;\r\n    }\r\n    <span class=\"n\">location<\/span> = \/<span class=\"n\">favicon<\/span>.<span class=\"n\">ico<\/span> { <span class=\"n\">access_log<\/span> <span class=\"n\">off<\/span>; <span class=\"n\">log_not_found<\/span> <span class=\"n\">off<\/span>; }\r\n    <span class=\"n\">location<\/span> = \/<span class=\"n\">robots<\/span>.<span class=\"n\">txt<\/span>  { <span class=\"n\">access_log<\/span> <span class=\"n\">off<\/span>; <span class=\"n\">log_not_found<\/span> <span class=\"n\">off<\/span>; }\r\n    <span class=\"n\">error_page<\/span> <span class=\"m\">404<\/span> \/<span class=\"n\">index<\/span>.<span class=\"n\">php<\/span>;\r\n\r\n    <span class=\"n\">location<\/span> ~ \\.<span class=\"n\">php<\/span>$ {\r\n        <span class=\"n\">fastcgi_pass<\/span> <span class=\"n\">app<\/span>:<span class=\"m\">9000<\/span>;\r\n        <span class=\"n\">fastcgi_param<\/span> <span class=\"n\">SCRIPT_FILENAME<\/span> $<span class=\"n\">realpath_root<\/span>$<span class=\"n\">fastcgi_script_name<\/span>;\r\n        <span class=\"n\">include<\/span> <span class=\"n\">fastcgi_params<\/span>;\r\n    }\r\n    <span class=\"n\">location<\/span> ~ \/\\.(?!<span class=\"n\">well<\/span>-<span class=\"n\">known<\/span>).* {\r\n        <span class=\"n\">deny<\/span> <span class=\"n\">all<\/span>;\r\n    }\r\n}\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"k\">FROM<\/span><span class=\"s\"> php:8.0-fpm-buster<\/span>\r\n<span class=\"k\">SHELL<\/span><span class=\"s\"> [\"\/bin\/bash\", \"-oeux\", \"pipefail\", \"-c\"]<\/span>\r\n<span class=\"k\">ENV<\/span><span class=\"s\"> COMPOSER_ALLOW_SUPERUSER=1 \\<\/span>\r\n  COMPOSER_HOME=\/composer\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> --from=composer:2.0 \/usr\/bin\/composer \/usr\/bin\/composer<\/span>\r\n<span class=\"k\">RUN <\/span>apt-get update <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\\r\n<\/span>  apt-get <span class=\"nt\">-y<\/span> <span class=\"nb\">install <\/span>git unzip libzip-dev libicu-dev libonig-dev <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\\r\n<\/span>  apt-get clean <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\\r\n<\/span>  <span class=\"nb\">rm<\/span> <span class=\"nt\">-rf<\/span> \/var\/lib\/apt\/lists\/<span class=\"k\">*<\/span> <span class=\"o\">&amp;&amp;<\/span> <span class=\"se\">\\\r\n<\/span>  docker-php-ext-install intl pdo_mysql zip bcmath\r\n<span class=\"k\">COPY<\/span><span class=\"s\"> .\/php.ini \/usr\/local\/etc\/php\/php.ini<\/span>\r\n<span class=\"k\">RUN <\/span>curl <span class=\"nt\">-sL<\/span> https:\/\/deb.nodesource.com\/setup_14.x | bash -\r\n<span class=\"k\">RUN <\/span>apt-get <span class=\"nb\">install<\/span> <span class=\"nt\">-y<\/span> nodejs\r\n<span class=\"k\">RUN <\/span>npm <span class=\"nb\">install <\/span>npm@latest <span class=\"nt\">-g<\/span>\r\n<span class=\"k\">WORKDIR<\/span><span class=\"s\"> \/work<\/span>\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"py\">zend.exception_ignore_args<\/span> <span class=\"p\">=<\/span> <span class=\"s\">off<\/span>\r\n<span class=\"py\">expose_php<\/span> <span class=\"p\">=<\/span> <span class=\"s\">on<\/span>\r\n<span class=\"py\">max_execution_time<\/span> <span class=\"p\">=<\/span> <span class=\"s\">30<\/span>\r\n<span class=\"py\">max_input_vars<\/span> <span class=\"p\">=<\/span> <span class=\"s\">1000<\/span>\r\n<span class=\"py\">upload_max_filesize<\/span> <span class=\"p\">=<\/span> <span class=\"s\">64M<\/span>\r\n<span class=\"py\">post_max_size<\/span> <span class=\"p\">=<\/span> <span class=\"s\">128M<\/span>\r\n<span class=\"py\">memory_limit<\/span> <span class=\"p\">=<\/span> <span class=\"s\">256M<\/span>\r\n<span class=\"py\">error_reporting<\/span> <span class=\"p\">=<\/span> <span class=\"s\">E_ALL<\/span>\r\n<span class=\"py\">display_errors<\/span> <span class=\"p\">=<\/span> <span class=\"s\">on<\/span>\r\n<span class=\"py\">display_startup_errors<\/span> <span class=\"p\">=<\/span> <span class=\"s\">on<\/span>\r\n<span class=\"py\">log_errors<\/span> <span class=\"p\">=<\/span> <span class=\"s\">on<\/span>\r\n<span class=\"py\">error_log<\/span> <span class=\"p\">=<\/span> <span class=\"s\">\/dev\/stderr<\/span>\r\n<span class=\"py\">default_charset<\/span> <span class=\"p\">=<\/span> <span class=\"s\">UTF-8<\/span>\r\n<span class=\"nn\">[Date]<\/span>\r\n<span class=\"py\">date.timezone<\/span> <span class=\"p\">=<\/span> <span class=\"s\">Asia\/Tokyo<\/span>\r\n<span class=\"nn\">[mysqlnd]<\/span>\r\n<span class=\"py\">mysqlnd.collect_memory_statistics<\/span> <span class=\"p\">=<\/span> <span class=\"s\">on<\/span>\r\n<span class=\"nn\">[Assertion]<\/span>\r\n<span class=\"py\">zend.assertions<\/span> <span class=\"p\">=<\/span> <span class=\"s\">1<\/span>\r\n<span class=\"nn\">[mbstring]<\/span>\r\n<span class=\"py\">mbstring.language<\/span> <span class=\"p\">=<\/span> <span class=\"s\">Japanese<\/span>\r\n<\/code><\/pre>\n<h1>\u5b89\u88c5Laravel<\/h1>\n<p>\u5728\u542f\u52a8Docker\u5bb9\u5668\u4e4b\u540e\uff0c\u5b89\u88c5Laravel\u3002\u4eceLaravel\u7684\u5b89\u88c5\u5230\u73af\u5883\u914d\u7f6e\uff0c\u53ef\u4ee5\u53c2\u8003\u4e0b\u65b9\u94fe\u63a5\u7684\u6587\u7ae0\uff0c\u91c7\u7528\u76f8\u540c\u7684\u6b65\u9aa4\u8fdb\u884c\u64cd\u4f5c\u3002<br \/>\n\u8bf7\u53c2\u8003\u3010\u8d85\u5165\u95e8\u3011Docker\u624b\u52a8\u6559\u7a0b\uff1a\u572820\u5206\u949f\u5185\u5feb\u901f\u6784\u5efaLaravel\u5f00\u53d1\u73af\u5883\u3002<\/p>\n<h1>Laravel-echo-server\u7684\u914d\u7f6e<\/h1>\n<p>\u5728\u521d\u6b21\u542f\u52a8\u5bb9\u5668\u65f6\uff0c\u7531\u4e8eLaravel-echo-server\u7684\u521d\u59cb\u8bbe\u7f6e\u5c1a\u672a\u5b8c\u6210\uff0c\u4f1a\u5bfc\u81f4\u9519\u8bef\u53d1\u751f\uff0c\u56e0\u6b64\u9700\u8981\u8fdb\u884c\u521d\u59cb\u8bbe\u7f6e\u3002<\/p>\n<pre class=\"post-pre\"><code>$ docker compose run echo-server laravel-echo-server init\r\n? Do you want to run this server in development mode? Yes\r\n? Which port would you like to serve from? 6001\r\n? Which database would you like to use to store presence channel members? redis\r\n? Enter the host of your Laravel authentication server. https:\/\/localhost\r\n? Will you be serving on http or https? http\r\n? Do you want to generate a client ID\/Key for HTTP API? No\r\n? Do you want to setup cross domain access to the API? No\r\n? What do you want this config to be saved as? laravel-echo-server.json\r\nConfiguration file saved. Run laravel-echo-server start to run server.\r\n<\/code><\/pre>\n<p>\u5f53\u6267\u884c\u4e0a\u8ff0\u64cd\u4f5c\u540e\uff0c\u4f1a\u5728Laravel \u9879\u76ee\u6839\u76ee\u5f55\u4e0b\u521b\u5efa\u4e00\u4e2a\u540d\u4e3a laravel-echo-server.json \u7684\u6587\u4ef6\uff0c\u968f\u540e\u6309\u7167\u4ee5\u4e0b\u65b9\u5f0f\u8fdb\u884c\u4fee\u6539\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"p\">{<\/span>\r\n    <span class=\"nl\">\"authHost\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"http:\/\/localhost\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"authEndpoint\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"\/broadcasting\/auth\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"clients\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[],<\/span>\r\n    <span class=\"nl\">\"database\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"redis\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"databaseConfig\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nl\">\"redis\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"nl\">\"host\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"redis\"<\/span><span class=\"p\">,<\/span>\r\n            <span class=\"nl\">\"port\"<\/span><span class=\"p\">:<\/span> <span class=\"mi\">6379<\/span>\r\n        <span class=\"p\">},<\/span>\r\n        <span class=\"nl\">\"sqlite\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n            <span class=\"nl\">\"databasePath\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"\/database\/laravel-echo-server.sqlite\"<\/span>\r\n        <span class=\"p\">}<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"nl\">\"devMode\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"host\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">null<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"port\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"6001\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"protocol\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"http\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"socketio\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{},<\/span>\r\n    <span class=\"nl\">\"secureOptions\"<\/span><span class=\"p\">:<\/span> <span class=\"mi\">67108864<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"sslCertPath\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"sslKeyPath\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"sslCertChainPath\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"sslPassphrase\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"subscribers\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nl\">\"http\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"nl\">\"redis\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">true<\/span>\r\n    <span class=\"p\">},<\/span>\r\n    <span class=\"nl\">\"apiOriginAllow\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n        <span class=\"nl\">\"allowCors\"<\/span><span class=\"p\">:<\/span> <span class=\"kc\">false<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"nl\">\"allowOrigin\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"nl\">\"allowMethods\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"\"<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"nl\">\"allowHeaders\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"\"<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h1>\u6dfb\u52a0\u6240\u9700\u7684\u5e93<\/h1>\n<pre class=\"post-pre\"><code><span class=\"nl\">\"require\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"err\">\/\/<\/span> <span class=\"err\">\u4ed6\u7701\u7565<\/span>\r\n    <span class=\"nl\">\"predis\/predis\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"^1.1\"<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"nl\">\"dependencies\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">{<\/span>\r\n<span class=\"err\">\u3000\u3000\u3000\u3000\u3000\u3000\u3000\u3000\/\/<\/span> <span class=\"err\">\u4ed6\u7701\u7565<\/span>\r\n    <span class=\"nl\">\"laravel-echo\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"^1.11.1\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"laravel-echo-server\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"^1.6.2\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"socket.io\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"^2.4.0\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"nl\">\"socket.io-client\"<\/span><span class=\"p\">:<\/span> <span class=\"s2\">\"^2.4.0\"<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">}<\/span>\r\n<\/code><\/pre>\n<h1>\u6240\u6709\u7684\u8bbe\u7f6e<\/h1>\n<h3>\u914d\u7f6e\u63d0\u4f9b\u5546<\/h3>\n<p>\u53d6\u6d88app\/config\/app.php\u6587\u4ef6\u4e2d\u4ee5\u4e0b\u90e8\u5206\u7684\u6ce8\u91ca\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nc\">App\\Providers\\BroadcastServiceProvider<\/span><span class=\"o\">::<\/span><span class=\"n\">class<\/span><span class=\"p\">,<\/span>\r\n<\/code><\/pre>\n<h3>Redis\u7684\u914d\u7f6e<\/h3>\n<pre class=\"post-pre\"><code><span class=\"s1\">'redis'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">[<\/span>\r\n        <span class=\"s1\">'client'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">env<\/span><span class=\"p\">(<\/span><span class=\"s1\">'REDIS_CLIENT'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'predis'<\/span><span class=\"p\">),<\/span>\r\n        <span class=\"s1\">'default'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">[<\/span>\r\n            <span class=\"s1\">'host'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">env<\/span><span class=\"p\">(<\/span><span class=\"s1\">'REDIS_HOST'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'127.0.0.1'<\/span><span class=\"p\">),<\/span>\r\n            <span class=\"s1\">'password'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">env<\/span><span class=\"p\">(<\/span><span class=\"s1\">'REDIS_PASSWORD'<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span><span class=\"p\">),<\/span>\r\n            <span class=\"s1\">'port'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">env<\/span><span class=\"p\">(<\/span><span class=\"s1\">'REDIS_PORT'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">6379<\/span><span class=\"p\">),<\/span>\r\n            <span class=\"s1\">'database'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"mi\">0<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"p\">],<\/span>\r\n        <span class=\"s1\">'cache'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">[<\/span>\r\n            <span class=\"s1\">'host'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">env<\/span><span class=\"p\">(<\/span><span class=\"s1\">'REDIS_HOST'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">'127.0.0.1'<\/span><span class=\"p\">),<\/span>\r\n            <span class=\"s1\">'password'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">env<\/span><span class=\"p\">(<\/span><span class=\"s1\">'REDIS_PASSWORD'<\/span><span class=\"p\">,<\/span> <span class=\"kc\">null<\/span><span class=\"p\">),<\/span>\r\n            <span class=\"s1\">'port'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">env<\/span><span class=\"p\">(<\/span><span class=\"s1\">'REDIS_PORT'<\/span><span class=\"p\">,<\/span> <span class=\"mi\">6379<\/span><span class=\"p\">),<\/span>\r\n            <span class=\"s1\">'database'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"mi\">1<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"p\">],<\/span>\r\n        <span class=\"s1\">'options'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">[<\/span>\r\n            <span class=\"s1\">'prefix'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"nf\">env<\/span><span class=\"p\">(<\/span><span class=\"s1\">'REDIS_PREFIX'<\/span><span class=\"p\">,<\/span> <span class=\"s1\">''<\/span><span class=\"p\">),<\/span>\r\n        <span class=\"p\">],<\/span>\r\n    <span class=\"p\">],<\/span>\r\n<\/code><\/pre>\n<h3>\u66f4\u6539.env\u6587\u4ef6<\/h3>\n<pre class=\"post-pre\"><code>BROADCAST_DRIVER=redis\r\nQUEUE_CONNECTION=redis\r\nREDIS_HOST=redis\r\nREDIS_CLIENT=predis\r\nREDIS_PASSWORD=null\r\nREDIS_PORT=6379\r\nREDIS_PREFIX=\"\"\r\n<\/code><\/pre>\n<p>\u5728\u8fd9\u4e00\u70b9\u4e0a\uff0c\u6211\u4eec\u5df2\u7ecf\u80fd\u591f\u901a\u8fc7WebSocket\u8fdb\u884c\u5b9e\u65f6\u901a\u4fe1\u3002<\/p>\n<h1>\u4eb2\u81ea\u8bd5\u8bd5\u770b<\/h1>\n<p>\u4f7f\u7528Laravel\u7684\u4e8b\u4ef6\u529f\u80fd\uff0c\u53ef\u4ee5\u5c06\u6570\u636e\u5b9e\u65f6\u53d1\u9001\u5230\u5ba2\u6237\u7aef\u3002<\/p>\n<h2>\u670d\u52a1\u5668\u7aef\u7684\u51c6\u5907\u5de5\u4f5c<\/h2>\n<h3>\u521b\u5efa\u6d3b\u52a8<\/h3>\n<pre class=\"post-pre\"><code>php artisan make:event MessageRecieved\r\n<\/code><\/pre>\n<pre class=\"post-pre\"><code><span class=\"cp\">&lt;?php<\/span>\r\n\r\n<span class=\"kn\">namespace<\/span> <span class=\"nn\">App\\Events<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kn\">use<\/span> <span class=\"nc\">Illuminate\\Broadcasting\\Channel<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">use<\/span> <span class=\"nc\">Illuminate\\Broadcasting\\InteractsWithSockets<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">use<\/span> <span class=\"nc\">Illuminate\\Contracts\\Broadcasting\\ShouldBroadcast<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">use<\/span> <span class=\"nc\">Illuminate\\Foundation\\Events\\Dispatchable<\/span><span class=\"p\">;<\/span>\r\n<span class=\"kn\">use<\/span> <span class=\"nc\">Illuminate\\Queue\\SerializesModels<\/span><span class=\"p\">;<\/span>\r\n\r\n<span class=\"kd\">class<\/span> <span class=\"nc\">MessageReceived<\/span> <span class=\"kd\">implements<\/span> <span class=\"nc\">ShouldBroadcast<\/span>\r\n<span class=\"p\">{<\/span>\r\n    <span class=\"kn\">use<\/span> <span class=\"nc\">Dispatchable<\/span><span class=\"p\">,<\/span> <span class=\"nc\">InteractsWithSockets<\/span><span class=\"p\">,<\/span> <span class=\"nc\">SerializesModels<\/span><span class=\"p\">;<\/span>\r\n\r\n\r\n    <span class=\"cd\">\/**\r\n     * Get the channels the event should broadcast on.\r\n     *\r\n     * @return \\Illuminate\\Broadcasting\\Channel|array\r\n     *\/<\/span>\r\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">broadcastOn<\/span><span class=\"p\">()<\/span>\r\n    <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"k\">new<\/span> <span class=\"nc\">Channel<\/span><span class=\"p\">(<\/span><span class=\"s1\">'test'<\/span><span class=\"p\">);<\/span>\r\n    <span class=\"p\">}<\/span>\r\n\r\n    <span class=\"k\">public<\/span> <span class=\"k\">function<\/span> <span class=\"n\">broadcastWith<\/span><span class=\"p\">()<\/span>\r\n    <span class=\"p\">{<\/span>\r\n        <span class=\"k\">return<\/span> <span class=\"p\">[<\/span>\r\n            <span class=\"s1\">'data'<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"s1\">'test'<\/span><span class=\"p\">,<\/span>\r\n        <span class=\"p\">];<\/span>\r\n    <span class=\"p\">}<\/span>\r\n<span class=\"p\">}<\/span>\r\n\r\n<\/code><\/pre>\n<h3>\u6d3b\u52a8\u51c6\u5907\u5f15\u53d1<\/h3>\n<p>\u5f53\u6211\u4eec\u8bbf\u95ee\u8be5\u8def\u5f84\u65f6\uff0c\u5c06\u89e6\u53d1\u4e00\u4e2a\u4e8b\u4ef6\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"nc\">Route<\/span><span class=\"o\">::<\/span><span class=\"nf\">get<\/span><span class=\"p\">(<\/span><span class=\"s1\">'\/'<\/span><span class=\"p\">,<\/span> <span class=\"k\">function<\/span> <span class=\"p\">()<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nf\">event<\/span><span class=\"p\">(<\/span><span class=\"k\">new<\/span> <span class=\"err\">\\<\/span><span class=\"nf\">App\\Events\\MessageReceived<\/span><span class=\"p\">());<\/span>\r\n    <span class=\"k\">return<\/span> <span class=\"nf\">view<\/span><span class=\"p\">(<\/span><span class=\"s1\">'welcome'<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">});<\/span>\r\n<\/code><\/pre>\n<h3>\u5de5\u4f5c\u4eba\u5458\u7684\u542f\u52a8<\/h3>\n<p>\u7531\u4e8e\u4f7f\u7528Redis\u8fdb\u884c\u5904\u7406\uff0c\u56e0\u6b64\u9700\u8981\u542f\u52a8\u5de5\u4f5c\u8fdb\u7a0b\u6765\u6267\u884c\u4efb\u52a1\u3002<\/p>\n<pre class=\"post-pre\"><code>php artisan queue:work\r\n<\/code><\/pre>\n<h2>\u5ba2\u6237\u7aef\u51c6\u5907\u5de5\u4f5c<\/h2>\n<h3>\u51c6\u5907\u89c6\u56fe<\/h3>\n<p>\u4ee5\u4e0b\u662f\u5728\u8def\u7531\u4e2d\u663e\u793a\u7684\u89c6\u56fe\u65b9\u5f0f\uff1a<\/p>\n<pre class=\"post-pre\"><code><span class=\"o\">&lt;!<\/span><span class=\"no\">DOCTYPE<\/span> <span class=\"n\">html<\/span><span class=\"o\">&gt;<\/span>\r\n<span class=\"o\">&lt;<\/span><span class=\"n\">html<\/span> <span class=\"n\">lang<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"ja\"<\/span><span class=\"o\">&gt;<\/span>\r\n<span class=\"o\">&lt;<\/span><span class=\"n\">head<\/span><span class=\"o\">&gt;<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"n\">meta<\/span> <span class=\"n\">charset<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"UTF-8\"<\/span><span class=\"o\">&gt;<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"n\">meta<\/span> <span class=\"n\">name<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"csrf-token\"<\/span> <span class=\"n\">content<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"{{ csrf_token() }}\"<\/span><span class=\"o\">&gt;<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"n\">title<\/span><span class=\"o\">&gt;<\/span><span class=\"nc\">Laravel<\/span><span class=\"o\">&lt;\/<\/span><span class=\"n\">title<\/span><span class=\"o\">&gt;<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"n\">link<\/span> <span class=\"n\">rel<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"stylesheet\"<\/span> <span class=\"n\">href<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"{{ mix('css\/app.css') }}\"<\/span><span class=\"o\">&gt;<\/span>\r\n<span class=\"o\">&lt;\/<\/span><span class=\"n\">head<\/span><span class=\"o\">&gt;<\/span>\r\n<span class=\"o\">&lt;<\/span><span class=\"n\">body<\/span><span class=\"o\">&gt;<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"n\">div<\/span> <span class=\"n\">id<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"app\"<\/span><span class=\"o\">&gt;<\/span>\r\n      <span class=\"n\">test<\/span>\r\n    <span class=\"o\">&lt;\/<\/span><span class=\"n\">div<\/span><span class=\"o\">&gt;<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"n\">script<\/span> <span class=\"n\">src<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"{{ mix('js\/app.js') }}\"<\/span><span class=\"o\">&gt;&lt;\/<\/span><span class=\"n\">script<\/span><span class=\"o\">&gt;<\/span>\r\n    <span class=\"o\">&lt;<\/span><span class=\"n\">script<\/span> <span class=\"n\">src<\/span><span class=\"o\">=<\/span><span class=\"s2\">\"http:\/\/{{ Request::getHost() }}:6001\/socket.io\/socket.io.js\"<\/span><span class=\"o\">&gt;&lt;\/<\/span><span class=\"n\">script<\/span><span class=\"o\">&gt;<\/span>\r\n<span class=\"o\">&lt;\/<\/span><span class=\"n\">body<\/span><span class=\"o\">&gt;<\/span>\r\n<span class=\"o\">&lt;\/<\/span><span class=\"n\">html<\/span><span class=\"o\">&gt;<\/span>\r\n<\/code><\/pre>\n<h3>\u811a\u672c\u51c6\u5907\u5b8c\u6bd5<\/h3>\n<p>\u5728 bootstrap.js \u4e2d\u6dfb\u52a0\u4ee5\u4e0b\u5185\u5bb9\u3002<\/p>\n<pre class=\"post-pre\"><code><span class=\"k\">import<\/span> <span class=\"nx\">Echo<\/span> <span class=\"k\">from<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">laravel-echo<\/span><span class=\"dl\">\"<\/span><span class=\"p\">;<\/span>\r\n<span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">io<\/span> <span class=\"o\">=<\/span> <span class=\"nx\">require<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">socket.io-client<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\r\n<span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">Echo<\/span> <span class=\"o\">=<\/span> <span class=\"k\">new<\/span> <span class=\"nx\">Echo<\/span><span class=\"p\">({<\/span>\r\n    <span class=\"na\">broadcaster<\/span><span class=\"p\">:<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">socket.io<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n    <span class=\"na\">host<\/span><span class=\"p\">:<\/span> <span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">location<\/span><span class=\"p\">.<\/span><span class=\"nx\">hostname<\/span> <span class=\"o\">+<\/span> <span class=\"dl\">\"<\/span><span class=\"s2\">:6001<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span>\r\n<span class=\"p\">});<\/span>\r\n\r\n<span class=\"nb\">window<\/span><span class=\"p\">.<\/span><span class=\"nx\">Echo<\/span><span class=\"p\">.<\/span><span class=\"nx\">channel<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">test<\/span><span class=\"dl\">\"<\/span><span class=\"p\">).<\/span><span class=\"nx\">listen<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">MessageReceived<\/span><span class=\"dl\">\"<\/span><span class=\"p\">,<\/span> <span class=\"nx\">e<\/span> <span class=\"o\">=&gt;<\/span> <span class=\"p\">{<\/span>\r\n    <span class=\"nx\">console<\/span><span class=\"p\">.<\/span><span class=\"nx\">log<\/span><span class=\"p\">(<\/span><span class=\"dl\">\"<\/span><span class=\"s2\">\u30e1\u30c3\u30bb\u30fc\u30b8\u53d7\u3051\u53d6\u308a\u6210\u529f\uff01\uff01\uff01<\/span><span class=\"dl\">\"<\/span><span class=\"p\">);<\/span>\r\n<span class=\"p\">});<\/span>\r\n<\/code><\/pre>\n<h3>\u7f16\u8bd1<\/h3>\n<pre class=\"post-pre\"><code>npm install &amp;&amp; npm run dev\r\n<\/code><\/pre>\n<h2>\u8fdb\u884c<\/h2>\n<div><img decoding=\"async\" class=\"post-images\" title=\"\" src=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d1c5a37434c4406c10881\/57-0.png\" alt=\"\u30b9\u30af\u30ea\u30fc\u30f3\u30b7\u30e7\u30c3\u30c8 2021-08-18 23.26.36.png\" \/><\/div>\n<h2>\u52d5\u304b\u306a\u3044\u3068\u304d<\/h2>\n<p>\u5982\u679c\u91cd\u65b0\u542f\u52a8Docker\u53ef\u4ee5\u89e3\u51b3\u95ee\u9898\uff0c\u90a3\u4e48\u53ef\u4ee5\u5c1d\u8bd5\u8fd9\u4e2a\u65b9\u6cd5\u3002<br \/>\n\u5982\u679c\u95ee\u9898\u4ecd\u7136\u5b58\u5728\uff0c\u5219\u5e94\u68c0\u67e5Docker\u7684\u65e5\u5fd7\u4fe1\u606f\u3002<\/p>\n<pre class=\"post-pre\"><code>docker compose logs\r\n<\/code><\/pre>\n<h1>\u6700\u540e<\/h1>\n<p>\u8fd9\u6b21\u4e3a\u4e86\u65b9\u4fbf\u8d77\u89c1\u6211\u9009\u62e9\u76f4\u63a5\u7c98\u8d34\u4ee3\u7801\u4f5c\u4e3a\u5907\u5fd8\u5f55\u3002\u987a\u4fbf\u4e00\u63d0\uff0c\u5982\u679c\u4f7f\u7528Pusher\u8fd9\u4e2a\u670d\u52a1\uff0c\u5b9e\u73b0\u5b9e\u65f6\u901a\u4fe1\u975e\u5e38\u7b80\u5355\u3002\u8fd9\u5728Laravel\u7684\u5b98\u65b9\u6587\u6863\u4e2d\u4e5f\u6709\u8bf4\u660e\uff0c\u5982\u679c\u4f60\u611f\u5174\u8da3\u7684\u8bdd\u4e00\u5b9a\u8981\u67e5\u770b\u4e00\u4e0b\u3002<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u9996\u5148 \u5728Google\u4e0a\u641c\u7d22\u65f6\uff0c\u6211\u627e\u5230\u4e86\u5f88\u591a\u5173\u4e8e\u4f7f\u7528Laravel\u548cRedis\u8fdb\u884cWebSocket\u901a\u4fe1\u7684\u5b98\u65b9\u6587 [&hellip;]<\/p>\n","protected":false},"author":4,"featured_media":0,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1],"tags":[],"class_list":["post-34338","post","type-post","status-publish","format-standard","hentry","category-uncategorized"],"yoast_head":"<!-- This site is optimized with the Yoast SEO Premium plugin v21.5 (Yoast SEO v21.5) - https:\/\/yoast.com\/wordpress\/plugins\/seo\/ -->\n<title>\u4f7f\u7528Docker\u3001Laravel\u3001Redis\u548cLaravel Echo\u5b9e\u73b0\u5b9e\u65f6\u901a\u4fe1 - Blog - Silicon Cloud<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528docker\u3001laravel\u3001redis\u548claravel-echo\u5b9e\u73b0\u5b9e\u65f6\u901a\u4fe1\/\" \/>\n<meta property=\"og:locale\" content=\"zh_CN\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"\u4f7f\u7528Docker\u3001Laravel\u3001Redis\u548cLaravel Echo\u5b9e\u73b0\u5b9e\u65f6\u901a\u4fe1\" \/>\n<meta property=\"og:description\" content=\"\u9996\u5148 \u5728Google\u4e0a\u641c\u7d22\u65f6\uff0c\u6211\u627e\u5230\u4e86\u5f88\u591a\u5173\u4e8e\u4f7f\u7528Laravel\u548cRedis\u8fdb\u884cWebSocket\u901a\u4fe1\u7684\u5b98\u65b9\u6587 [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528docker\u3001laravel\u3001redis\u548claravel-echo\u5b9e\u73b0\u5b9e\u65f6\u901a\u4fe1\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog - Silicon Cloud\" \/>\n<meta property=\"article:published_time\" content=\"2023-06-18T00:10:02+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2024-04-29T22:34:56+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d1c5a37434c4406c10881\/57-0.png\" \/>\n<meta name=\"author\" content=\"\u79d1, \u96c5\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"\u4f5c\u8005\" \/>\n\t<meta name=\"twitter:data1\" content=\"\u79d1, \u96c5\" \/>\n\t<meta name=\"twitter:label2\" content=\"\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4\" \/>\n\t<meta name=\"twitter:data2\" content=\"5 \u5206\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\/\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8docker%e3%80%81laravel%e3%80%81redis%e5%92%8claravel-echo%e5%ae%9e%e7%8e%b0%e5%ae%9e%e6%97%b6%e9%80%9a%e4%bf%a1\/\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8docker%e3%80%81laravel%e3%80%81redis%e5%92%8claravel-echo%e5%ae%9e%e7%8e%b0%e5%ae%9e%e6%97%b6%e9%80%9a%e4%bf%a1\/\",\"name\":\"\u4f7f\u7528Docker\u3001Laravel\u3001Redis\u548cLaravel Echo\u5b9e\u73b0\u5b9e\u65f6\u901a\u4fe1 - Blog - Silicon Cloud\",\"isPartOf\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\"},\"datePublished\":\"2023-06-18T00:10:02+00:00\",\"dateModified\":\"2024-04-29T22:34:56+00:00\",\"author\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\"},\"breadcrumb\":{\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8docker%e3%80%81laravel%e3%80%81redis%e5%92%8claravel-echo%e5%ae%9e%e7%8e%b0%e5%ae%9e%e6%97%b6%e9%80%9a%e4%bf%a1\/#breadcrumb\"},\"inLanguage\":\"zh-Hans\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8docker%e3%80%81laravel%e3%80%81redis%e5%92%8claravel-echo%e5%ae%9e%e7%8e%b0%e5%ae%9e%e6%97%b6%e9%80%9a%e4%bf%a1\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8docker%e3%80%81laravel%e3%80%81redis%e5%92%8claravel-echo%e5%ae%9e%e7%8e%b0%e5%ae%9e%e6%97%b6%e9%80%9a%e4%bf%a1\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"\u9996\u9875\",\"item\":\"https:\/\/www.silicloud.com\/zh\/blog\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"\u4f7f\u7528Docker\u3001Laravel\u3001Redis\u548cLaravel Echo\u5b9e\u73b0\u5b9e\u65f6\u901a\u4fe1\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#website\",\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/\",\"name\":\"Blog - Silicon Cloud\",\"description\":\"\",\"inLanguage\":\"zh-Hans\"},{\"@type\":\"Person\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a\",\"name\":\"\u79d1, \u96c5\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/\",\"url\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"contentUrl\":\"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g\",\"caption\":\"\u79d1, \u96c5\"},\"url\":\"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/\"},{\"@type\":\"ImageObject\",\"inLanguage\":\"zh-Hans\",\"@id\":\"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8docker%e3%80%81laravel%e3%80%81redis%e5%92%8claravel-echo%e5%ae%9e%e7%8e%b0%e5%ae%9e%e6%97%b6%e9%80%9a%e4%bf%a1\/#local-main-organization-logo\",\"url\":\"\",\"contentUrl\":\"\",\"caption\":\"Blog - Silicon Cloud\"}]}<\/script>\n<!-- \/ Yoast SEO Premium plugin. -->","yoast_head_json":{"title":"\u4f7f\u7528Docker\u3001Laravel\u3001Redis\u548cLaravel Echo\u5b9e\u73b0\u5b9e\u65f6\u901a\u4fe1 - Blog - Silicon Cloud","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528docker\u3001laravel\u3001redis\u548claravel-echo\u5b9e\u73b0\u5b9e\u65f6\u901a\u4fe1\/","og_locale":"zh_CN","og_type":"article","og_title":"\u4f7f\u7528Docker\u3001Laravel\u3001Redis\u548cLaravel Echo\u5b9e\u73b0\u5b9e\u65f6\u901a\u4fe1","og_description":"\u9996\u5148 \u5728Google\u4e0a\u641c\u7d22\u65f6\uff0c\u6211\u627e\u5230\u4e86\u5f88\u591a\u5173\u4e8e\u4f7f\u7528Laravel\u548cRedis\u8fdb\u884cWebSocket\u901a\u4fe1\u7684\u5b98\u65b9\u6587 [&hellip;]","og_url":"https:\/\/www.silicloud.com\/zh\/blog\/\u4f7f\u7528docker\u3001laravel\u3001redis\u548claravel-echo\u5b9e\u73b0\u5b9e\u65f6\u901a\u4fe1\/","og_site_name":"Blog - Silicon Cloud","article_published_time":"2023-06-18T00:10:02+00:00","article_modified_time":"2024-04-29T22:34:56+00:00","og_image":[{"url":"https:\/\/cdn.silicloud.com\/blog-img\/blog\/img\/657d1c5a37434c4406c10881\/57-0.png"}],"author":"\u79d1, \u96c5","twitter_card":"summary_large_image","twitter_misc":{"\u4f5c\u8005":"\u79d1, \u96c5","\u9884\u8ba1\u9605\u8bfb\u65f6\u95f4":"5 \u5206"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8docker%e3%80%81laravel%e3%80%81redis%e5%92%8claravel-echo%e5%ae%9e%e7%8e%b0%e5%ae%9e%e6%97%b6%e9%80%9a%e4%bf%a1\/","url":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8docker%e3%80%81laravel%e3%80%81redis%e5%92%8claravel-echo%e5%ae%9e%e7%8e%b0%e5%ae%9e%e6%97%b6%e9%80%9a%e4%bf%a1\/","name":"\u4f7f\u7528Docker\u3001Laravel\u3001Redis\u548cLaravel Echo\u5b9e\u73b0\u5b9e\u65f6\u901a\u4fe1 - Blog - Silicon Cloud","isPartOf":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website"},"datePublished":"2023-06-18T00:10:02+00:00","dateModified":"2024-04-29T22:34:56+00:00","author":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a"},"breadcrumb":{"@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8docker%e3%80%81laravel%e3%80%81redis%e5%92%8claravel-echo%e5%ae%9e%e7%8e%b0%e5%ae%9e%e6%97%b6%e9%80%9a%e4%bf%a1\/#breadcrumb"},"inLanguage":"zh-Hans","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8docker%e3%80%81laravel%e3%80%81redis%e5%92%8claravel-echo%e5%ae%9e%e7%8e%b0%e5%ae%9e%e6%97%b6%e9%80%9a%e4%bf%a1\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8docker%e3%80%81laravel%e3%80%81redis%e5%92%8claravel-echo%e5%ae%9e%e7%8e%b0%e5%ae%9e%e6%97%b6%e9%80%9a%e4%bf%a1\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"\u9996\u9875","item":"https:\/\/www.silicloud.com\/zh\/blog\/"},{"@type":"ListItem","position":2,"name":"\u4f7f\u7528Docker\u3001Laravel\u3001Redis\u548cLaravel Echo\u5b9e\u73b0\u5b9e\u65f6\u901a\u4fe1"}]},{"@type":"WebSite","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#website","url":"https:\/\/www.silicloud.com\/zh\/blog\/","name":"Blog - Silicon Cloud","description":"","inLanguage":"zh-Hans"},{"@type":"Person","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/41e222757cdd2a3365361328bd79970a","name":"\u79d1, \u96c5","image":{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/#\/schema\/person\/image\/","url":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/1b2d3e00a7df03689797ebd4af8c5827ba5af936849a71050ec331f4cf902c5d?s=96&d=mm&r=g","caption":"\u79d1, \u96c5"},"url":"https:\/\/www.silicloud.com\/zh\/blog\/author\/keya\/"},{"@type":"ImageObject","inLanguage":"zh-Hans","@id":"https:\/\/www.silicloud.com\/zh\/blog\/%e4%bd%bf%e7%94%a8docker%e3%80%81laravel%e3%80%81redis%e5%92%8claravel-echo%e5%ae%9e%e7%8e%b0%e5%ae%9e%e6%97%b6%e9%80%9a%e4%bf%a1\/#local-main-organization-logo","url":"","contentUrl":"","caption":"Blog - Silicon Cloud"}]}},"_links":{"self":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/34338","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/users\/4"}],"replies":[{"embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/comments?post=34338"}],"version-history":[{"count":2,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/34338\/revisions"}],"predecessor-version":[{"id":90289,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/posts\/34338\/revisions\/90289"}],"wp:attachment":[{"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/media?parent=34338"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/categories?post=34338"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.silicloud.com\/zh\/blog\/wp-json\/wp\/v2\/tags?post=34338"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}