2014-08-30 38 views
0

我正在创建一个PHP API,它创建了一个与我的Java SocketServer的客户端套接字连接。这将用于聊天应用程序的学习目的。通过多个请求的PHP套接字标识

所以我现在设置了整个API,我有点想知道如何识别我的套接字。要存储套接字,我打算将其存储在$ _SESSION中。我读过套接字ID不是识别它的好方法。

在会话中存储套接字的最佳方式是什么?我可以有一些代码示例吗?

提前致谢!

+0

嘿@Timon,除非在这里缺少一些信息,否则您将无法在$ _SESSION中存储套接字 - 套接字就像文件句柄一样是资源。由于不同的请求可能由不同的工作进程处理(不能共享句柄),因此您不能将这些资源存储以供以后使用。如果你需要在请求之间持久化身份,转发PHP会话ID到你的Java服务器可能是更好的方法,这样你就可以恢复会话状态,即使套接字不一样 – Leigh 2014-09-01 21:51:10

+0

@Timon为什么不绑定一些salt(唯一ID)到您的套接字ID,然后使用一些加密技术。这将节省你的套接字ID并且你很容易识别它。为你的作品 – 2014-09-08 13:08:10

+0

如果不是很困难(实现),你将无法在不同的编程平台之间共享会话。我建议你使用消息队列系统,比如[Ratchet](http://socketo.me/)来完成消息的推送和拉取。顺便说一句,[这里的这个问题](http://stackoverflow.com/questions/25273500/rachet-chat-application-connection-closed-immediately-after-established-when-t)只需要创建一个新的PHP聊天应用程序与laravel开箱即用 – Mysteryos 2014-09-08 16:30:51

回答

0

你不能在请求之间“存储”一个套接字,它只是不能以这种方式工作。

你可以做的是通过该套接字发送会话ID(或其他类似的令牌),以便接收端(您的Java应用程序)可以通过会话ID识别不同的客户端。

1

你可以试试这个方法: 1)做一个独立的PHP是创建一个套接字客户端,然后启动一个infitive循环:用token_id表示 2)在每个循环它检查chat_table的聊天会话 3)如果有来自用户的新消息,你的PHP通过套接字连接 4)usleep(200000); //

所以,如果你接受主PHP将启动这些独立的PHP通过EXEC(),如:

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

这些argumants“&”这个过程会在后台进行处理你的主要的PHP不会等待那一行。 在你client.php你可以在$的sessionId有:

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

后一个预先定义的到期时间你infitive环client.php可自行停止。该表中没有关于该会话中断的活动。