tl; dr:保持PHP套接字不被MySQL操作阻止的最佳方法是什么?
基本目标:让PHP + JAXL(XMPP)套接字通过与谷歌CCS GCM服务器的持久TCP连接进行侦听,读取和写入。这是使用此CODE完成的。
我有什么想法:
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")?
我在这里理解错了什么?
正如您所看到的,我缺乏基本的理解,我们非常感谢任何指导。非常感谢。
答案 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)