Laravel Websockets иногда не работает, не доставляет обновления - PullRequest
0 голосов
/ 28 февраля 2020

Я использую этот репозиторий для управления веб-сокетами на Laravel https://github.com/beyondcode/laravel-websockets

Кроме того, я использую последнюю версию всего, Laravel, Laravel Эхо, Ax ios и т. Д. И т. П.

Мой сервер является сервером 2-го (или 3-го?) Уровня Digital Ocean (4 ГБ ОЗУ, 80 ГБ, 2 ВЦП), управляемым через Laravel Forge.

Я на 100% основал свою конфигурацию Forge на этом руководстве https://alex.bouma.dev/installing-laravel-websockets-on-forge/

Один из моих клиентов сообщил, что в какой-то момент они не получали никаких обновлений для внесения изменений в Модуль встреч, ему пришлось обновить страницу sh, чтобы она снова заработала.

Странная часть в том, что он все еще получал сообщения от небольшого модуля чата, который есть в моем приложении и основывается на том же принципе.

Это немного кода: Мой Vue файл:

/**
* Starts listening to update appointments events.
*
*/
updateAppointments() {
    Echo.channel(`update-appointments.${this.office_id}`)
        .listen('.list.new.appointments', (event) => {
            if (!this.isEditingAppointment) {
                this.checkAppointments();
            } else {
                this.pendingUpdateFlag = true;
            }
        })
        .listen('.list.updated.dates', (event) => {
            this.listDates(false);
        })
        .listen('.list.updated.entities', (event) => {
            this.listEntities();
        })
        .listen('.list.updated.locations', (event) => {
            this.listLocations();
            this.listAppointments();
        });
}

Каналы. php:

// Appointments events
Broadcast::channel('update-appointments.{officeId}', function ($user, $officeId) {
    return ($user->hasPermission('appointments') && $user->office_id === $officeId);
});

И одно из событий, AppointmentEvent. php:

namespace App\Events;

use Illuminate\Broadcasting\Channel;
use Illuminate\Broadcasting\InteractsWithSockets;
use Illuminate\Contracts\Broadcasting\ShouldBroadcast;
use Illuminate\Foundation\Events\Dispatchable;
use Illuminate\Queue\SerializesModels;

class AppointmentEvent implements ShouldBroadcast
{
    use Dispatchable, InteractsWithSockets, SerializesModels;

    public $officeId;

    /**
     * Create a new event instance.
     *
     * @param  int  $officeId
     * @return void
     */
    public function __construct($officeId)
    {
        $this->officeId = $officeId;
    }

    /**
     * The event's broadcast name.
     *
     * @return string
     */
    public function broadcastAs()
    {
        return 'list.new.appointments';
    }

    /**
     * Get the channels the event should broadcast on.
     *
     * @return \Illuminate\Broadcasting\Channel|array
     */
    public function broadcastOn()
    {
        return new Channel('update-appointments.' . $this->officeId);
    }
}

Как примечание, я вынужден подписать пользователей на обычные каналы, так как частные не будут работать когда параметр включен в название канала (например, this.office_id), это происходит либо с Laravel Websockets, либо со старым методом Echo + Socket.io + redis, который я использовал в прошлом.

SMALL UPDATE: Когда я писал это сообщение, тот же клиент сообщил, что он не получил некоторые сообщения чата, я спросил его, может быть, отправитель набрал оба сообщения очень быстро или что-то в этом роде, возможно, сервер поддельного толкателя недостаточно быстр, чтобы действительно обновлять сообщения. короткие периоды времени? но да, Websockets сейчас не надежен.

Может быть, это как-то связано с тем, как я настроил Websockets на моем сервере forge? недостаточно ресурсов выделено? но, честно говоря, это странно, потому что сейчас, вероятно, менее 10 человек используют приложение, так как оно находится на стадии тестирования.

Я надеюсь, что вы можете дать мне решение этой проблемы.

Заранее спасибо.

...