http://toys.lerdorf.com/archives/57-ZeroMQ-+-libevent-in-PHP.html
写了一个简单的队列任务处理。多进程任务,异步任务可能会用到这个(主要是命令行应用)
比如,任务的某个一个环节速度十分不稳定,可能执行几秒,也可能执行几分钟,
我就可以把那个环节包括前面的部分扔进队列,多跑几个进程,同时往队列里面写。
然后后面比较快的环节只跑一个处理任务就OK了。让整体速度达到更好的效果。
write.php: 将任务写入队列
read.php:
相关的资料:双向队列
baidu和google上没有查到PHP双向队列的资料,搜索到java的双向队列定义如下:双向队列(双端队列)就像是一个队列,但是你可以在任何一端添加或移除元素。
而双端队列是一种数据结构,定义如下:
A deque is a data structure consisting of a list of items, on which the following operations are possible.
* push(D,X) -- insert item X on the rear end of deque D.
* pop(D) -- remove the front item from the deque D and return it.
* inject(D,X) -- insert item X on the front end of deque D.
* eject(D) -- remove the rear item from the deque D and return it.
Write routines to support the deque that take O(1) time per operation.
翻译:双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作:
push(D,X) 将项X 插入到双端队列D的前端
pop(D) 从双端队列D中删除前端项并将其返回
inject(D,X) 将项X插入到双端队列D的尾端
eject(D) 从双端队列D中删除尾端项并将其返回
编写支持双端队伍的例程,每种操作均花费O(1)时间
百度百科:(deque,全名double-ended queue)是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
转贴一个使用Php数组函数实现该功能的代码:
array_push -- 将一个或多个单元压入数组的末尾(入栈)
array_unshift -- 在数组开头插入一个或多个单元
array_pop -- 将数组最后一个单元弹出(出栈)
array_shift -- 将数组开头的单元移出数组
// 来自 PHP5 in Practice (U.S.)Elliott III & Jonathan D.Eisenhamer
写了一个简单的队列任务处理。多进程任务,异步任务可能会用到这个(主要是命令行应用)
比如,任务的某个一个环节速度十分不稳定,可能执行几秒,也可能执行几分钟,
我就可以把那个环节包括前面的部分扔进队列,多跑几个进程,同时往队列里面写。
然后后面比较快的环节只跑一个处理任务就OK了。让整体速度达到更好的效果。
write.php: 将任务写入队列
<?php
/*
产生队列
*/
//用微秒生成队列文件名。因为会有多个队列,所以加了一个identifier来区分各个队列
function mt($identifier='default')
{
return sprintf("%.6f.%s",strtok(microtime(),' ')+strtok(''),$identifier);
}
while(1) //实际中尽量不要while(1) 非要while(1)记得任务完成要break
{
if(count(glob('./queue/*.identifier'))>=10) //队列最大长度,不限制的话硬盘可能会受不了哦。
{
sleep(1);//记住这里要sleep,否则队列满了cpu占用很高
continue;
}
$url = 'www.'.time().'.com'; //随便举个例子,我用时间戳生成了一个网址
echo "$url\r\n";
$fp = fopen('./queue/'.mt('identifier'),'w');
fwrite($fp,$url);
fclose($fp);
sleep(1);//这里不需要sleep,我sleep是因为我的任务太简单。
}
?>
/*
产生队列
*/
//用微秒生成队列文件名。因为会有多个队列,所以加了一个identifier来区分各个队列
function mt($identifier='default')
{
return sprintf("%.6f.%s",strtok(microtime(),' ')+strtok(''),$identifier);
}
while(1) //实际中尽量不要while(1) 非要while(1)记得任务完成要break
{
if(count(glob('./queue/*.identifier'))>=10) //队列最大长度,不限制的话硬盘可能会受不了哦。
{
sleep(1);//记住这里要sleep,否则队列满了cpu占用很高
continue;
}
$url = 'www.'.time().'.com'; //随便举个例子,我用时间戳生成了一个网址
echo "$url\r\n";
$fp = fopen('./queue/'.mt('identifier'),'w');
fwrite($fp,$url);
fclose($fp);
sleep(1);//这里不需要sleep,我sleep是因为我的任务太简单。
}
?>
read.php:
<?php
/*
处理队列
*/
while(1) //实际程序最好不要while(1)如果while(1),记得处理完任务要break
{
if($queue = glob('./queue/*.identifier'))
{
$q = array_shift($queue);
$url = file_get_contents($q);
echo $url."\r\n";
unlink($q);
}
sleep(1);//这里要不要sleep或sleep多久自己凭感觉来。
}
?>
/*
处理队列
*/
while(1) //实际程序最好不要while(1)如果while(1),记得处理完任务要break
{
if($queue = glob('./queue/*.identifier'))
{
$q = array_shift($queue);
$url = file_get_contents($q);
echo $url."\r\n";
unlink($q);
}
sleep(1);//这里要不要sleep或sleep多久自己凭感觉来。
}
?>
相关的资料:双向队列
baidu和google上没有查到PHP双向队列的资料,搜索到java的双向队列定义如下:双向队列(双端队列)就像是一个队列,但是你可以在任何一端添加或移除元素。
而双端队列是一种数据结构,定义如下:
A deque is a data structure consisting of a list of items, on which the following operations are possible.
* push(D,X) -- insert item X on the rear end of deque D.
* pop(D) -- remove the front item from the deque D and return it.
* inject(D,X) -- insert item X on the front end of deque D.
* eject(D) -- remove the rear item from the deque D and return it.
Write routines to support the deque that take O(1) time per operation.
翻译:双端队列(deque)是由一些项的表组成的数据结构,对该数据结构可以进行下列操作:
push(D,X) 将项X 插入到双端队列D的前端
pop(D) 从双端队列D中删除前端项并将其返回
inject(D,X) 将项X插入到双端队列D的尾端
eject(D) 从双端队列D中删除尾端项并将其返回
编写支持双端队伍的例程,每种操作均花费O(1)时间
百度百科:(deque,全名double-ended queue)是一种具有队列和栈的性质的数据结构。双端队列中的元素可以从两端弹出,其限定插入和删除操作在表的两端进行。
转贴一个使用Php数组函数实现该功能的代码:
<?php
//Input limit double-ende queue
class DoubleEndedQueue1 {
var $queue = array();
function add($var){
return array_push($this->queue, $var);
}
function frontRemove(){
return array_shift($this->queue);
}
function rearRemove(){
return array_pop($this->queue);
}
}
//Output limit double-ende queue
class DoubleEndedQueue2 {
var $queue = array();
function remove(){
return array_pop($this->queue);
}
function frontAdd($var){
return array_unshift($this->queue, $var);
}
function rearAdd($var){
return array_push($this->queue, $var);
}
}
//Test code
$q = new DoubleEndedQueue1;
$q->add('aaa');
$q->add('bbb');
$q->add('ccc');
$q->add('ddd');
echo $q->frontRemove();
echo "<br>";
echo $q->rearRemove();
echo "<br>";
print_r($q->queue);
?>
//Input limit double-ende queue
class DoubleEndedQueue1 {
var $queue = array();
function add($var){
return array_push($this->queue, $var);
}
function frontRemove(){
return array_shift($this->queue);
}
function rearRemove(){
return array_pop($this->queue);
}
}
//Output limit double-ende queue
class DoubleEndedQueue2 {
var $queue = array();
function remove(){
return array_pop($this->queue);
}
function frontAdd($var){
return array_unshift($this->queue, $var);
}
function rearAdd($var){
return array_push($this->queue, $var);
}
}
//Test code
$q = new DoubleEndedQueue1;
$q->add('aaa');
$q->add('bbb');
$q->add('ccc');
$q->add('ddd');
echo $q->frontRemove();
echo "<br>";
echo $q->rearRemove();
echo "<br>";
print_r($q->queue);
?>
array_push -- 将一个或多个单元压入数组的末尾(入栈)
array_unshift -- 在数组开头插入一个或多个单元
array_pop -- 将数组最后一个单元弹出(出栈)
array_shift -- 将数组开头的单元移出数组
// 来自 PHP5 in Practice (U.S.)Elliott III & Jonathan D.Eisenhamer
<?php
// A library to implement queues in PHP via arrays
// The Initialize function creates a new queue:
function &queue_initialize() {
// In this case, just return a new array
$new = array();
return $new;
}
// The destroy function will get rid of a queue
function queue_destroy(&$queue) {
// Since PHP is nice to us, we can just use unset
unset($queue);
}
// The enqueue operation adds a new value unto the back of the queue
function queue_enqueue(&$queue, $value) {
// We are just adding a value to the end of the array, so can use the
// [] PHP Shortcut for this. It's faster than using array_push
$queue[] = $value;
}
// Dequeue removes the front of the queue and returns it to you
function queue_dequeue(&$queue) {
// Just use array unshift
return array_shift($queue);
}
// Peek returns a copy of the front of the queue, leaving it in place
function queue_peek(&$queue) {
// Return a copy of the value found in front of queue
// (at the beginning of the array)
return $queue[0];
}
// Size returns the number of elements in the queue
function queue_size(&$queue) {
// Just using count will give the proper number:
return count($queue);
}
// Rotate takes the item on the front and sends it to the back of the queue.
function queue_rotate(&$queue) {
// Remove the first item and insert it at the rear.
$queue[] = array_shift($queue);
}
// Let's use these to create a small queue of data and manipulate it.
// Start by adding a few words to it:
$myqueue =& queue_initialize();
queue_enqueue($myqueue, 'Opal');
queue_enqueue($myqueue, 'Dolphin');
queue_enqueue($myqueue, 'Pelican');
// The queue is: Opal Dolphin Pelican
// Check the size, it should be 3
echo '<p>Queue size is: ', queue_size($myqueue), '</p>';
// Peek at the front of the queue, it should be: Opal
echo '<p>Front of the queue is: ', queue_peek($myqueue), '</p>';
// Now rotate the queue, giving us: Dolphin Pelican Opal
queue_rotate($myqueue);
// Remove the front element, returning: Dolphin
echo '<p>Removed the element at the front of the queue: ',
queue_dequeue($myqueue), '</p>';
// Now destroy it, we are done.
queue_destroy($myqueue);
?>
// A library to implement queues in PHP via arrays
// The Initialize function creates a new queue:
function &queue_initialize() {
// In this case, just return a new array
$new = array();
return $new;
}
// The destroy function will get rid of a queue
function queue_destroy(&$queue) {
// Since PHP is nice to us, we can just use unset
unset($queue);
}
// The enqueue operation adds a new value unto the back of the queue
function queue_enqueue(&$queue, $value) {
// We are just adding a value to the end of the array, so can use the
// [] PHP Shortcut for this. It's faster than using array_push
$queue[] = $value;
}
// Dequeue removes the front of the queue and returns it to you
function queue_dequeue(&$queue) {
// Just use array unshift
return array_shift($queue);
}
// Peek returns a copy of the front of the queue, leaving it in place
function queue_peek(&$queue) {
// Return a copy of the value found in front of queue
// (at the beginning of the array)
return $queue[0];
}
// Size returns the number of elements in the queue
function queue_size(&$queue) {
// Just using count will give the proper number:
return count($queue);
}
// Rotate takes the item on the front and sends it to the back of the queue.
function queue_rotate(&$queue) {
// Remove the first item and insert it at the rear.
$queue[] = array_shift($queue);
}
// Let's use these to create a small queue of data and manipulate it.
// Start by adding a few words to it:
$myqueue =& queue_initialize();
queue_enqueue($myqueue, 'Opal');
queue_enqueue($myqueue, 'Dolphin');
queue_enqueue($myqueue, 'Pelican');
// The queue is: Opal Dolphin Pelican
// Check the size, it should be 3
echo '<p>Queue size is: ', queue_size($myqueue), '</p>';
// Peek at the front of the queue, it should be: Opal
echo '<p>Front of the queue is: ', queue_peek($myqueue), '</p>';
// Now rotate the queue, giving us: Dolphin Pelican Opal
queue_rotate($myqueue);
// Remove the front element, returning: Dolphin
echo '<p>Removed the element at the front of the queue: ',
queue_dequeue($myqueue), '</p>';
// Now destroy it, we are done.
queue_destroy($myqueue);
?>
作者:jackxiang@向东博客 专注WEB应用 构架之美 --- 构架之美,在于尽态极妍 | 应用之美,在于药到病除
地址:https://jackxiang.com/post/1743/
版权所有。转载时必须以链接形式注明作者和原始出处及本声明!
最后编辑: jackxiang 编辑于2012-10-3 20:38
评论列表