注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

淘尽网 官方博客

淘尽网http://www.tao3w.com做最好的比价网站

 
 
 

日志

 
 
关于我

淘尽网 http://www.tao3w.com 做最好的比价网站,做最好的数据抓取专家。

网易考拉推荐

关于php中pcntl_fork超时问题  

2016-07-29 10:15:26|  分类: PHP |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
做项目之中,使用消息队列,消息队列实现的原型就是pcntl_fork,但是发现该消息队列运行一段时间后会卡住,仔细检查PHP代码,又发现不了哪里出了问题,经过仔细检查,发现文件头部加的set_time_limit(60);在fork出来的进程内根本无效,现在使用两种方式解决
1、直接在pcntl_fork出来的代码内添加set_time_limit(60);
2、在pcntl_fork的子进程内,添加如下代码:
      pcntl_alarm(3);//3秒钟
      pcntl_signal(SIGALRM, "sig");
      function sig()
     {
         die("超时了");
     }

3、按照1写出的例子
<?php
//http://www.111cn.net/phper/php/55405.htm
set_time_limit(4);

declare(ticks = 1);


$pid = pcntl_fork();
// 父进程和子进程都会执行下面代码
if ($pid == - 1)
{
    // 错误处理:创建子进程失败时返回-1.
    die('could not fork');
}
else
{
    if ($pid)
    {
        // 父进程会得到子进程号,所以这里是父进程执行的逻辑
        pcntl_wait($status); // 等待子进程中断,防止子进程成为僵尸进程。
                               
        // pcntl_wait($status);
        $exitStatus = pcntl_wexitstatus($status);
        if ($exitStatus !== 0)
        {
            echo 'Job exited with exit code ' . $exitStatus;
        }
        else
        {
            echo "Job exited with exit code " . $exitStatus;
        }
    }
    else
    {
        // 子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
        set_time_limit(10);
       
       
        while (true)
        {
        }
       
    }
}

function sig()
{
    throw new Exception("exception");
}
?>
4、按照2写出的例子
<?php
//http://www.111cn.net/phper/php/55405.htm
set_time_limit(4);

declare(ticks = 1);


$pid = pcntl_fork();
// 父进程和子进程都会执行下面代码
if ($pid == - 1)
{
    // 错误处理:创建子进程失败时返回-1.
    die('could not fork');
}
else
{
    if ($pid)
    {
        // 父进程会得到子进程号,所以这里是父进程执行的逻辑
        pcntl_wait($status); // 等待子进程中断,防止子进程成为僵尸进程。
                               
        // pcntl_wait($status);
        $exitStatus = pcntl_wexitstatus($status);
        if ($exitStatus !== 0)
        {
            echo 'Job exited with exit code ' . $exitStatus;
        }
        else
        {
            echo "Job exited with exit code " . $exitStatus;
        }
    }
    else
    {
        // 子进程得到的$pid为0, 所以这里是子进程执行的逻辑。
//         set_time_limit(10);
        pcntl_alarm(3);
        pcntl_signal(SIGALRM, "sig");
       
        while (true)
        {
        }
        sig();
        pcntl_alarm(0);
    }
}

function sig()
{
    throw new Exception("exception");
}
?>
  评论这张
 
阅读(36)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017