PHP的Pcntl多进程扩展的用法介绍
发布:smiling 来源: PHP粉丝网 添加日期:2020-01-10 17:09:28 浏览: 评论:0
本篇文章给大家带来的内容是关于PHP的Pcntl多进程扩展的用法介绍,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助。
PHP提供了一个Pcntl扩展,Pcntl基于Linux的进程,Windows系统暂时没有这个扩展,用于实现基础的多进程实现,可以利用这个处理一个很耗时的任务,例如发订阅邮件,短信,站内信等。
示例代码:
代码是基于Laravel 框架的,建议使用此框架来允许这部分代码。
- public function index(Request $request)
- {
- pcntl_signal(SIGCHLD, SIG_IGN); //如果父进程不关心子进程什么时候结束,子进程结束后,内核会回收。
- $max = 8000;
- $workers = 10;
- $pids = array();
- for($i = 0; $i < $workers; $i++){
- $pids[$i] = pcntl_fork();
- $pid = posix_getpid();
- switch ($pids[$i]) {
- case -1:
- echo "fork error : {$i} \r\n";
- exit;
- case 0:
- $param = array(
- 'lastid' => $max / $workers * $i,
- 'maxid' => $max / $workers * ($i+1),
- );
- $this->doSomething($pid, $param);
- exit;
- default:
- break;
- }
- }
- foreach ($pids as $i => $pid) {
- if($pid) {
- //父进程会得到子进程号,所以这里是父进程执行的逻辑
- //如果不需要阻塞进程,而又想得到子进程的退出状态,则可以注释掉pcntl_wait($status)语句,或写成:
- pcntl_wait($status,WNOHANG); //等待子进程中断,防止子进程成为僵尸进程。
- //pcntl_waitpid($pid, $status);
- }
- }
- }
- // 可以看到那个子进程在处理哪些数据
- public function doSomething($filename, $param)
- {
- for ($i = $param['lastid']; $i < $param['maxid']; $i++) {
- $path = "./test/";
- if (!is_dir($path)){
- mkdir($path, 0777, true);
- }
- $content = $i . '|';
- $file = $path . $filename . ".txt";
- file_put_contents($file, $content, FILE_APPEND);
- }
- }
更多建议读文档,进程和线程,还有很多内容的,需要读书去学习了。
Tags: Pcntl
- 上一篇:php中small内存规格的计算(代码示例)
- 下一篇:foreach用法是什么?
推荐文章
热门文章
最新评论文章
- 写给考虑创业的年轻程序员(10)
- PHP新手上路(一)(7)
- 惹恼程序员的十件事(5)
- PHP邮件发送例子,已测试成功(5)
- 致初学者:PHP比ASP优秀的七个理由(4)
- PHP会被淘汰吗?(4)
- PHP新手上路(四)(4)
- 如何去学习PHP?(2)
- 简单入门级php分页代码(2)
- php中邮箱email 电话等格式的验证(2)