繁体   English   中英

PHP套接字服务器问题(mysql连接,最大连接数限制)

[英]PHP socket server issues (mysql connection, max connections limit)

我需要编写一个套接字服务器,它将至少处理大约1000个(将来会有更多)低流量的永久连接。 我已经出于测试目的在PHP上草拟了一个版本(我们正在开发监视硬件,因此我们需要开发和测试会话协议和硬件功能),当我只有几个客户端连接时,这非常适合我。 但是,当连接数量增加到十个时,出现了一些关键问题。 以下是有关服务器体系结构的一些信息:

我有一个主进程,它等待套接字连接,并在连接时使用pcntl_fork()创建一个子进程(从现在开始为该连接提供服务)。 我也在主进程中建立与MySQL的PDO连接。 所有子进程都共享相同的单个PDO对象。 起初,我担心在同时进行查询时会遇到一些冲突,但是即使通过压力测试,我也没有遇到它们(10个孩子在循环中进行查询而不停止)。 但是每个孩子都有usleep(500000),所以运气不错,尽管我已经进行了几个小时的测试。 但是,即使在连接的1k客户端上也不会出现这样的负载,这是因为它们与服务器之间的对话很少。

所以这是我的第一个问题 :对于大量子进程(理想情况下大约有1000个子进程)使用单个PDO对象是否安全? 我可以为每个孩子使用单个连接,但是MySQL不支持那么多连接。

第二个问题是获取寄生MySQL连接。 如前所述,我只有一个PDO对象。 但是,当我连接了多个客户端,并且在它们运行了一些查询之后,我在mytop中看到存在多个数据库连接,并且我找不到连接数量和子进程数量之间的任何关联。 。 例如,我有3个孩子,和5个DB连接。 我试图建立持久的连接,但并没有改变任何东西。

第二个问题 :是PDO为MySQL提供了这些额外的连接器,还是MySQL驱动程序? 有没有办法强迫他们使用一个连接? 我不认为这是我的错,每次我调用创建PDO对象的方法时,我的代码都会打印警报以进行控制台,并且在脚本开始之前,在派生之前仅发生一次。 之后,我仅使用父级的PDO对象运行子级查询。 由于MySQL的限制,我再也负担不起这么多的连接。

第三个问题 :一千个套接字连接本身是否会成为问题? 除了CPU和数据库负载外,我的意思是。 或者我应该做一些较小的服务器(例如128个连接),如果超过最大连接数,这些服务器将告诉客户端连接到另一台服务器?

预先感谢您的时间和可能的答案。

当前,您最关心的应该是套接字服务器体系结构。 为每个客户分叉一个过程非常繁琐。 AFAIK,一台普通的PC可以忍受大约2000个线程,并且无法快速运行。 在进程之间进行切换意味着CPU应该将其状态保存在内存中,并且如果您有大量的进程,CPU将忙于内存IO,并且几乎没有时间进行实际操作。

您可能想看看Apache的启发。 在Apache中,它们使用固定数量的工作进程/线程,每个进程/线程通过select函数和套接字在非阻塞模式下与多个客户端一起工作。 这是一种更为可靠的方法。

关于数据库IO,我将产生一个将成为数据库连接唯一所有者的进程/线程。 辅助进程将使用IPC(对于进程)或无锁队列(对于线程)与DB IO进程进行通信。 这种方法使您独立于PDO实施细节(如果它是线程安全的或生成连接等)。

PS我怀疑您实际上是通过派生产生了新的PDO对象(派生仅意味着使用其内存及其中的所有内容制作一个进程的副本),而PDO对象会根据需要创建和关闭连接。 它可以解释为什么您看不到低流量客户端和数据库连接之间的关联。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM