1

Тема: Real-time діалоги / Long-Polling / Laravel

Почав писати CMS на базі фреймворка Laravel.
В приватних повідомленнях вирішив реалізувати "живу" переписку, тобто повідомлення з'являються миттєво у обох користувачів після надсилання.
Я знайомий з веб-сокетами на PHP (Ratchet) (про Node.js теж в курсі), але вони вимагають VDS/Сервера, а я хочу щоб все працювало і на shared хостингу, тому вибрав технологію AJAX Long-Polling, трохи помудрував щоб все прикрутити і ок, поїхало.
Проблема ось в чому, запит на надсилання повідомлення користувачеві проходить через весь фреймворк (index.php єдина точка входу), а він (громіздкий фреймворк) створює оверхед ще до того, як повідомлення пишеться в файл/бд, відповідно Long-Polling сервер ловить нове повідомлення трохи пізніше, на долі секунди (але це помітно).
Коли я надсилаю повідомлення в обхід фреймворка, повідмолення прилітають дійсно миттєво.
Отож, залишити все як є чи ж писати костилі в index.php ще до автолоада фреймворка для пришвидшення реал-тайму?
Потрібно враховувати, що там потрібно подбати про безпеку (хто кому надсилає), створити власне підключення до бд (без фреймворка)..

<?php
//тестове надсилання повідомлення
//if(isset($_POST['message'])) {
    //file_put_contents('data.txt', $_POST['message'], LOCK_EX);
    //exit;
    //}

/**
 * Laravel - A PHP Framework For Web Artisans
 *
 * @package  Laravel
 * @author   Taylor Otwell <taylor@laravel.com>
 */

/*
|--------------------------------------------------------------------------
| Register The Auto Loader
|--------------------------------------------------------------------------
|
| Composer provides a convenient, automatically generated class loader for
| our application. We just need to utilize it! We'll simply require it
| into the script here so that we don't have to worry about manual
| loading any of our classes later on. It feels nice to relax.
|
*/
        
function shutdown() {
    
    $error = error_get_last();
    
    if (is_array($error) && in_array($error['type'], [E_ERROR, E_PARSE, E_CORE_ERROR, E_COMPILE_ERROR])) 
    {
        while (ob_get_level()) 
        {
            ob_end_clean();
        }
        header('HTTP/1.0 200 OK');
       die('0');
    }
}

register_shutdown_function('shutdown');

require __DIR__.'/../bootstrap/autoload.php';

/*
|--------------------------------------------------------------------------
| Turn On The Lights
|--------------------------------------------------------------------------
|
| We need to illuminate PHP development, so let us turn on the lights.
| This bootstraps the framework and gets it ready for use, then it
| will load up this application so that we can run it and send
| the responses back to the browser and delight our users.
|
*/

$app = require_once __DIR__.'/../bootstrap/app.php';

/*
|--------------------------------------------------------------------------
| Run The Application
|--------------------------------------------------------------------------
|
| Once we have the application, we can handle the incoming request
| through the kernel, and send the associated response back to
| the client's browser allowing them to enjoy the creative
| and wonderful application we have prepared for them.
|
*/

$kernel = $app->make(Illuminate\Contracts\Http\Kernel::class);

$response = $kernel->handle(
    $request = Illuminate\Http\Request::capture()
);

$response->send();

$kernel->terminate($request, $response);
=)
Подякували: 221VOLT1