2014-08-30 2 views
0

Я создаю PHP api, который создает соединение сокетов клиента с моим Java SocketServer. Это будет использоваться для приложения чата для обучения.PHP Идентификация сокета по нескольким запросам

Итак, я настраиваю весь api в данный момент, и я немного удивляюсь, как я должен идентифицировать свой сокет. Чтобы сохранить сокет, я планирую его сохранить в $ _SESSION. Я прочитал, что идентификатор сокета не является хорошим способом идентифицировать его.

Каков наилучший способ хранения сокета в сеансе, и могу ли я иметь примеры кода?

Заранее благодарен!

+0

Hey @Timon, если здесь нет какой-либо информации, вы не сможете сохранить сокет в $ _SESSION - сокет - это ресурс, такой как дескриптор файла. Поскольку различные запросы могут обрабатываться различными рабочими процессами (которые не могут передавать дескрипторы), вы не сможете хранить эти ресурсы для использования позже. Если вам нужно сохранить идентификаторы между запросами, пересылка идентификаторов сеансов PHP на ваш Java-сервер может быть лучшим способом сделать это, чтобы вы могли возобновить состояние сеанса, даже если сокеты не совпадают. – Leigh

+0

@Timon, почему бы вам не связать некоторые соль (уникальный идентификатор) к вашему идентификатору сокета, а затем использовать на нем некоторую технику шифрования. это сохранит ваш идентификатор сокета, и вы его легко идентифицируете. Надеемся, что он работает для вас. –

+0

Вы не сможете, если не очень сложно (реализовать), делиться сеансами между различными платформами программирования. Я предлагаю вам использовать систему очереди сообщений, такую ​​как [Ratchet] (http://socketo.me/), чтобы делать push и pull сообщений. Кстати, [этот вопрос здесь] (http://stackoverflow.com/questions/25273500/rachet-chat-application-connection-closed-immediately-after-established-when-t) имеет все необходимое, чтобы создать новый PHP-чат приложение с laravel из коробки – Mysteryos

ответ

0

Вы не можете «хранить» сокет между запросами, он просто не работает таким образом.

Что вы можете сделать, это отправить идентификатор сеанса (или другой похожий токен) через этот сокет, чтобы получающая сторона (ваше приложение Java) могла идентифицировать разных клиентов с помощью идентификаторов сеанса.

1

вы можете попробовать этот способ: 1) сделать самостоятельную PHP, который создает сокет клиент, а затем начинает infitive цикла: 2) в каждом цикле он проверяет chat_table с token_id указует, что сеанс чата 3) Если есть новое сообщение от пользователей, ваше сообщение php его через сокетное соединение 4) usleep (200000); //

Так что, если его приемлемый ваш главный PHP будет инициировать эти самостоятельный PHP с помощью Exec(), как:

exec('php -f client.php '.escapeshellarg($sessionId).' > /dev/null &'); 

с этим argumants «&» этот процесс будет обрабатываться в фоновом режиме вашего главный РНР НЕ дождитесь этой строки. На вашем client.php вы можете за $ SESSIONID с:

$sessionId = $_SERVER['argv'][1]; 

После предопределенного истекает время ваш infitive зацикленной client.php может остановить себя. в таблице нет активности в этом сеансе, который он прерывает.

Смежные вопросы