🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
## 队列(Queue) 异步并发的服务器里经常使用队列实现生产者消费者模型,解决并发排队问题。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); } ~~~ ## 定长数组(SplFixedArray) PHP官方的SPL库提供了一个定长数组的数据结构,类似与C语言中的数组。和普通的PHP数组不同,定长数组读写性能更好。 **官方测试数据** 测试使用PHP 5.4,64位Linux系统 * small data (1,000): * write: SplFixedArray is 15 % faster * read: SplFixedArray is 5 % faster * larger data (512,000): * write: SplFixedArray is 33 % faster * read: SplFixedArray is 10 % faster **使用方法** SplFixedArray使用方法与Array相同,但只支持数字索引的访问方式。 ~~~ $array = new SplFixedArray(5); $array[1] = 2; $array[4] = "foo"; var_dump($array[0]); // NULL var_dump($array[1]); // int(2) ~~~ 可以使用setSize()方法动态改变定长数组的尺寸。