Я понимаю, что в командной строке нет веб-сервера, поэтому вы не можете получить доступ к $_SESSION
. Но я не знаю, что еще делать.
Я слежу за этим учебным пособием, чтобы создать чат с помощью веб-сайтов: http://www.phpbuilder.com/articles/application-architecture/optimization/creating-real-time-applications-with-php-and-websockets.html
Моя проблема в том, что я не знаю, как безопасно получить имя пользователя отправителя сообщения. Я мог бы включить его в функцию отправки сообщений, но поскольку он находится в Javascript, каждый может просто изменить свое имя пользователя для кого-то.
Как я могу безопасно получить имя пользователя, которое является $_SESSION['username']
?
var Server; Server = new FancyWebSocket('ws://0.0.0.0:9000'); send( "test" );
Я открыт для всех предложений, таких как альтернативы веб-сайтам. Я создаю чат реального времени для своего веб-сайта.
Первая альтернатива – это, конечно же, запросы AJAX. У AJAX нет проблем с тем, что вы не можете быстро и легко получить доступ к сеансам, которые есть в WebSockets. Любая достаточно частая частота дискретизации неотличима от реального времени.
Теперь, к моему довольно длинному решению, реализованному в WebSockets:
Заголовки HTTP доступны для сервера WebSocket во время рукопожатия, включая файлы cookie. На сервере, который вы используете, PHP-Websockets , заголовки хранятся в свойстве $headers
.
Например:
var_dump($user->headers); array(14) { ["get"]=> string(8) "/echobot" ["host"]=> string(14) "127.0.0.1:9000" ...snip... ["cookie"]=> string(100) "PHPSESSID=jan9uknpc06mk4ddghph4870t1; MyCookie=My+Value%21%40%23%24%25; MyNonhttponlyCookie=My+Value" }
Эти файлы cookie были созданы из
session_start(); $_SESSION['Hi!'] = array('Hello!', 'where' => 'world!'); setcookie('MyCookie', 'My Value;!@#$%', 0, '/', '127.0.0.1', false, true); setcookie('MyNonhttponlyCookie', 'My Value', 0, '/', '127.0.0.1', false, false);
Таким образом, значение $user->headers['cookie']
– это точка с запятой и пробел ( ;
), ограниченная набором пар значений ключа, где значения кодируются URL-адресом и отделяются от его ключа знаком равенства. (PHP жалуется, если вы положили зарезервированные символы в имя файла cookie. Таким образом, ключ cookie не может содержать никаких закодированных URL-адресов.)
Быстрый способ их извлечения состоит в следующем
$cookies = array(); $cookiesParts = explode('; ', $user->headers['cookie']); foreach ($cookiesParts as $cookieParts) { $interimCookie = explode('=', $cookieParts); $cookies[$interimCookie[0]] = urldecode($interimCookie[1]); } var_dump($cookies); array(3) { ["PHPSESSID"]=> string(26) "jan9uknpc06mk4ddghph4870t1" ["MyCookie"]=> string(14) "My Value;!@#$%" ["MyNonhttponlyCookie"]=> string(8) "My Value" }
Теперь у нас есть идентификатор сеанса. Двойная проверка с помощью session_name()
, которая даст вам ключ от файла cookie, который фактически содержит идентификатор сеанса.
Мы могли бы сериализовать и unserialize файл сеанса, хранящийся на сервере, на который указывает session_save_path()
… но я хочу обмануть.
Поскольку встроенная система сеансов блокирует файлы сеанса, мы не можем просто держать файл сеанса открытым и постоянно следить за изменениями, а также не можем сами фиксировать файл в течение длительного периода времени.
Было бы идеально, если бы мы могли использовать магические методы __get()
и __set()
здесь таким же образом, что мы будем использовать $myUser->_session['key'] = 'value';
$_SESSION
(такую как $myUser->_session['key'] = 'value';
) , но PHP не позволяет рассматривать эти методы как массивы. Вместо этого мы должны установить более простой метод.
<?php class MyUser extends WebSocketUser { public $session_id; // gets set somewhere. Good place is probably is your implementation of the `connected($user)` abstract method. public getSession($key) { session_id($this->session_id); session_start(); $val = $_SESSION[$key]; session_write_close(); // very important! return $val; } public setSession($key, $value) { session_id($this->session_id); session_start(); $_SESSION[$key] = value; session_write_close(); // still very important! } }
(Примечание. Я также указываю свой запрос функции на этот вопрос, чтобы основать мою возможную реализацию анализа файлов cookie и обработки сеансов здесь, чтобы я мог вспомнить свое исследование сегодня, когда я работаю.)