![]() |
1
3
我认为你这里的主要问题是平行性。Apache和PHP并不擅长这样的任务,100多个用户有一个开放的HTTP请求。 如果在while(true)中,您将0.1秒的时间花在CPU限制的工作负载(检查更改状态或其他有用的东西)上,并将1秒的时间花在睡眠上,那么当您有10个用户在线聊天时,这将导致100%的CPU负载。因此,为了使用这种聊天模式服务更多的用户,您必须优化while(真)周期的工作负载和/或将睡眠间隔从1秒提高到3秒或更高。 我所做的是为共享内存中的消息和状态信息实现一个快速的“环形缓冲区”(sysv在过去-今天我可能会使用APC或memcached)。所有操作都在缓冲区中写入和读取,缓冲区本身会定期“刷新”到数据库中以持久化它(但每个用户每秒不到一次)。如果不需要持久性,当然可以省略后端。 通过这种方式,我可以为大约500%的用户提供服务。 但一旦你解决了这个问题,你将面临另一个问题:可用的系统内存(100+apache进程,每个进程大约5MB—很有趣)和进程上下文切换开销。你拥有的进程越活跃,你的操作系统在分配“足够公平”的CPU插槽上花费的开销就越大。 您将看到,对于您的用例,仅使用apache和PHP很难有效地进行扩展。不过,有基于客户端和服务器的开源工具可以提供帮助。我记得有一个在apache之前放置了一个服务器,在内部对消息进行排队,同时与javascript客户机进行非常有效的多套接字通信,使真正的“推”事件成为可能。不幸的是,我不记得任何名字,所以你将不得不研究或希望在stackoverflow社区带来什么我的大脑丢弃allready;) 编辑:
让我们再次并行访问10个用户: 如果有10*0.1s的CPU时间在3.1秒(3秒休眠+0.1秒执行)而不是1.1秒的时间段内“延长”,则计算值为1/3.1=%32 这是合乎逻辑的。如果您的检查周期查询后端的速度慢了三倍,那么您的系统上只有三分之一的负载。
我也不会再“分裂”了。并行处理的PHP进程越少,对系统和您来说就越容易。除非你认为这是完全有意义的,因为一种类型的通知比另一种类型的通知需要更多的查询资源,你希望有不同的刷新时间或类似的东西。但即使这样,也可以在whyile循环中决定。用户“离开”——状态可以每30秒检查一次,而他可能写的消息可以每3秒检查一次。没有理由创造更多的周期。只是不同的计数器变量或在模运算中使用右除数。 PHP的发明者说,他认为人类太局限于控制并行进程:)
好吧,让我们建立一个公式。我们有这些变量: 一个周期的持续时间(C) CPU负载(l) l=u l=u 对于30个用户,假设执行时间为0.1秒,睡眠时间为1秒 l=30*0.1/(0.1+1) 长=2.73 l=%273 CPU利用率(即需要3个核:P) 超过capab。你的CPU周期将比你预期的运行时间长。总体响应时间将增加(cpu运行热) |
![]() |
2
0
PHP阻止所有sleep()和system()调用。你真正需要的是研究pcntl\u fork()。幸运的是,我在十多年前就遇到了这些问题,您可以查看我的大部分代码。 我需要一个PHP应用程序,它可以连接到多个IRC服务器,坐在无限的IRC聊天室中,调节,与人交互,并接收来自人的命令。所有这些以及更多的工作都是以一种高效的方式进行的。 你可以在 http://sourceforge.net/projects/phpegg/ 您想要的代码在源代码中/connect公司. |
![]() |
Karlo · PHP Sqlite PDO最新版本 4 月前 |
![]() |
Malte · 检查远程服务器上是否存在文件(使用PHP)[关闭] 4 月前 |
![]() |
Bard.Mus · 迁移后的数据库字符集环境 5 月前 |