所以我在一个讨论平台上工作,各种客户都会访问http://host/thread.php
,除了提交新帖子的表单之外,这将呈现讨论线程的最新状态。当提交新帖子时,我希望所有其他打开浏览器窗口的客户端都能近乎实时地显示它。
我的脚本的限制之一是它可能不使用 DBMS,并且必须保留在文件系统中。此外,我不能对 IPC 使用任何 PECL/PEAR 扩展,例如 inotify 或类似的东西。
流程将如下所示:
- 客户端A请求 thread.php 并且该线程到目前为止是空的,但它仍然在
eventPusher.php
. - 客户B也是如此。
- 客户A在表格中填写一个帖子并将其提交
POST
给subHandler.php
。 - ???
(subHandler stores the new submission into the main thread storefile which gets read from when a fresh, new client requests thread.php, in addition to somehow signalling to the continually-running eventPusher event-source that a new comment was posted and that it should echo the event-json to the client. How, exactly, it will send this signal I'm yet unsure of, but there are a few options that I've thought of -- this is the crux of the question, so see below for more clarification)
eventPusher.php
愉快地将新事件推送给客户端,并在它最初提交给所有打开页面屏幕的客户端后不久显示。- 利润!
现在对于#4 缺失链接的神秘步骤,我发现了一些问题。我的意思是,无论哪种方式,eventPusher 都会做某种while
循环——它会轮询一些东西,我认为这很清楚。(如果这是一个错误的假设,请告诉我。)现在,最简单的方法是subHandler
在表单提交时调用,将其写入主存储区newComments.xml
,然后退出而不做任何其他事情。然后eventPusher
签到newComments.xml
每 X 秒(顺便说一下,这里合理的时间间隔是多少?),如果它发现了什么,那么它会向客户端发出一个事件。现在,我担心的是服务器的硬盘驱动器将不得不不断地开始旋转。也许情况并非如此,也许它只是被缓存在 RAM 中,而 linux 内核会透明地处理这个问题,这样文件系统访问实际上并不会占用设备,因为内核知道该特定文件从那时起就没有改变最后阅读。* 想法#2:我不知道该怎么做,但也许有一个变量范围存储在系统的通用 RAM 中,任何进程都可以读取它。就像我们超级导出一个 bash 变量一样$new_post
通常是假的,但它会被 subHandler 切换为真,然后在它被推送到客户端后返回到flase。我怀疑 PHP 中是否直接存在这样的变量作用域,但我对变量作用域的概念感到困惑,无论我读到什么,我似乎都无法理解它。* 想法 #3:eventPusherps
在其 whileloop 中查询自身的另一个实例。如果没有另一个 eventPusher 处于活动状态,那么提交新评论的可能性很小。如果这仅在> = 90%的时间内有效,那没关系,它不需要完全万无一失。* 想法#4:eventPusher 查询DMESG
该文件是否最近被写入。
因此,总而言之,我需要近乎实时的 inter-php-script-communication 可以在标准 mod_php 共享主机设置上运行,而无需任何提升的权限、PHP 插件模块或其他无法进行的系统调整在运行时从 PHP 脚本本身完成。在 *out* 将驱动器旋转几次以上的情况下。也没有 SQL 服务器。
抱歉,如果我的英语不是最好的,我仍在努力改进它。