zoukankan      html  css  js  c++  java
  • php多进程pcntl学习(二)

      多进程中数据独立,变量无法共享,所以可以使用shmop共享内存实现(cli模式不支持APC扩展),或者存储到redis这种nosql中。

      下面实例,开10个进程结合redis集合,做一些简单的任务处理。

     1 <?php
     2 for ($i=0;$i<10;$i++){//开10个进程
     3     $ret = pcntl_fork(); //生成进程
     4 
     5     if ($ret == 0){
     6 
     7         $redis = new Redis();
     8         $redis->connect('127.0.0.1',6379);
     9 
    10         while (true){ //做一个循环,让进程反复运行
    11 
    12             if ($redis->setnx('job',1)==1) {//加锁
    13 
    14                 if (count($redis->keys('webpub')) == 0){//集合中没有数据跳出继续循环
    15                     $redis->del('job'); //解锁
    16                     continue;
    17                 }
    18 
    19                 $getjob = $redis->zRange('webpub',0,0);//取出一个
    20                 var_dump($getjob);
    21                 //开启事务
    22                 $redis->multi();
    23 
    24                 //有序集合删除
    25                 $redis->zRem('webpub',$getjob[0]);//删除
    26                 $redis->del('job'); //解锁
    27 
    28                 //执行事务代码
    29                 $redis->exec();
    30 
    31                 //下列代表为要执行的任务
    32                 file_put_contents('./job/'.$getjob[0].'.html',$getjob[0]);
    33 
    34                 echo $getjob[0].' is done'.PHP_EOL;
    35 
    36                 sleep(1);
    37             }
    38         }
    39     }
    40 }

      上面代码 开启10个进程来处理 redis中 webpub集合中的任务,这里的任务比较简单就是生成文件。值得注意的是,为了防止多个进程之间同时处理一个任务,必须加上锁来限制。

      ps: 不知道上面代码是否有坑,像我这样野生码农涉及点深的东西 就可能会出现各种坑。

  • 相关阅读:
    sessionStorage用于分页,瀑布流和存储用户数据等
    js瀑布流
    sql 日结
    js 去除html标签
    c# 去除文本的html标签
    jQuery 数据滚动(上下)
    jQuery 图片随滚动条滚动加载
    sql 指定范围 获取随机数
    js 时间格式化
    js自写字符串 append 方法
  • 原文地址:https://www.cnblogs.com/loveyouyou616/p/5652251.html
Copyright © 2011-2022 走看看