【问题标题】:PHP Socket identification through multiple requestsPHP Socket 通过多个请求识别
【发布时间】:2014-10-24 04:45:06
【问题描述】:

我正在制作一个 PHP api,它创建一个与我的 Java SocketServer 的客户端套接字连接。这将用于用于学习目的的聊天应用程序。

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

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

提前致谢!

【问题讨论】:

  • 嘿@Timon,除非此处缺少某些信息,否则您将无法在 $_SESSION 中存储套接字 - 套接字是像文件句柄一样的资源。由于不同的请求可能由不同的工作进程(不能共享句柄)处理,因此您不能存储这些资源以供以后使用。如果您需要在请求之间保留身份,将 PHP 会话 ID 转发到您的 Java 服务器可能是一种更好的方法,这样即使套接字不同,您也可以恢复会话状态
  • @Timon 为什么不将一些盐(唯一 ID)绑定到您的套接字 ID,然后在其上使用一些加密技术。这将保存您的套接字 ID,您可以轻松识别它。希望它对您有用
  • 如果不是很难(实施),您将无法在不同的编程平台之间共享会话。我建议您使用消息队列系统,例如Ratchet 来进行消息的推送和拉取。顺便说一句,this question here 拥有开箱即用的 laravel 创建一个新的 PHP 聊天应用程序所需的一切

标签: php sockets session udp client


【解决方案1】:

你可以试试这个方法: 1)制作一个独立的php,它创建一个套接字客户端,然后开始一个不定式循环: 2) 在每个循环中,它都会检查带有 token_id 的 chat_table,表明该聊天会话 3)如果有来自用户的新消息,您的 php 通过套接字连接将其发布 4) 睡眠(200000); //

因此,如果可以接受,您的主 php 将通过 exec() 启动这些独立 php,例如:

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

使用这些参数“&”,此过程将在后台处理,您的主 php 不会等待该行。 在您的 client.php 中,您可以使用 $sessionId :

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

在预定义的过期时间之后,您的不定式循环 client.php 可以自行停止。对于它中断的会话,表中没有任何活动。

【讨论】:

    【解决方案2】:

    你不能在请求之间“存储”一个套接字,它只是不能那样工作。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-06-23
      • 1970-01-01
      • 2018-05-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-16
      • 1970-01-01
      相关资源
      最近更新 更多