PHP while(true)循环用于文件更新


PHP while(true) loop for file updates

我手头有以下问题:

我让用户在两个独立的页面上,但将页面输入保存到同一个文本文件中。当一个用户正在编辑时,另一个用户不能。我通过会话和编写更改来跟踪这一点,谁来编辑它就在一个文件中。

到目前为止工作良好,最终的输出非常类似于聊天。然而,现在我让用户手动实现他们的页面并重新加载文件。我想做的是,当文件时间戳发生变化时,让页面执行重定向(以指示最后一个用户保存了他们的编辑,其他用户转向)。我研究了一下javascript shortpolling,但后来发现了php filmtime函数,它看起来更容易使用。这是我得到的:

while(true){
   $oldtimestamp=filemtime(msks/$session['user']['kampfnr'].txt);
   $waittimer=2;
   $waittimer++;
   sleep($waittimer);
   $newtimestamp=filemtime(msks/$session['user']['kampfnr'].txt);
   if ($eintragszeit2 > $eintragszeit1){
       addnav("","kampf_ms.php?op=akt");
       redirect("kampf_ms.php?op=akt");
   }}

理论上,当用户看到输出时,"它……轮到编辑文件了。"这应该在后台循环,检查文件是否已经更新,如果已经更新,则重定向用户。

实际上,这会严重影响服务器性能(我在共享主机上),直到出现内存超出错误消息。

代码有问题吗?或者在这种情况下使用while循环通常是个坏主意?

提前感谢!

PHP语言应仅用于生成web内容(客户端向服务器发出请求=>服务器调用所需的脚本,并将响应返回给客户端)。一旦页面加载并显示给客户端,连接就会关闭,因此互联网可能会崩溃,客户端不会得到通知。。。

因此,使用无限循环,不仅客户端可以等待响应。。。无限长的时间,但服务器可能会因为负载而受到严重影响。。。实际上这是一个非常糟糕的主意:)

PHP不能用于进行双向通信:它只是被调用来构建客户端需要的网页,因此他不能"在后台"做任何事情(不能直接,有效地说,你可以调用外部脚本,但不能通知客户端…)

此外,要进行双向通信,php和"常规"http是不好的,因为客户端/服务器架构(服务器只回答客户端请求,它是被动的)

我可以建议使用WebSocket协议,做一个聊天应用程序:

http://socket.io/

https://en.wikipedia.org/wiki/WebSocket

但为此,您需要使用"主动"服务器解决方案,如node.js或ruby(取决于您的服务器功能…)

如果您想留在php中,另一种方法是客户端每10秒发出一次Ajax请求,例如,调用一个检查文件的php脚本,并在文件更新时向客户端发回一条消息,但由于性能损失严重,它确实被弃用了,所以请立即忘记它。