用于GCM和MySQL访问的PHP套接字是否需要多线程

用于GCM和MySQL访问的PHP套接字是否需要多线程,php,mysql,multithreading,sockets,google-cloud-messaging,Php,Mysql,Multithreading,Sockets,Google Cloud Messaging,tl;dr:MySQL操作保持PHP套接字畅通的最佳方法是什么 基本目标:拥有一个PHP+JAXL(XMPP)套接字,通过与谷歌CCS GCM服务器的持久TCP连接进行侦听、读取和写入。这是用这个来完成的 现在我需要处理数据(主要是MySQL),而不阻塞套接字 我想到了什么: 1:将套接字和DB连接放在两个不同的PHP线程中。通信可以通过作业队列进行。我发现的实现基于Geaman、Resque和BeanStalkD。但是,这些线程大多使用主线程和工作线程,因此没有双向通信 2:将基本队列实现

tl;dr:MySQL操作保持PHP套接字畅通的最佳方法是什么

基本目标:拥有一个PHP+JAXL(XMPP)套接字,通过与谷歌CCS GCM服务器的持久TCP连接进行侦听、读取和写入。这是用这个来完成的

  • 现在我需要处理数据(主要是MySQL),而不阻塞套接字
我想到了什么:

1:将套接字和DB连接放在两个不同的PHP线程中。通信可以通过作业队列进行。我发现的实现基于Geaman、Resque和BeanStalkD。但是,这些线程大多使用主线程和工作线程,因此没有双向通信

2:将基本队列实现为全局队列?变量,从DB线程读取作业,并将它们放回另一个队列。(不知道smth lk是否可行)

3:分叉子进程,如中建议的。然后每次我分叉时都必须打开一个DB连接,我想我可以通过某种方式避免这种情况。另外,如何从child调用send()

硬零件:

1:需要双向通信:DB线程必须将结果发送到套接字

2:应在共享主机上工作,例如无Gearman、Redis安装。 另外:没有PHP技能

我在问什么?:

  • 什么是不阻塞插座所需的,什么不是

  • 哪种方法适合我的需要,特别是当我的DB线程必须将作业分配给套接字(“send xy”)时

  • 我在这里理解错了什么


正如你所看到的,我缺乏基本的理解,任何指导都是非常感谢的。非常感谢。

条条大路通罗马,但也许使用是一种解决方案


它是一个事件驱动、非阻塞的PHP I/O库。它可以处理您的需求,而且您不必深入细节来完成任务。

虽然可以使用MySQLi编写异步查询,但您不能在同一个*\u select()调用中将其与网络资源捆绑在一起。但是,您可以(在同一脚本中)轮询异步查询。只需在socket_select()中设置一个短超时,并在同一循环中添加对任何已完成mysql查询的检查。类似于

$wait=0;
while (true) {
    if (socket_select($netread, $netwrite, $netexcept
        , 0, $wait)) {
        // =...handle socket stuff
        $wait=200;
    }
    if (mysqli_poll($dbread, $dberror, $dbreject
         , 0, 0)) {
       //...handle mysql stuff
       $wait=0;
    }
}
(将等待设置为非零值可防止进程在不执行任何操作的情况下占用所有CPU)
或者,您可以使用sigallarm触发轮询。

查看此版本的dnode for PHP:


有助于使流程通信

通常要与GCM通信,您应该有一个单独的流程来进行通信。不建议从PHP执行此操作。如果不想编写推送服务器,可以使用第三方服务进行推送。我可以向GCM接收和发送消息,并处理ACK。我链接了上面的代码,它的工作原理如下:$GCMSender=new GCMSender()$GCMSender->processGCMs()我不明白如何“离线”处理消息并发回消息。