【问题标题】:Sleep function in "async" php request is halting interaction in other requests?“异步” php 请求中的睡眠功能正在停止其他请求中的交互?
【发布时间】:2016-04-06 22:24:05
【问题描述】:

这是我的后端布局:通过与php_script 通信的 socket.io 套接字发出请求。 PHP 返回到 socket.io,它向php_script2 发送另一个请求,并回答有关原始请求的前端(到php_script)。 php_script2 在其算法中休眠并偶尔将数据发送回套接字层。当php_script2 正在运行时,当发出原始请求的同一用户尝试与套接字交互时,就会出现问题。 (前端在尝试向 socket.io 发送新信息时冻结)。这是:

1 - 用户发送输入

2 - socket.io 收到输入

3 - socket.io 使用以下选项将输入作为 http_request 发送到 php:

var options = {
    host : 'localhost',
    path : path,
    method : method_type,
    rejectUnauthorized: false,
    requestCert: true, 
    agent: false,
    headers : headers
};

4 - PHP (php_script) 处理请求并将反馈发送到套接字层

5 - 套接字层在 functionToPhp 中接收反馈,与用户套接字socket.emit("success") 交互并向php_script2 发出新的 php 请求,选项与之前相同

6 - 前端确认接收到数据包(php_script2 正在运行)并且如果用户尝试向需要与 php 进行新交互的套接字发送新信息,则前端元素冻结(在这种情况下为textarea,一旦从 socket.io 收到“成功”,它就会冻结但解冻)。它仅在 php_script2 结束其所有进程(包括睡眠)时解冻,而它应该解冻正确离开。

我这样做(nodejs->php->nodejs=>php->nodejs)正是因为我不希望用户对nodejs的原始请求被“卡住”,所以,就在第二个nodejs 层(在=> 之前)我向用户输出“成功”并从 nodejs 向 php 发出一个新请求,以模仿threading 并异步。不幸的是,这没有发生,用户仍在等待php_script2 结束后的回调。为什么这行得通?我了解服务器的工作原理,但我并不真正了解如果从本地主机的角度再次发出请求,它如何保持绑定。我希望我很清楚,tyvm 为您提供帮助...

【问题讨论】:

  • 一些代码会很好。
  • 我们需要代码,你的实现模式比解释你当前架构的大量文本要好得多......我也很困惑套接字是在哪里真正实现的,但哪种技术:NodeJS? PHP 套接字? 3rd 方 JavaScript 套接字?

标签: php node.js multithreading sockets


【解决方案1】:

php_script2 处于休眠状态时,它不会响应来自同一客户端会话的任何新请求,因为它处于休眠状态。 PHP 不会创建php_script2 的新“实例”或进程。

尝试定期 ping 您的 PHP 脚本以获取来自客户端的数据,而不是使用 PHP 脚本 sleep()。这个问题中有一些有用的信息:How can I stop PHP sleep() affecting my whole PHP code?

【讨论】:

  • 我最终使用了 session_write_close() ,效果很好,非常感谢您的帮助!
猜你喜欢
  • 2021-04-28
  • 1970-01-01
  • 2015-08-05
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-05-09
  • 1970-01-01
相关资源
最近更新 更多