合规国际互联网加速 OSASE为企业客户提供高速稳定SD-WAN国际加速解决方案。 广告
# 队列(Queue) [TOC] 异步并发的服务器里经常使用队列实现生产者消费者模型,解决并发排队问题。PHP的SPL标准库中提供了`SplQueue`扩展内置的队列数据结构。另外PHP的数组也提供了`array_pop`和`array_shift`可以使用数组模拟队列数据结构。 ## SplQueue ~~~ $queue = new SplQueue; //入队 $queue->push($data); //出队 $data = $queue->shift(); //查询队列中的排队数量 $n = count($queue); ~~~ ## Array模拟队列 ~~~ $queue = array(); //入队 $queue[] = $data; //出队 $data = array_shift($queue); //查询队列中的排队数量 $n = count($queue); ~~~ ## 性能对比 虽然使用Array可以实现队列,但实际上性能会非常差。在一个大并发的服务器程序上,建议使用`SplQueue`作为队列数据结构。 100万条数据随机入队、出队,使用`SplQueue`仅用`2312.345ms`即可完成,而使用Array模拟的队列的程序根本无法完成测试,CPU一直持续在100%。 降低数据条数到1万条后(100倍),也需要`260ms`才能完成测试。 SplQueue ~~~ $splq = new SplQueue; for($i = 0; $i < 1000000; $i++) { $data = "hello $i\n"; $splq->push($data); if ($i % 100 == 99 and count($splq) > 100) { $popN = rand(10, 99); for ($j = 0; $j < $popN; $j++) { $splq->shift(); } } } $popN = count($splq); for ($j = 0; $j < $popN; $j++) { $splq->pop(); } ~~~ Array队列 ~~~ $arrq = array(); for($i = 0; $i <1000000; $i++) { $data = "hello $i\n"; $arrq[] = $data; if ($i % 100 == 99 and count($arrq) > 100) { $popN = rand(10, 99); for ($j = 0; $j < $popN; $j++) { array_shift($arrq); } } } $popN = count($arrq); for ($j = 0; $j < $popN; $j++) { array_shift($arrq); } ~~~