Ошибка из-за ошибки при отладке метода MessageComponentInterface - PullRequest
0 голосов
/ 25 ноября 2018

В моем приложении laravel 5.7 я использую MessageComponentInterface для приложения чата с классом, подобным

<code><?php

namespace App\Classes\Socket;

use App\Classes\Socket\Base\BaseSocket;
use Ratchet\MessageComponentInterface;
use Ratchet\ConnectionInterface;

class ChatSocket extends BaseSocket
{
    protected $clients;

    public function __construct()
    {
        $this->clients = new \SplObjectStorage;
    }

    public function onOpen(ConnectionInterface $conn) {
        $this->clients->attach($conn);
        echo '<pre>New Connection ::'.print_r($conn->resourceId,true).'
';} публичная функция onMessage (ConnectionInterface $ from, $ msg) {$ numRecv = count ($ this-> клиентов) -1;echo '
onMessage $msg::' . print_r( $msg, true ) ;
//        var_dump($from);
        dump($from);
        die("-1 XXZ000");
        echo '<pre>onMessage $from::' . print_r( $from, true ) ;
        ...
</code>

Проблема в том, что в событии onMessage я хочу, чтобы это сообщение записывалось в таблицу БД, но я не могу найти, где взять user_id пользователя, отправившего это сообщение?Я попытался отладить вывод значений на экран с помощью

echo '<pre>onMessage $from::' . print_r( $from, true ) ;

Но я получил ошибку памяти, но в /etc/php/7.2/cli/php.ini я изменил параметры:

max_execution_time = 3330
max_input_time = 240
memory_limit = 4048M

и перезапустил мой сервер, но все равно я получил ошибку памяти

, используя эти методы:

//        var_dump($from);
        dump($from);

Я получил бесконечный вывод в консоли, и я ничего не мог поймать ...

Как отладить эти значения?

ОБНОВЛЕНО # 2 Я пробую пример в https://laravel.io/forum/01-16-2015-loading-laravels-session-using-ratchet статье, но когда я попытался запустить его методом:

public function onMessage(ConnectionInterface $from, $msg) {
    $from->session->start();
    $idUser = $from->session->get(Auth::getName());

Я получил ошибку:

Undefined property: Ratchet\Server\IoConnection::$session

В упомянутой статье был комментарий:

(вы должны расшифровать cookie, чтобы получить идентификатор сеанса в Laravel 5):

Я ищу это, я нашел это

В контексте веб-запроса куки обычно автоматически шифруются и дешифруются промежуточным ПО EncryptCookies.Поэтому самым простым вариантом было бы просто включить это промежуточное ПО (и оно включено по умолчанию в Laravel).

и в моем приложении / Http / Kernel.php есть строка с EncryptCookies

protected $middlewareGroups = [
    'web' => [
        \App\Http\Middleware\EncryptCookies::class,

но это веб-приложение, но я запускаю консольное приложение.Может ли причина ошибки в том, что мне нужно добавить EncryptCookies в какую-то другую группу в app / Http / Kernel.php?Или почему ошибка?

Также в файле: ///etc/php/7.2/cli/php.ini я изменил

memory_limit = 8048M

и перезапустил apache

также япопытался проверить, сколько памяти в моем скрипте:

         echo '<pre>onMessage getNiceFileSize(memory_get_usage()) ::' . print_r( $this->getNiceFileSize(memory_get_usage()) , true ) ;
it shows :19241736 ~18 MiB 

сообщение об ошибке:

 Out of memory (allocated 1623195648) (tried to allocate 1600131072 bytes)

Я попытался вычислить и получил значения 1,51 ГиБ и 1,49 ГиБ ...

  • 1) почему memory_get_usage возвращает такое маленькое значение 2) Почему дамп получает 1,5 ГиБ?Это большая ценность 3) Есть идеи, как с этим бороться?4) Auth :: id () ничего не возвращает, и, насколько я понимаю, это не поможет, так как сообщение может быть отправлено другим зарегистрированным пользователем, но в данный момент не зарегистрировано ...

Спасибо!

1 Ответ

0 голосов
/ 30 ноября 2018

Вы видели эту https://laravel.io/forum/01-16-2015-loading-laravels-session-using-ratchet статью?У него есть похожий пример:

public function onMessage(ConnectionInterface $from, $msg) {
    // start the session when the user send a message 
    // (refreshing it to be sure that we have access to the current state of the session)
    $from->session->start();
    // do what you wants with the session 
    // for example you can test if the user is auth and get his id back like this:
    $idUser = $from->session->get(Auth::getName());
    if (!isset($idUser)) {
        echo "the user is not logged via an http session";
    } else {
        $currentUser = User::find($idUser);
    }
    // or you can save data to the session
    $from->session->put('foo', 'bar');
    // ...
    // and at the end. save the session state to the store
    $from->session->save();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...