Heim  >  Artikel  >  Backend-Entwicklung  >  mysql - php关于队列的一点疑问?

mysql - php关于队列的一点疑问?

WBOY
WBOYOriginal
2016-06-06 20:11:36892Durchsuche

php是单进程的是吧,每一个脚本的执行都是相互独立的,

多进程是个什么概念呢?

我看了这篇文章http://www.thinkphp.cn/topic/14728.html有个疑惑:
他说是多进程执行队列可以加快任务处理速度,但是需要解决的问题是,多进程处理任务要防止重复处理,但是:

<code>if ($minute % 5 == 0)
{
    for ($i=0; $i > doQueueMission".date('Y-m-d').".log  ";
        echo  date("Y-m-d H:i:s") . "t : " .$cmd."n";
        system($cmd);
    }
}
</code>

这个一个定时任务 crontab 执行十次system(),这不算多进程吧,还是并行啊,这没什么意义啊。
多进程应该是配置crontab 吧?但是真正的难点在于“标记队列”不让重复执行

最近像最队列,解决原有的下单,注册,发消息慢的问题,感觉队列好难啊,总结几点在这里:
1:任务存放在哪里?
2:后台守护程序的配置
3:守护程序的多进程与定时
4:防止多进程重复拉取队列任务执行(3,4这才是最难的点)

求大神指点啊,有无成熟的队列案列啊?

回复内容:

php是单进程的是吧,每一个脚本的执行都是相互独立的,

多进程是个什么概念呢?

我看了这篇文章http://www.thinkphp.cn/topic/14728.html有个疑惑:
他说是多进程执行队列可以加快任务处理速度,但是需要解决的问题是,多进程处理任务要防止重复处理,但是:

<code>if ($minute % 5 == 0)
{
    for ($i=0; $i > doQueueMission".date('Y-m-d').".log  ";
        echo  date("Y-m-d H:i:s") . "t : " .$cmd."n";
        system($cmd);
    }
}
</code>

这个一个定时任务 crontab 执行十次system(),这不算多进程吧,还是并行啊,这没什么意义啊。
多进程应该是配置crontab 吧?但是真正的难点在于“标记队列”不让重复执行

最近像最队列,解决原有的下单,注册,发消息慢的问题,感觉队列好难啊,总结几点在这里:
1:任务存放在哪里?
2:后台守护程序的配置
3:守护程序的多进程与定时
4:防止多进程重复拉取队列任务执行(3,4这才是最难的点)

求大神指点啊,有无成熟的队列案列啊?

https://github.com/chrisboulton/php-resque

据说system()会开启新的进程, 所以循环执行多次system()是有意义的.

他说是多进程执行队列可以加快任务处理速度,但是需要解决的问题是,多进程处理任务要防止重复处理
难点在于“标记队列”不让重复执行

这些都是对的.

理论上讲, 任何可以存储数据的方式都可以用作MessageQueue. 比如磁盘文件, 比如Mysql.
但是更好的选择是: 使用专门的MQ软件, 比如: ActiveMQ, RabbitMQ..., 类似的软件很多很多. 题主可以了解一下.

php的多进程和crontab 没啥关系,因为如果你没用php的子进程它都是串行的,pcntl_fork()这个函数是使用子进程的

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn