{"id":845,"date":"2025-06-12T01:00:13","date_gmt":"2025-06-11T17:00:13","guid":{"rendered":"https:\/\/www.zhaozhao123.cn\/php\/php-application-manual\/laravel\/845.html"},"modified":"2025-06-12T01:00:13","modified_gmt":"2025-06-11T17:00:13","slug":"%e5%9c%a8-laravel-%e4%b8%ad%e4%bd%bf%e7%94%a8-websocket-%e6%9e%84%e5%bb%ba%e5%ae%9e%e6%97%b6%e5%ba%94%e7%94%a8","status":"publish","type":"my1js","link":"https:\/\/www.zhaozhao123.cn\/php\/my1js\/845.html","title":{"rendered":"\u5728 Laravel \u4e2d\u4f7f\u7528 WebSocket \u6784\u5efa\u5b9e\u65f6\u5e94\u7528"},"content":{"rendered":"<div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--1\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/dyA-1-400x300.jpg\" alt=\"Bug&#32534;&#35793;&#29422;\" class=\"wp-image-1842\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">Bug&#32534;&#35793;&#29422;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>WebSocket &#26159;&#19968;&#31181;&#29992;&#20110;&#22312;&#32593;&#32476;&#24212;&#29992;&#31243;&#24207;&#20013;&#23454;&#29616;&#20840;&#21452;&#24037;&#36890;&#20449;&#30340;&#25216;&#26415;&#12290;&#22312; Laravel &#20013;&#20351;&#29992; WebSocket &#21487;&#20197;&#26174;&#33879;&#25552;&#39640;&#29992;&#25143;&#20307;&#39564;&#65292;&#29305;&#21035;&#26159;&#22312;&#38656;&#35201;&#21363;&#26102;&#21453;&#39304;&#30340;&#24212;&#29992;&#22330;&#26223;&#20013;&#12290;&#20197;&#19979;&#26159;&#22914;&#20309;&#22312; Laravel &#20013;&#20351;&#29992; WebSocket &#30340;&#27493;&#39588;&#65306;<\/p>\n<h3>1. &#23433;&#35013; Laravel Echo &#21644; Laravel Broadcast<\/h3>\n<p>&#39318;&#20808;&#65292;&#20320;&#38656;&#35201;&#23433;&#35013; Laravel Echo &#21644; Laravel Broadcast&#12290;<\/p>\n<pre><code class=\"language-bash\">composer require pusher\/pusher-php-server<\/code><\/pre>\n<p>&#28982;&#21518;&#65292;&#36816;&#34892;&#20197;&#19979;&#21629;&#20196;&#26469;&#21019;&#24314;&#24191;&#25773;&#26381;&#21153;&#21644;&#36890;&#36947;&#65306;<\/p>\n<pre><code class=\"language-bash\">php artisan make:channel ChatChannel<\/code><\/pre>\n<h3>2. &#37197;&#32622; Pusher<\/h3>\n<p>&#22312; <code>.env<\/code> &#25991;&#20214;&#20013;&#37197;&#32622; Pusher &#30340;&#20973;&#25454;&#65306;<\/p>\n<pre><code class=\"language-env\">PUSHER_APP_ID=your_app_id\nPUSHER_APP_KEY=your_app_key\nPUSHER_APP_SECRET=your_app_secret\nPUSHER_APP_CLUSTER=mt1<\/code><\/pre>\n<h3>3. &#21019;&#24314; WebSocket &#25511;&#21046;&#22120;<\/h3>\n<p>&#21019;&#24314;&#19968;&#20010;&#26032;&#30340;&#25511;&#21046;&#22120;&#26469;&#22788;&#29702; WebSocket &#35831;&#27714;&#65306;<\/p>\n<pre><code class=\"language-bash\">php artisan make:controller SocketController<\/code><\/pre>\n<h3>4. &#32534;&#20889; WebSocket &#26041;&#27861;<\/h3>\n<p>&#22312; <code>SocketController<\/code> &#20013;&#32534;&#20889;&#26041;&#27861;&#26469;&#22788;&#29702;&#36830;&#25509;&#12289;&#28040;&#24687;&#25509;&#25910;&#21644;&#21457;&#36865;&#65306;<\/p>\n<pre><code class=\"language-php\">namespace AppHttpControllers;\n\nuse IlluminateHttpRequest;\nuse PusherPusher;\n\nclass SocketController extends Controller\n{\n    private $pusher;\n\n    public function __construct()\n    {\n        $this-&gt;pusher = new Pusher(\n            env('PUSHER_APP_KEY'),\n            env('PUSHER_APP_SECRET'),\n            env('PUSHER_APP_CLUSTER')\n        );\n    }\n\n    public function connect(Request $request)\n    {\n        $request-&gt;connection-&gt;joinChannel('chat');\n    }\n\n    public function chat(Request $request)\n    {\n        $message = $request-&gt;input('message');\n\n        $this-&gt;pusher-&gt;broadcast('chat', [\n            'message' =&gt; $message,\n        ]);\n\n        return response()-&gt;json([\n            'status' =&gt; 'success',\n        ]);\n    }\n}<\/code><\/pre>\n<h3>5. &#27880;&#20876;&#36335;&#30001;<\/h3>\n<p>&#22312; <code>routes\/web.php<\/code> &#25991;&#20214;&#20013;&#27880;&#20876;&#36335;&#30001;&#65306;<\/p>\n<pre><code class=\"language-php\">Route::get('\/ws\/socket', 'SocketController@connect')-&gt;name('socket.connect');\nRoute::post('\/ws\/chat', 'SocketController@chat')-&gt;name('socket.chat');<\/code><\/pre>\n<h3>6. &#22312;&#21069;&#31471;&#20351;&#29992; Laravel Echo<\/h3>\n<p>&#22312;&#20320;&#30340;&#21069;&#31471;&#24212;&#29992;&#20013;&#20351;&#29992; Laravel Echo &#26469;&#36830;&#25509;&#21040; WebSocket &#24182;&#21457;&#36865;&#28040;&#24687;&#65306;<\/p>\n<pre><code class=\"language-javascript\">\/\/ app.js\nimport Echo from 'laravel-echo';\n\nwindow.Pusher = require('pusher-js');\n\nconst echo = new Echo({\n    broadcaster: 'pusher',\n    key: process.env.MIX_PUSHER_APP_KEY,\n    cluster: process.env.MIX_PUSHER_APP_CLUSTER,\n});\n\necho.channel('chat').listen('chat', (event) =&gt; {\n    console.log(event.message);\n});<\/code><\/pre>\n<h3>&#31034;&#20363;&#20195;&#30721;<\/h3>\n<p>&#20197;&#19979;&#26159;&#19968;&#20010;&#23436;&#25972;&#30340;&#31034;&#20363;&#20195;&#30721;&#65292;&#23637;&#31034;&#20102;&#22914;&#20309;&#22312; Laravel &#20013;&#20351;&#29992; WebSocket&#65306;<\/p>\n<h4>1. &#23433;&#35013;&#20381;&#36182;<\/h4>\n<pre><code class=\"language-bash\">composer require pusher\/pusher-php-server<\/code><\/pre>\n<h4>2. &#37197;&#32622; Pusher<\/h4>\n<p>&#22312; <code>.env<\/code> &#25991;&#20214;&#20013;&#37197;&#32622; Pusher &#30340;&#20973;&#25454;&#65306;<\/p>\n<pre><code class=\"language-env\">PUSHER_APP_ID=your_app_id\nPUSHER_APP_KEY=your_app_key\nPUSHER_APP_SECRET=your_app_secret\nPUSHER_APP_CLUSTER=mt1<\/code><\/pre>\n<h4>3. &#21019;&#24314; WebSocket &#25511;&#21046;&#22120;<\/h4>\n<pre><code class=\"language-bash\">php artisan make:controller SocketController<\/code><\/pre>\n<h4>4. &#32534;&#20889; WebSocket &#26041;&#27861;<\/h4>\n<p>&#22312; <code>SocketController<\/code> &#20013;&#32534;&#20889;&#26041;&#27861;&#26469;&#22788;&#29702;&#36830;&#25509;&#12289;&#28040;&#24687;&#25509;&#25910;&#21644;&#21457;&#36865;&#65306;<\/p>\n<pre><code class=\"language-php\">namespace AppHttpControllers;\n\nuse IlluminateHttpRequest;\nuse PusherPusher;\n\nclass SocketController extends Controller\n{\n    private $pusher;\n\n    public function __construct()\n    {\n        $this-&gt;pusher = new Pusher(\n            env('PUSHER_APP_KEY'),\n            env('PUSHER_APP_SECRET'),\n            env('PUSHER_APP_CLUSTER')\n        );\n    }\n\n    public function connect(Request $request)\n    {\n        $request-&gt;connection-&gt;joinChannel('chat');\n    }\n\n    public function chat(Request $request)\n    {\n        $message = $request-&gt;input('message');\n\n        $this-&gt;pusher-&gt;broadcast('chat', [\n            'message' =&gt; $message,\n        ]);\n\n        return response()-&gt;json([\n            'status' =&gt; 'success',\n        ]);\n    }\n}<\/code><\/pre>\n<h4>5. &#27880;&#20876;&#36335;&#30001;<\/h4>\n<p>&#22312; <code>routes\/web.php<\/code> &#25991;&#20214;&#20013;&#27880;&#20876;&#36335;&#30001;&#65306;<\/p>\n<pre><code class=\"language-php\">Route::get('\/ws\/socket', 'SocketController@connect')-&gt;name('socket.connect');\nRoute::post('\/ws\/chat', 'SocketController@chat')-&gt;name('socket.chat');<\/code><\/pre>\n<h4>6. &#22312;&#21069;&#31471;&#20351;&#29992; Laravel Echo<\/h4>\n<p>&#22312;&#20320;&#30340;&#21069;&#31471;&#24212;&#29992;&#20013;&#20351;&#29992; Laravel Echo &#26469;&#36830;&#25509;&#21040; WebSocket &#24182;&#21457;&#36865;&#28040;&#24687;&#65306;<\/p>\n<pre><code class=\"language-javascript\">\/\/ app.js\nimport Echo from 'laravel-echo';\n\nwindow.Pusher = require('pusher-js');\n\nconst echo = new Echo({\n    broadcaster: 'pusher',\n    key: process.env.MIX_PUSHER_APP_KEY,\n    cluster: process.env.MIX_PUSHER_APP_CLUSTER,\n});\n\necho.channel('chat').listen('chat', (event) =&gt; {\n    console.log(event.message);\n});<\/code><\/pre>\n<p>&#36890;&#36807;&#20197;&#19978;&#27493;&#39588;&#65292;&#20320;&#21487;&#20197;&#22312; Laravel &#20013;&#25104;&#21151;&#20351;&#29992; WebSocket &#26500;&#24314;&#23454;&#26102;&#24212;&#29992;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--2\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/zp-400x300.jpg\" alt=\"&#40657;&#26495;Bug&#35762;&#24072;\" class=\"wp-image-1849\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#40657;&#26495;Bug&#35762;&#24072;<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<body><h2>&#20171;&#32461;<\/h2><p>&#23454;&#26102;&#20132;&#20114;&#26159;&#29616;&#20195;Web&#24212;&#29992;&#31243;&#24207;&#30340;&#37325;&#35201;&#29305;&#24615;&#12290;&#20351;&#29992;Laravel&#21644;laravel-websocket&#21253;&#65292;PHP&#24320;&#21457;&#20154;&#21592;&#21487;&#20197;&#36731;&#26494;&#26500;&#24314;&#24378;&#22823;&#30340;&#23454;&#26102;&#24212;&#29992;&#12290;&#26412;&#25945;&#31243;&#23558;&#25351;&#23548;&#24744;&#23433;&#35013;&#12289;&#37197;&#32622;&#21644;&#20351;&#29992;laravel-websocket&#22312;&#24744;&#30340;Laravel&#24212;&#29992;&#31243;&#24207;&#20013;&#21019;&#24314;&#23454;&#26102;&#21151;&#33021;&#12290;<\/p><h2>&#35774;&#32622;&#20013;<\/h2><p>&#39318;&#20808;&#65292;&#20351;&#29992; Composer &#23433;&#35013; Laravel-Websocket &#21253;&#65306;<\/p><pre><code>composer require beyondcode\/laravel-websockets<\/code><\/pre><p>&#21457;&#24067;&#37197;&#32622;&#25991;&#20214;&#65306;<\/p><pre><code>php artisan vendor:publish --provider=\"BeyondCode\nLaravelWebSockets\nWebSocketsServiceProvider\" --tag=\"config\"\n<\/code><\/pre><h2>&#37197;&#32622;WebSocket&#26381;&#21153;&#22120;<\/h2><p>&#35831;&#20462;&#25913;&#37197;&#32622;&#25991;&#20214; config\/websockets.php&#65292;&#20197;&#35774;&#32622;&#24744;&#30340;WebSocket&#26381;&#21153;&#22120;&#65306;<\/p><pre><code>'apps' =&gt; [\n    [\n        'id' =&gt; env('PUSHER_APP_ID'),\n        'name' =&gt; env('APP_NAME'),\n        'key' =&gt; env('PUSHER_APP_KEY'),\n        'secret' =&gt; env('PUSHER_APP_SECRET'),\n        'enable_client_messages' =&gt; true,\n        'enable_statistics' =&gt; true,\n    ],\n],\n<\/code><\/pre><h2>&#36816;&#34892;WebSocket&#26381;&#21153;&#22120;<\/h2><p>&#21551;&#21160;WebSocket&#26381;&#21153;&#22120;&#65292;&#20351;&#29992;Artisan&#21629;&#20196;&#65306;<\/p><pre><code>php artisan websockets:serve<\/code><\/pre><p>&#36825;&#23558;&#21551;&#21160;&#26381;&#21153;&#22120;&#65292;&#20320;&#21487;&#20197;&#20351;&#29992;&#21069;&#31471;&#23454;&#29616;&#65292;&#27604;&#22914;Laravel Echo&#25110;JavaScript&#26469;&#36830;&#25509;&#21040;&#23427;&#12290;<\/p><h2>&#19982;&#21069;&#31471;&#38598;&#25104;<\/h2><p>&#20197;&#36825;&#31181;&#26041;&#24335;&#20026;&#20363;&#65292;&#25105;&#20204;&#23558;&#20351;&#29992;Laravel Echo&#19982;Pusher JS&#65306;<\/p><pre><code>import Echo from 'laravel-echo';\nwindow.Pusher = require('pusher-js');\n\nwindow.echo = new Echo({\n    broadcaster: 'pusher',\n    key: 'your-pusher-key',\n    wsHost: window.location.hostname,\n    wsPort: 6001,\n    forceTLS: false,\n    disableStats: true,\n});\n<\/code><\/pre><p>&#29616;&#22312;&#21487;&#20197;&#22312;&#39057;&#36947;&#19978;&#30417;&#21548;&#20107;&#20214;&#65306;<\/p><pre><code>window.echo.channel('your-channel')\n    .listen('.YourEvent', (e) =&gt; {\n        console.log(e);\n    });\n<\/code><\/pre><h2>&#21019;&#24314;&#20107;&#20214;<\/h2><p>&#22312;Laravel&#20013;&#21019;&#24314;&#19968;&#20010;&#33258;&#23450;&#20041;&#20107;&#20214;&#65292;&#35813;&#20107;&#20214;&#23454;&#29616;ShouldBroadcast&#25509;&#21475;&#30340;&#31034;&#20363;&#22914;&#19979;&#65306;<\/p><pre><code>use IlluminateContractsBroadcastingShouldBroadcast;\n\nclass YourEvent implements ShouldBroadcast\n{\n    public function broadcastOn()\n    {\n        return new Channel('your-channel');\n    }\n}\n<\/code><\/pre><p>&#35302;&#21457;&#27492;&#20107;&#20214;&#65292;&#20174;&#24212;&#29992;&#31243;&#24207;&#36923;&#36753;&#20013;&#23454;&#29616;&#65292;&#23427;&#23558;&#22312;&#21069;&#31471;&#23454;&#26102;&#26174;&#31034;&#12290;<\/p><h2>Presence Channels<\/h2><p>Laravel WebSocket &#25903;&#25345;Presence Channels&#65292;&#21487;&#20197;&#36319;&#36394;&#29992;&#25143;&#30340;&#22312;&#32447;&#29366;&#24577;&#65306;<\/p><pre><code>window.echo.join('presence-channel')\n    .here((users) =&gt; {\n        \/\/ Users that are already present.\n    })\n    .joining((user) =&gt; {\n        \/\/ User that joins the presence channel.\n    })\n    .leaving((user) =&gt; {\n        \/\/ User that leaves the presence channel.\n    });\n<\/code><\/pre><h2>&#22788;&#29702;&#36523;&#20221;&#39564;&#35777;<\/h2><p>Laravel-WebSocket &#20801;&#35768;&#24744;&#36890;&#36807;&#36523;&#20221;&#39564;&#35777;&#31169;&#26377;&#21644;&#23384;&#22312;&#39057;&#36947;&#65292;&#20197;&#30830;&#20445;&#21482;&#26377;&#25480;&#26435;&#29992;&#25143;&#25165;&#33021;&#35775;&#38382;&#23427;&#20204;&#65306;<\/p><pre><code>Broadcast::channel('private-channel', function ($user) {\n    return (int) $user-&gt;id === (int) Auth::id();\n});\nBroadcast::channel('presence-channel', function ($user) {\n    return $user;\n});\n<\/code><\/pre><h2>&#39640;&#32423;&#29992;&#27861;&#65306;&#33258;&#23450;&#20041;&#25511;&#21046;&#22120;<\/h2><p>&#20320;&#21487;&#20197;&#36890;&#36807;&#28155;&#21152;&#33258;&#23450;&#20041;&#30340;WebSocket&#25511;&#21046;&#22120;&#26469;&#25193;&#23637;&#20320;&#30340;WebSocket&#26381;&#21153;&#22120;&#30340;&#21151;&#33021;&#12290;<\/p><pre><code>use BeyondCodeLaravelWebSocketsWebSocketsWebSocketHandler;\nclass CustomWebSocketController extends WebSocketHandler\n{\n    public function onOpen($connection)\n    { }\n    public function onClose($connection)\n    { }\n}\n<\/code><\/pre><p>&#32534;&#36753; websockets.php &#37197;&#32622;&#25991;&#20214;&#20197;&#20351;&#29992;&#33258;&#23450;&#20041;&#25511;&#21046;&#22120;&#65306;<\/p><pre><code>'handlers' =&gt; [\n    'default' =&gt; MyCustomWebSocketHandler::class,\n],\n<\/code><\/pre><h2>&#30830;&#20445;WebSocket&#36830;&#25509;&#30340;&#23433;&#20840;&#24615;<\/h2><p>&#20026;&#20102;&#30830;&#20445;&#23433;&#20840;&#36830;&#25509;&#65292;&#35831;&#20351;&#29992;SSL&#12290;&#22312;&#24191;&#25773;&#37197;&#32622;&#20013;&#35774;&#32622;&#24744;&#30340;SSL&#35777;&#20070;&#65306;<\/p><pre><code>'apps' =&gt; [\n    [\n        'id' =&gt; env('PUSHER_APP_ID'),\n        \/\/ ...\n        'ssl' =&gt; [\n            'local_cert' =&gt; env('WEBSOCKETS_SSL_LOCAL_CERT', null),\n            'local_pk' =&gt; env('WEBSOCKETS_SSL_LOCAL_PK', null),\n            'passphrase' =&gt; env('WEBSOCKETS_SSL_PASSPHRASE', null),\n        ],\n        \/\/ ...\n    ],\n],\n<\/code><\/pre><h2>&#35843;&#35797;&#21644;&#30417;&#25511;<\/h2><p>Laravel-WebSocket &#25552;&#20379;&#20102;&#19968;&#20010;&#20202;&#34920;&#26495;&#26469;&#30417;&#25511; WebSocket &#36830;&#25509;&#21644;&#28040;&#24687;&#12290;&#24744;&#21487;&#20197;&#36890;&#36807;&#22312;&#24744;&#30340;&#24212;&#29992; URL &#19978;&#35775;&#38382; \/laravel-websockets &#26469;&#35775;&#38382;&#23427;&#65292;&#36825;&#38656;&#35201;&#24744;&#22312; .env &#25991;&#20214;&#20013;&#35843;&#25972;&#20102;&#20202;&#34920;&#26495;&#37197;&#32622;&#35774;&#32622;&#12290;<\/p><h2>&#32467;&#35770;&#12290;<\/h2><p>&#25353;&#29031;&#36825;&#20010;&#25351;&#21335;&#65292;&#24744;&#24050;&#32463;&#23398;&#20250;&#20102;&#22914;&#20309;&#20351;&#29992;laravel-websocket&#21253;&#22312;Laravel&#24212;&#29992;&#20013;&#38598;&#25104;&#23454;&#26102;&#21151;&#33021;&#12290;&#23454;&#26102;&#24212;&#29992;&#31243;&#24207;&#21487;&#20197;&#20026;&#29992;&#25143;&#25552;&#20379;&#22686;&#24378;&#30340;&#29992;&#25143;&#20307;&#39564;&#65292;&#36825;&#23545;&#24744;&#30340;&#39033;&#30446;&#38750;&#24120;&#26377;&#30410;&#12290;&#24320;&#24515;&#32534;&#30721;&#65281;<\/p><\/body>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div><div class=\"wp-block-columns p-0 border is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-columns px-4 py-3 border-bottom has-background is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\" style=\"background:linear-gradient(243deg,rgb(238,238,238) 0%,rgba(58,166,242,0.15) 100%)\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<div class=\"wp-block-group is-nowrap is-layout-flex wp-container-core-group-is-layout-6c531013 wp-block-group-is-layout-flex\">\r\n<figure class=\"wp-block-image size-thumbnail is-resized is-style-rounded is-style-rounded--3\"><img decoding=\"async\" src=\"https:\/\/www.zhaozhao123.cn\/myitems\/images\/sites16\/2025\/06\/xygcfznnzczhsdmwydzhsmzzzmddnq-400x300.jpg\" alt=\"&#38271;&#24037;&#30721;&#22900;1523\" class=\"wp-image-2906\" style=\"object-fit:cover;width:30px;height:30px\"><\/figure>\r\n\r\n\r\n\r\n<h2 class=\"wp-block-heading my-0\" style=\"font-size:clamp(0.875rem, 0.875rem + ((1vw - 0.2rem) * 0.175), 1rem);\">&#38271;&#24037;&#30721;&#22900;1523<\/h2>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n\r\n\r\n\r\n<div class=\"wp-block-columns px-xl-5 px-4 py-xl-4 py-3 is-layout-flex wp-container-core-columns-is-layout-28f84493 wp-block-columns-is-layout-flex\">\r\n<div class=\"wp-block-column is-layout-flow wp-block-column-is-layout-flow\">\r\n<p>&#22312; Laravel &#20013;&#26500;&#24314;&#19968;&#20010;&#22522;&#20110; WebSocket &#30340;&#23454;&#26102;&#24212;&#29992;&#21487;&#20197;&#35753;&#20320;&#36731;&#26494;&#22320;&#23454;&#29616;&#24322;&#27493;&#36890;&#20449;&#21644;&#25968;&#25454;&#27969;&#22788;&#29702;&#12290;WebSocket &#26159;&#19968;&#31181;&#36731;&#37327;&#32423;&#30340;&#12289;&#20840;&#21452;&#24037;&#30340;&#21327;&#35758;&#65292;&#20801;&#35768;&#23458;&#25143;&#31471;&#19982;&#26381;&#21153;&#22120;&#20043;&#38388;&#36827;&#34892;&#21452;&#21521;&#20256;&#36755;&#12290;&#20197;&#19979;&#26159;&#22914;&#20309;&#20351;&#29992; Laravel &#21644; WebSocket &#23454;&#29616;&#31616;&#21333;&#32842;&#22825;&#21151;&#33021;&#30340;&#19968;&#20010;&#20363;&#23376;&#65306;<\/p>\n<h3>&#31532;&#19968;&#27493;&#65306;&#23433;&#35013; Laravel &#21644; WebSocket<\/h3>\n<p>&#39318;&#20808;&#30830;&#20445;&#20320;&#30340;&#31995;&#32479;&#19978;&#24050;&#23433;&#35013;&#20102; Composer&#12290;&#25509;&#19979;&#26469;&#65292;&#36890;&#36807;&#36816;&#34892;&#20197;&#19979;&#21629;&#20196;&#23433;&#35013; Laravel &#20197;&#21450; WebSocket &#25903;&#25345;&#65306;<\/p>\n<pre><code class=\"language-bash\">composer require laravel\/framework ^8.0<\/code><\/pre>\n<p>&#36825;&#23558;&#23433;&#35013; Laravel 8.x &#29256;&#26412;&#65292;&#24182;&#30830;&#20445;&#20320;&#26377;&#19968;&#20010;&#25903;&#25345; WebSocket &#30340;&#29256;&#26412;&#12290;<\/p>\n<h3>&#31532;&#20108;&#27493;&#65306;&#21019;&#24314; WebSocket &#37197;&#32622;&#25991;&#20214;<\/h3>\n<p>&#22312; <code>app\/Http\/Kernel.php<\/code> &#25991;&#20214;&#20013;&#28155;&#21152; WebSocket &#37197;&#32622;&#65306;<\/p>\n<pre><code class=\"language-php\">protected $middlewareGroups = [\n    'web' =&gt; ['IlluminateRoutingMiddlewareThrottleRequests'],\n];\nprotected $routeMiddleware = [\n    \/\/ ...\n    'websocket' =&gt; LaravelWebsoketLaravelFacadesWebsocket::class,\n];<\/code><\/pre>\n<p>&#36825;&#37324;&#30340; <code>websocket<\/code> &#20851;&#38190;&#23383;&#21578;&#35785; Laravel &#20351;&#29992; WebSockets&#12290;<\/p>\n<h3>&#31532;&#19977;&#27493;&#65306;&#23450;&#20041; WebSocket &#30417;&#21548;&#22120;<\/h3>\n<p>&#21019;&#24314;&#19968;&#20010;&#26032;&#30340;&#25511;&#21046;&#22120;&#26469;&#30417;&#21548; WebSocket &#36830;&#25509;&#24182;&#22788;&#29702;&#28040;&#24687;&#65306;<\/p>\n<pre><code class=\"language-php\">&lt;?php\n\nnamespace AppHttpControllers;\n\nuse IlluminateHttpRequest;\nuse IlluminateSupportFacadesHttp;\nuse IlluminateSupportFacadesEvent;\nuse AppEventsMessageReceivedEvent;\n\nclass ChatController extends Controller\n{\n    public function __construct()\n    {\n        event(new MessageReceivedEvent());\n    }\n\n    \/**\n     * Handle incoming WebSocket connections.\n     *\n     * @param  IlluminateHttpRequest  $request\n     * @return IlluminateHttpResponse\n     *\/\n    public function websocket(Request $request)\n    {\n        $request-&gt;session()-&gt;put('connection', true);\n\n        return $this-&gt;respondToClient($request);\n    }\n\n    private function respondToClient(Request $request)\n    {\n        if ($request-&gt;has('message')) {\n            $client_id = $request-&gt;session()-&gt;get('client_id');\n            $data = json_decode($request-&gt;getContent(), true);\n\n            $response = Http::withHeaders([\n                'Content-Type' =&gt; 'application\/json',\n            ])-&gt;post(\n                config('services.websocket.url'),\n                [\n                    'method' =&gt; 'POST',\n                    'headers' =&gt; [\n                        'Authorization' =&gt; 'Bearer ' . config('services.websocket.key'),\n                        'Client-ID' =&gt; $client_id,\n                    ],\n                    'json' =&gt; $data,\n                ]\n            );\n\n            if ($response-&gt;successful()) {\n                return response()-&gt;json(['success' =&gt; true]);\n            } else {\n                return response()-&gt;json(['error' =&gt; 'Failed to send message']);\n            }\n        }\n\n        return response()-&gt;json(['error' =&gt; 'Missing required data'], 422);\n    }\n}<\/code><\/pre>\n<p>&#22312;&#36825;&#20010;&#25511;&#21046;&#22120;&#20013;&#65292;&#25105;&#20204;&#39318;&#20808;&#26816;&#26597;&#26159;&#21542;&#24050;&#32463;&#23384;&#22312; WebSocket &#36830;&#25509;&#12290;&#22914;&#26524;&#23384;&#22312;&#65292;&#25105;&#20204;&#20174;&#20250;&#35805;&#20013;&#33719;&#21462;&#23458;&#25143;&#31471; ID &#24182;&#23581;&#35797;&#21521;&#26381;&#21153;&#31471;&#21457;&#36865;&#28040;&#24687;&#12290;&#22914;&#26524;&#27809;&#26377;&#36830;&#25509;&#65292;&#25105;&#20204;&#30452;&#25509;&#36820;&#22238;&#38169;&#35823;&#20449;&#24687;&#12290;<\/p>\n<h3>&#31532;&#22235;&#27493;&#65306;&#27979;&#35797; WebSocket<\/h3>\n<p>&#20026;&#20102;&#27979;&#35797; WebSocket&#65292;&#20320;&#21487;&#20197;&#20351;&#29992; Postman &#25110;&#31867;&#20284;&#30340;&#24037;&#20855;&#12290;&#22312; Postman &#20013;&#65292;&#20320;&#21487;&#20197;&#27169;&#25311;&#19968;&#20010; WebSocket &#35831;&#27714;&#21040;&#26381;&#21153;&#31471;&#65306;<\/p>\n<ol>\n<li>&#23558; POST &#26041;&#27861;&#35774;&#32622;&#20026; &#8220;GET&#8221;&#12290;<\/li>\n<li>&#22312; URL &#20013;&#21152;&#20837; <code>\/ws\/<\/code>&#65292;&#36825;&#26159; WebSocket &#30340; URL&#12290;<\/li>\n<li>&#28155;&#21152;&#35831;&#27714;&#20307;&#65292;&#20854;&#20013;&#21253;&#21547; JSON &#25968;&#25454;&#65288;&#20363;&#22914;&#65292;&#29992;&#25143;&#21517;&#65289;&#12290;<\/li>\n<li>&#21457;&#36865;&#35831;&#27714;&#12290;<\/li>\n<\/ol>\n<h3>&#31532;&#20116;&#27493;&#65306;&#37096;&#32626;&#21644;&#37096;&#32626;<\/h3>\n<p>&#22312; Laravel &#39033;&#30446;&#20013;&#37197;&#32622; WebSocket &#21518;&#65292;&#20320;&#38656;&#35201;&#23558;&#20854;&#38598;&#25104;&#21040;&#23454;&#38469;&#30340;&#24212;&#29992;&#31243;&#24207;&#20013;&#12290;&#20320;&#21487;&#20197;&#36873;&#25321;&#22312;&#29983;&#20135;&#29615;&#22659;&#20013;&#20351;&#29992; Nginx &#25110;&#32773;&#20854;&#20182;&#36127;&#36733;&#22343;&#34913;&#22120;&#12290;&#28982;&#21518;&#65292;&#36890;&#36807;&#20462;&#25913;&#37197;&#32622;&#25991;&#20214;&#26469;&#21551;&#29992; WebSocket &#21151;&#33021;&#12290;<\/p>\n<p>&#20197;&#19978;&#23601;&#26159;&#22914;&#20309;&#22312; Laravel &#20013;&#20351;&#29992; WebSocket &#24314;&#31435;&#23454;&#26102;&#24212;&#29992;&#30340;&#22522;&#26412;&#25351;&#23548;&#12290;&#36825;&#20010;&#20363;&#23376;&#23637;&#31034;&#20102;&#22914;&#20309;&#26500;&#24314;&#31616;&#21333;&#30340;&#32842;&#22825;&#24212;&#29992;&#65292;&#20294;&#20320;&#21487;&#20197;&#26681;&#25454;&#38656;&#35201;&#25193;&#23637;&#20854;&#21151;&#33021;&#65292;&#27604;&#22914;&#29992;&#25143;&#35748;&#35777;&#12289;&#21152;&#23494;&#31561;&#12290;<\/p>\r\n<\/div>\r\n<\/div>\r\n<\/div>\r\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>Bug&#32534;&#35793;&#29422; WebSocket &#26159;&#19968;&#31181;&#29992;&#20110;&#22312;&#32593;&#32476;&#24212;&#29992;&#31243;&#24207;&#20013;&#23454;&#29616;&#038;#..<\/p>\n","protected":false},"author":1,"featured_media":0,"menu_order":0,"template":"","meta":{"_acf_changed":false},"tags":[],"my1js2nav":[44],"tuisongtax":[],"class_list":["post-845","my1js","type-my1js","status-publish","hentry","my1js2nav-laravel"],"acf":{"qian_art_seotitle":"","qian_art_seotitle_source":{"label":"SEO\u6807\u9898","type":"text","formatted_value":""},"qian_art_seokws":"","qian_art_seokws_source":{"label":"SEO\u5173\u952e\u8bcd","type":"text","formatted_value":""},"qian_art_stzhong":"","qian_art_stzhong_source":{"label":"\u4e2d | \u77ed\u6807\u9898","type":"text","formatted_value":""}},"_links":{"self":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js\/845","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js"}],"about":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/types\/my1js"}],"author":[{"embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/users\/1"}],"wp:attachment":[{"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/media?parent=845"}],"wp:term":[{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tags?post=845"},{"taxonomy":"my1js2nav","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/my1js2nav?post=845"},{"taxonomy":"tuisongtax","embeddable":true,"href":"https:\/\/www.zhaozhao123.cn\/php\/wp-json\/wp\/v2\/tuisongtax?post=845"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}