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

时间:2015-01-23 16:28:20

标签: php mysql multithreading sockets google-cloud-messaging

tl; dr:保持PHP套接字不被MySQL操作阻止的最佳方法是什么?

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

  • 现在我需要处理数据(主要是MySQL)而不阻止套接字。

我有什么想法:

1:在两个不同的PHP线程中使用Socket和DB连接。通信可以通过JobQueues工作。我发现基于Geaman,Resque,BeanStalkD的实现。但是,这些工作主要使用Master和Worker线程,因此没有双向通信。

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

3:在here中提出的分叉子进程。然后我每次拨打时都要打开一个数据库连接,我认为我可以在某种程度上避免这种情况。另外,如何从孩子调用send()?

硬件:

1:需要双向通信:DB Thread必须将结果发送到Socket

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

我在问什么?:

  • 什么不阻止Socket,什么不阻止?

  • 哪种方法适合我的需要,特别是当我的DB-Thread必须将作业分配给Socket时("发送xy")?

  • 我在这里理解错了什么?

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

3 个答案:

答案 0 :(得分:2)

所有道路都通往罗马,但也许使用React PHP是您的解决方案。

这是一个用于PHP的事件驱动的非阻塞I / O库。它可以满足您的要求,而且您无需深入了解具体情况即可完成工作。

答案 1 :(得分:2)

虽然可以使用MySQLi编写异步查询,但您无法在同一个* _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) 或者,您可以使用SIGALARM来触发轮询。

答案 2 :(得分:1)

查看PHP的这个版本的节点:

https://github.com/bergie/dnode-php

有助于进行沟通的过程