php大数据排队 php yield 处理大数据( 二 )


PHP 数据结构队列(SplQueue)和优先队列(SplPriorityQueue)简单使用实例队列这种数据结构更简单 , 就像我们生活中排队一样 , 它的特性是先进先出(FIFO) 。
PHP
SPL中SplQueue类就是实现队列操作 , 和栈一样 , 它也可以继承双链表(SplDoublyLinkedList)轻松实现 。
SplQueue类摘要如下:
SplQueue简单使用如下:
复制代码
代码如下:
$queue
=
new
SplQueue();
/**
*
可见队列和双链表的区别就是IteratorMode改变了而已,栈的IteratorMode只能为:
*
(1)SplDoublyLinkedList::IT_MODE_FIFO
|
SplDoublyLinkedList::IT_MODE_KEEP
【php大数据排队 php yield 处理大数据】(默认值,迭代后数据保存)
*
(2)SplDoublyLinkedList::IT_MODE_FIFO
|
SplDoublyLinkedList::IT_MODE_DELETE
(迭代后数据删除)
*/
$queue-setIteratorMode(SplDoublyLinkedList::IT_MODE_FIFO
|
SplDoublyLinkedList::IT_MODE_DELETE);
//SplQueue::enqueue()其实就是
SplDoublyLinkedList::push()
$queue-enqueue('a');
$queue-enqueue('b');
$queue-enqueue('c');
//SplQueue::dequeue()其实就是
SplDoublyLinkedList::shift()
print_r($queue-dequeue());
foreach($queue
as
$item)
{
echo
$item
.
PHP_EOL;
}
print_r($queue);
而优先队列SplPriorityQueue是基于堆(后文介绍)实现的 。
SplPriorityQueue的类摘要如下:
SplPriorityQueue简单使用:
$pq
=
new
SplPriorityQueue();
$pq-insert('a',
10);
$pq-insert('b',
1);
$pq-insert('c',
8);
echo
$pq-count()
.PHP_EOL;
//3
echo
$pq-current()
.
PHP_EOL;
//a
/**
*
设置元素出队模式
*
SplPriorityQueue::EXTR_DATA
仅提取值
*
SplPriorityQueue::EXTR_PRIORITY
仅提取优先级
*
SplPriorityQueue::EXTR_BOTH
提取数组包含值和优先级
*/
$pq-setExtractFlags(SplPriorityQueue::EXTR_DATA);
while($pq-valid())
{
print_r($pq-current());
//a
c
b
$pq-next();
}
php做一个排队等候的功能你这个问题归根结底是想要做一个实时在线人数的功能:
但是http请求是无状态的php大数据排队 , 所以你没有办法实时知道多少人在线,就是说没有办法精确响应用户把浏览器关php大数据排队了,服务器就能知道并且把把用户标记为下线
解决办法:
服务器里维护一份列表,这个列表记录了每个用户的session_id , 有效期比如可以设置为30分钟 , 在用户每次请求的时候都刷新下这个有效期,用户点击退出时就删除这个用户的session_id 。
因此统计这个列表里未过期的sessionid个数就是当前的实时人数
这份表根据你系统的规模,可以是文本,mysql,也可以是memcache redis 都行
存在问题:
用户只是三十分钟停留在页面但是没有退出的系统把他认为下线了 。这个可以通过“心跳包”来解决
用户关闭浏览器但是没有记为下线,这个就是我上面提到的 http无状态,这个没招
要想提高精确性就是减少有效期和心跳包的时间设定的结合,这个看你们的需求
关于php大数据排队和php yield 处理大数据的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站 。