PHP不是面向多线程的:正如您已经注意到的,每个页面由一个PHP进程提供 – 一次只能执行一个操作,包括在数据库服务器上执行SQL查询时只是“等待”。
不幸的是,你可以做的很多,这是PHP的工作原理。
不过,这里有几个想法:
>首先,您的服务器一次可能会有更多的用户,这意味着您将在当时提供多个页面,这反过来意味着您将拥有多个PHP进程和SQL查询同时运行…这意味着将使用您的服务器的几个内核。
>每个PHP进程都将在一个核心上运行,以响应一个用户的请求,但是并行运行Apache的几个子进程(每个请求一个,最多几十个或几百个,具体取决于您的配置) )
> MySQL服务器是多线程的,这意味着它可以使用多个不同的内核来回答几个并发请求 – 即使每个请求不能被更多的一个核心服务。
所以,其实你的服务器的8核将最终被使用;-)
而且,如果您认为您的网页需要太长时间才能生成,可能的解决方案是将您的计算分为两组:
>一方面,生成页面必须做的事情:对于那些,你没有太多可以做的事情
>另一方面,有时需要运行的东西,但不一定立即进行
>例如,我想一些统计学计算:你希望他们是最新的,但是如果他们落后几分钟,那通常是可以的。
>电子邮件发送相同:无论如何,在您的用户收到/阅读邮件之前几分钟会通过,所以不需要立即发送。
对于我的第二点的情况,因为你不需要这些事情立即完成…嗯,只是不要立即做他们的—)
我经常使用的一个解决方案是一些排队的美国主义:
> Web应用程序将东西存储在“todo-list”中
>而且“todo-list”被某些经由cronjob经常运行的批处理排队
而对于其他一些操作,您只需要每X分钟运行一次,而且这里也是一个完美的工具。