使用PHP多线程处理高并发请求_优化php多线程怎么实现以提升并发性能

哎呀,说到PHP多线程,我就得给大家讲讲我当年掉进的坑了。

我记得几年前我正在做一个项目,用户数量不断增加。
老老实实做FPM有点过分了。
当我想做多线程时,我第一个想到的是pthreads。
此时我手头有一台 PHP7 .1 服务器,想尝试一下这个东西。

场景:2 01 8 年左右,我有一个批量采集API数据的任务,数据量一般不大。
我正在考虑在单独的线程中执行此操作以节省时间和精力。

我做了什么: 1 .我下载了pthreadsv3 扩展,编译时添加了ZTS,环境设置为CLI模式。
2 .我写了一个继承自Thread的类FetchUrlTask​​,将file_get_contents放入其中,用于捕获URL。
我正在考虑启动更多线程并同时运行它们。
3 .我刚开始跑步,哎呀,真快啊!采集三条数据,比单线程快很多。

结果是什么? 过了一会儿,服务器的CPU开始运行,RAM也暴涨。
我快速看了一眼上面,哦! CPU上下文切换如此复杂,以至于有很多线程在那里等待,这根本不是问题。
后来发现这个东西适合PHP 7 .0到7 .2 一旦超过7 .2 就消失了。
需要用ZTS编译,搞得我头大。
另外,它不能在Web环境下使用,只能通过CLI运行,这就有点尴尬了。

教训: 后来我想:线程越多越好。
当时我在我的4 核CPU服务器上打开8 个线程,结果比单线程慢。
后来改用Swoole,感觉就完全不一样了。

场景:2 02 0年转用Swoole。
东西很棒,它支持 PHP 7 .1 及以上版本,还可以运行 Web 服务。
我使用 Swoole 的 Coroutine 来同时发出多个请求。
效率,哇,没得说。

我做了什么: 1 、使用Swoole的协程,为每个请求打开一个协程,异步执行。
2 .我也陷入过数据安全的陷阱。
一开始我没有注意到两个协程正在共享一个变量并且数据被搞乱了。
后来添加了互斥锁,使其更加稳定。
3 .我还设置了请求超时时间。
例如,HTTP请求超时时间为5 秒,以防止特定请求执行时间过长而导致整个服务崩溃。
4 . 更重要的是错误处理。
每个协程都必须用 try-catch 包裹起来,以便能够捕获并记录问题。
否则,即使出现错误,你也不知道问题出在哪里。

摘要: pthreads基本上已经不再使用了。
一旦PHP版本更新它就消失了并且有很多限制。
Swoole 是可行的方法,尤其是协程,那东西很棒。
在我后来的项目中,我使用了Swoole,处理几千个并发很轻松,而且性能也很出色。
以前一天能处理的数据量现在一顿饭就能处理完。

因此,如果您正在研究 PHP 多线程,我建议您直接使用 Swoole,而不用担心无用的 Pthreads。
Swoole协程+异步IO,就是这么走的路。
请记住,拥有太多线程并不容易。
还需要注意数据安全、超时控制和错误处理。
这些是关键。

如何在PHP项目中处理大数据量和高并发请求?

记得有一次,在项目初期,后端数据库几乎每天都会崩溃。
因为当时我们表的数据量已经超过了5 00万条,查询操作频繁,对服务器的CPU和内存造成了巨大的压力。
当时我就像热锅上的蚂蚁,到处寻找解决办法。

首先,我决定从数据库级别开始。
我分析了查询日志,发现有些查询语句重复率较高,所以添加了相应的索引来减少全表扫描的次数。
然后,我根据业务规则将大表拆分成表,将数据分布到不同的表中,并将数据量减少到单个表中。

接下来我在服务器端对其进行了优化。
我引入了一个请求队列来将一些耗时的请求排队并由后台进程异步处理。
同时我部署了多台服务器,通过Nginx进行负载均衡,分散请求压力。

最后,我优化了前端。
我使用 CDN 来加速静态资源的加载以及合并和压缩 CSS 和 JS 文件。
我还使用了异步加载技术来减少初始请求的大小。

经过一系列的优化,项目终于稳定下来了。
服务器再也没有崩溃过,用户体验显着提升。
但我仍然在想:如果数据量继续增长,我们是否还需要进一步优化?