Laravel 8.9.0 Websockets报错:Pusher::trigger()第4参数需数组,实际传null
Laravel 8.9.0中Laravel Websockets仪表盘发消息触发类型错误
在Laravel 8.9.0版本中,通过Laravel Websockets仪表盘发送消息时触发错误:
Argument 4 passed to Pusher\Pusher::trigger() must be of the type array, null given
已知Laravel 7.x存在相关bug,但当前使用8.9.0版本,该方向排查无效,已耗时2天,急需解决方案。
相关配置信息
1. composer.json内容
{ "name": "laravel/laravel", "type": "project", "description": "The Laravel Framework.", "keywords": [ "framework", "laravel" ], "license": "MIT", "require": { "php": "^7.4", "ext-curl": "*", "ext-dom": "*", "ext-fileinfo": "*", "ext-json": "*", "ext-libxml": "*", "ext-pdo": "*", "ext-posix": "^7.3", "ext-zip": "*", "adoy/oauth2": "1.3.0", "beyondcode/laravel-websockets": "^1.13", "curl/curl": "2.2.0", "doctrine/dbal": "2.3.5", "facade/ignition": "^2.3.6", "fideloper/proxy": "^4.0", "guzzlehttp/guzzle": "^7.0", "intervention/image": "^2.4", "intervention/imagecache": "^2.3", "laravel/framework": "v8.9.0", "laravel/horizon": "v5.0", "laravel/passport": "^10.1", "laravel/tinker": "^2.0", "laravel/ui": "^3.0", "league/flysystem": "^1.0", "maatwebsite/excel": "^3.1", "php-ai/php-ml": "^0.9.0", "phpmailer/phpmailer": "^6.4", "predis/predis": "v1.1.6", "pusher/pusher-php-server": "^7.2", "spatie/laravel-permission": "^4.2", "tightenco/ziggy": "^1.4" }, "require-dev": { "filp/whoops": "^2.0", "laravel/sail": "^1.5", "mockery/mockery": "^1.0", "nunomaduro/collision": "^4.1", "omniphx/forrest": "2.*", "phpunit/phpunit": "^9.0" }, "config": { "optimize-autoloader": true, "preferred-install": "dist", "sort-packages": true, "platform": { "ext-pcntl": "7.4", "ext-posix": "7.4" } }, "extra": { "laravel": { "dont-discover": [] } }, "autoload": { "psr-4": { "App\": "app/", "Database\Factories\": "database/factories/", "Database\Seeders\": "database/seeders/" } }, "autoload-dev": { "psr-4": { "Tests\": "tests/" } }, "minimum-stability": "dev", "prefer-stable": true, "scripts": { "post-autoload-dump": [ "Illuminate\Foundation\ComposerScripts::postAutoloadDump", "@php artisan package:discover --ansi" ], "post-root-package-install": [ "@php -r \"file_exists('.env') || copy('.env.example', '.env');\"" ], "post-create-project-cmd": [ "@php artisan key:generate --ansi" ], "post-update-cmd": [ "@php artisan horizon:publish --ansi" ] } }
2. broadcasting.php中的Pusher配置
'pusher' => [ 'driver' => 'pusher', 'key' => env('PUSHER_APP_KEY'), 'secret' => env('PUSHER_APP_SECRET'), 'app_id' => env('PUSHER_APP_ID'), 'options' => [ 'cluster' => env('PUSHER_APP_CLUSTER'), 'encrypted' => true, 'host' => '127.0.0.1', 'port' => 6001, 'scheme' => 'https', 'curl_options' => [ CURLOPT_SSL_VERIFYHOST => 0, CURLOPT_SSL_VERIFYPEER => 0, ] ], ],
3. websockets.php配置
<?php use BeyondCode\LaravelWebSockets\Dashboard\Http\Middleware\Authorize; return [ 'dashboard' => [ 'port' => env('LARAVEL_WEBSOCKETS_PORT', 6001), ], 'apps' => [ [ 'id' => env('PUSHER_APP_ID'), 'name' => env('APP_NAME'), 'key' => env('PUSHER_APP_KEY'), 'secret' => env('PUSHER_APP_SECRET'), 'enable_client_messages' => false, 'enable_statistics' => false, 'encrypted' => true, ], ], 'ssl' => [ 'local_cert' => '/etc/letsencrypt/live/contento-demo2.net/fullchain.pem', 'local_pk' => '/etc/letsencrypt/live/contento-demo2.net/privkey.pem', 'passphrase' => null, 'verify_peer' => false, ], 'app_provider' => BeyondCode\LaravelWebSockets\Apps\ConfigAppProvider::class, 'allowed_origins' => [ // ], 'max_request_size_in_kb' => 250, 'path' => 'laravel-websockets', 'middleware' => [ 'web', Authorize::class, ], 'statistics' => [ 'model' => \BeyondCode\LaravelWebSockets\Statistics\Models\WebSocketsStatisticsEntry::class, 'logger' => BeyondCode\LaravelWebSockets\Statistics\Logger\HttpStatisticsLogger::class, 'interval_in_seconds' => 60, 'delete_statistics_older_than_days' => 60, 'perform_dns_lookup' => false, ], 'channel_manager' => \BeyondCode\LaravelWebSockets\WebSockets\Channels\ChannelManagers\ArrayChannelManager::class, ];
错误触发代码片段
错误发生在调用pusher->trigger时,payload中的socket变量为null:
/** * Broadcast the given event. * * @param array $channels * @param string $event * @param array $payload * @return void * * @throws \Illuminate\Broadcasting\BroadcastException */ public function broadcast(array $channels, $event, array $payload = []) { $socket = Arr::pull($payload, 'socket'); $response = $this->pusher->trigger( $this->formatChannels($channels), $event, $payload, $socket, true ); if ((is_array($response) && $response['status'] >= 200 && $response['status'] <= 299) || $response === true) { return; } throw new BroadcastException( ! empty($response['body']) ? sprintf('Pusher error: %s.', $response['status']) : 'Failed to connect to Pusher.' ); }
解决方案建议
1. 降级Pusher PHP Server版本
当前使用的pusher/pusher-php-server:^7.2与Laravel 8.9.0的Broadcast组件存在参数兼容性问题,尝试降级到^6.0:
- 修改composer.json中
pusher/pusher-php-server的版本为^6.0 - 执行
composer update pusher/pusher-php-server
2. 重写Broadcaster类修复参数传递
当socket为null时,Pusher 7.x要求第4个参数为数组而非null,通过自定义Broadcaster类修复:
- 创建
app/Broadcasting/PusherBroadcaster.php:
<?php namespace App\Broadcasting; use Illuminate\Broadcasting\BroadcastException; use Illuminate\Broadcasting\PusherBroadcaster as BaseBroadcaster; use Illuminate\Support\Arr; class PusherBroadcaster extends BaseBroadcaster { public function broadcast(array $channels, $event, array $payload = []) { $socket = Arr::pull($payload, 'socket'); // 当socket为null时传递空数组 $response = $this->pusher->trigger( $this->formatChannels($channels), $event, $payload, $socket ?? [], true ); if ((is_array($response) && $response['status'] >= 200 && $response['status'] <= 299) || $response === true) { return; } throw new BroadcastException( ! empty($response['body']) ? sprintf('Pusher error: %s.', $response['status']) : 'Failed to connect to Pusher.' ); } }
- 修改
config/broadcasting.php中的Pusher配置,指定自定义类:
'pusher' => [ 'driver' => 'pusher', 'broadcaster' => App\Broadcasting\PusherBroadcaster::class, // 添加此行 'key' => env('PUSHER_APP_KEY'), // 其他配置保持不变 ],
3. 检查仪表盘消息发送逻辑
确认仪表盘发送消息时是否未正确传递socket参数,可临时在发送时强制添加空socket参数,或调整仪表盘发送逻辑。
内容的提问来源于stack exchange,提问作者Ralf Janzen
相关产品推荐
相关产品推荐

