Тема: 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);