使用保持活动连接 (HTTP 1.1) 在 PHP 中创建类似 ftp 的会话


Using keep-alive connections (HTTP 1.1) to create ftp-like sessions in PHP

我正在寻找一种方法来跟踪跨请求保持活动状态的HTTP 1.1连接,以便获得类似ftp的会话。这个想法是在第一次请求时进行身份验证,然后在套接字仍处于打开状态时保持身份验证有效(使用 HTTP 1.1 保持活动功能)。

我一直在寻找这样的解决方案,但直到这里都没有多大成功。

我正在寻找信息,例如:

  • 在 PHP 中是否有 apache 提供的套接字 ID?
  • 是否有一个模块允许向HTTP 1.1连接添加信息(可以从PHP使用)?

还有其他想法吗?

你不能那样做。

我不认为 Apache(或任何 Web 服务器)将套接字 ID 暴露给 PHP 脚本。但是,可以使用$_SERVER['REMOTE_ADDR']$_SERVER['REMOTE_PORT']唯一标识连接,因为同一客户端无法同时从同一临时端口启动与同一服务器的两个连接。

但是,即使您这样做,保持活动会话也可能不会像FTP那样保留足够长的时间,以允许有意义的人机交互。大多数保持活动状态会话会在 5-15 秒后自动终止,具体取决于 Web 服务器的配置。您也许可以对此进行调整,但是保持连接存活的时间超过此时间是一个非常糟糕的主意,尤其是在将Apache与mod_php一起使用时,因为持久的连接可能会以牺牲其他用户为代价来独占服务器资源。此外,计算机和路由器倾向于重复使用临时端口,因此无法保证您正在与同一用户交谈。当您考虑到人们每天使用的所有代理和反向代理时,事情会变得更加复杂。

只需使用会话和/或 Cookie。他们总是工作。

如果你不仅限于 apache,并且可以简单地运行 php 脚本,我认为你可以做到。

http://php.net/manual/en/book.sockets.php

PHP 允许您打开特定端口并对其进行低级读写。通过这种方式,您可以编写任何现有或自己的协议。

对于这种特殊情况,您可以让 apache 在非 http 端口上运行,并侦听来自自定义 PHP 脚本的 http 端口。然后,您应在连接时对请求进行身份验证;为 user 附加一个自定义标头(称为 myauth),然后将请求转发给 Apache 。确保在读取原始 http 请求时过滤掉 myauth 标头。