【问题标题】:How to communicate between concurrent sessions in PHP ans JS?如何在 PHP 和 JS 中的并发会话之间进行通信?
【发布时间】:2012-08-17 20:41:46
【问题描述】:

我有 PHP 服务器,我需要在其中更新客户端 A 的某些客户端 B 操作,目前它已完成。它通常是如何完成的?

我目前的解决方案是:

  1. A 留下一个开放的$.ajax(...).done(function myCallBack(){...}); 呼叫。
  2. 当 A 在myCallBack(){...} 中时,它会发出另一个$.ajax(...).done(function myCallBack(){...});。这样,与服务器的通信就可以随时接收新信息了
  3. PHP 必须不断检查会话间通信文件以将数据传输到/从两个并发会话

$.ajax(...).done(function myCallBack(){...}); 保持打开状态(并一直产生新的)是这样做的方法吗?

对于会话间通信 - 有没有办法发出事件或类似的信号(而不是持续监视某些文件 [浪费资源!])?

【问题讨论】:

    标签: php javascript jquery concurrency ipc


    【解决方案1】:

    我就是这样解决的:

    客户端A留下一个开放的ajax调用:$.ajax(...).done(function myCallBack(){...});:在PHP服务器端(会话),A 使用sem_acquire($semaphore_A) 锁定semaphore,然后等待。

    客户端B使用sem_remove($semaphore_A)删除信号量$semaphore_A,从而释放返回给客户端的A JS回调myCallBack().

    当然,它非常简单,我使用shared-memory (e.g. shm_attach())在进程之间交换状态和数据。

    对于其他坚持使用此技术的开发人员:

    我花了这么长时间调试它的原因是我打开了一个会话 (session_start()) 并没有关闭它 (session_ write_ close()) - 这会锁定其他进程并阻止任何并发!

    【讨论】:

      【解决方案2】:

      客户端 A 会向服务器发送数据,客户端 B 需要轮询服务器以请求更改。当有变化时,客户 B 会在下一次投票中得到它们。

      【讨论】:

      • 是的,这就是我在聊天系统中所做的……客户端每 3 秒检查一次新消息
      • 您对让$.ajax(...).done(function myCallBack(){...}); 保持打开状态(并一直产生新的)有什么看法?
      • 我如何在 PHP 服务器上发出会话 A 为会话 B 发送数据的信号?我知道我可以持续监控,但没有更有效的方法吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-21
      • 2020-04-07
      • 1970-01-01
      • 1970-01-01
      • 2018-01-10
      • 1970-01-01
      相关资源
      最近更新 更多