Доступ к сеансу в командной строке PHP?

Я понимаю, что в командной строке нет веб-сервера, поэтому вы не можете получить доступ к $_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 и обработки сеансов здесь, чтобы я мог вспомнить свое исследование сегодня, когда я работаю.)