You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.06 16:16:09