在后台运行多个PHP CLI会导致MySQL错误

我们运行一个元search引擎(价格比较),其中每个search在各个网站上产生大量的实时search,并在我们的网站上呈现合并和sorting的search结果。

我们在Linux Debian服务器上使用PHP / MySQL / Apache进行了一个非常直接的设置,但是并行search多个站点的后台处理由Tomcat和一个Java servlet处理。 但是,由于这个设置(Tomcat)的一些问题,我正在调查新的方法来进行背景search。

一种看起来很有前途的方法也很简单:在主search页面中,每个单独的search脚本都使用exec()作为PHP CLI运行:

exec("nohup /usr/bin/php search.php '$params' &> /dev/null &"); 

最后使用&符将PHP CLI脚本直接发送到后台,主页面可以继续而不用等待。 每个search都有大约20个脚本运行。

它似乎performance不错,但是当我用并发请求使用Apache Benchmark进行压力testing时,问题就开始显现出来。 发生什么事是MySQL报告这个错误:

无法通过套接字“/var/run/mysqld/mysqld.sock”(11)连接到本地MySQL服务器

它似乎是“太多连接”的变体,但它无助于提高my.cnf的限制。 但是让我感到困惑的是,即使我调用一个什么都不做的小虚拟脚本,并且肯定不会访问MySQL,这些错误仍然存​​在。 所以,看起来就像运行PHP CLI,即使没有使用MySQL也会加载。

在我的testing中,最多可以运行700个PHP实例,CPU和内存的负载比使用Tomcat调用PHP脚本要低,所以从这个angular度来看,它看起来是可行的。

有人有关于MySQL问题的线索吗? 当然,我很乐意接受如何处理后台任务的新想法!

问候,马丁

马丁,

我绝对不是这方面的专家,但有一些事情浮现在脑海里。

我认为,php加载支持mysql是否在脚本中使用它,但它不应该启动连接,除非你使用持久连接 。我不认为cli脚本会inheritanceApache的mysql连接孩子,但显然它必须基于你的testing。

你也可能会遇到太多的 MySQL 文件限制。 还有一个引用,指出了导致mysql错误的RAM /资源耗尽。 你说它比旧的设置显示的负载更less,但可能太多了吗? 当这些脚本运行时,是否有机会使用GUI(mysqlpipe理员)启动到mysql服务器的连接? 如果是这样,你可能会看到资源耗尽…

从数据库的angular度来看,20个search只能在一个脚本中,而不是产生多个脚本。 这将允许您为所有20个search使用一个mysql连接,并相应地增加您的连接容量。 换句话说,Web脚本—-在背景中产生—–> CLI脚本,循环所有的search。
不知道你的代码,或者你正在做什么,这只是一个猜测作为一个编码修复。

祝你好运

我想说工作产卵有点太简单了,肯定会对资源匮乏情况开放。

为了避免这种情况,我会使用某种forms的队列 – 可以通过列出所需内容的数据库表,然后定期检查,也可以使用像Gearman或Beanstalkd这样的工作队列系统。 您将一条消息放入队列中 – 您想要search的内容 – 以及一个已经运行的后台任务,它们在进入时select作业,并且具有执行相应的任务并将信息传回的function,无论是通过数据库,还是Memcached等内存系统。 前端系统可以刷新(或使用Ajax)来回叫,看看是否有任何信息已经find,适当显示它。

将前端和后端分开,并避免closures脚本已打开的所有连接(请参阅exec上的警告)

这么晚才回复很抱歉。 我感冒了。

感谢您的反馈意见。 有很多想法!

我已经做了一些更多的尝试,使用wget而不是CLI脚本来调用脚本,而且让Lighttpd在端口81上提供这些特殊的search脚本,以便将主要的Apache服务器的负担减轻。

到目前为止,它看起来很有希望,但是当我做了更多的testing时,我可能会再问一次。

编辑:我是原来的海报,不知道为什么看起来像别人的post。 也许与我的OpenID的东西…