美文网首页PHP经验分享
swoole process write缓冲区写满测试

swoole process write缓冲区写满测试

作者: 匿名类 | 来源:发表于2018-03-05 17:30 被阅读73次

php环境信息如下

[root@localhost swooletest]# php --version
PHP 5.4.0 (cli) (built: Jan 15 2018 17:00:14)
Copyright (c) 1997-2012 The PHP Group
Zend Engine v2.4.0, Copyright (c) 1998-2012 Zend Technologies
    with Zend OPcache v7.0.4, Copyright (c) 1999-2014, by Zend Technologies
You have mail in /var/spool/mail/root
[root@localhost swooletest]# php --ri swoole
swoole
swoole support => enabled
Version => 1.9.23
Author => tianfeng.han[email: mikan.tenny@gmail.com]
epoll => enabled
eventfd => enabled
timerfd => enabled
signalfd => enabled
cpu affinity => enabled
spinlock => enabled
rwlock => enabled
async http/websocket client => enabled
Linux Native AIO => enabled
pcre => enabled
zlib => enabled
mutex_timedlock => enabled
pthread_barrier => enabled
futex => enabled
Directive => Local Value => Master Value
swoole.aio_thread_num => 2 => 2
swoole.display_errors => On => On
swoole.use_namespace => Off => Off
swoole.fast_serialize => Off => Off
swoole.unixsock_buffer_size => 8388608 => 8388608

主要为了验证 socket缓冲区写满write阻塞的极限情况,文档地址

https://wiki.swoole.com/wiki/page/372.html

<?php

$redirect_stdout = false; 
$workers = array(); 
$worker_num = 2 ; 


for ($i = 0; $i < $worker_num; $i ++) {
    // 开始设置启动子进程
    $process = new swoole_process('child_async', $redirect_stdout,2);
    $process->id = $i;
    $pid = $process->start();
    $workers[$pid] = $process;
    simplelog("to Master: my is new worker, PID=" . $pid);
}

// 开启主进程异步模式,启动位置不能更改
master_async($workers);

// 异步主进程
function master_async($workers)
{
    
    
    // 处理子进程的信号,重新创建新的子进程
    swoole_process::signal(SIGCHLD, function ($signo) use(&$workers) {
        while (1) {
            $ret = swoole_process::wait(false);
            if ($ret) {
                $pid = $ret['pid'];
                $child_process = $workers[$pid];
                simplelog("Worker Exit, kill_signal={$ret['signal']} PID=" . $pid);
                // 重启
                $new_pid = $child_process->start();
                $workers[$new_pid] = $child_process;
                // 清除
                unset($workers[$pid]);
            } else {
                break;
            }
        }
    });
    
    $mcount = 0 ;
    // 主进程向子进程写入数据
    while ($mcount < 100000) {
        foreach ($workers as $pid => $process) {
            
                $data = str_repeat('a', 1024 );
                $process->write($mcount.$data);
                echo " write end ".$mcount."\n"  ;
                
                $mcount ++ ;
            
        }
    }
}

function child_async(swoole_process $worker)
{
    swoole_process::signal(SIGTERM, function ($signal_num) use($worker) {
        // 处理接收到的终止信号
        simplelog("signal call = $signal_num, #{$worker->pid}");
        // 正常结束
        // $worker->exit(0);
    });
    
    swoole_event_add($worker->pipe, function ($pipe) use($worker) {
       
        $recv = $worker->read();
        echo substr("xfz-->".$recv,0,20)." message len=".strlen($recv)."\n" ;
       //模拟工作耗时
        usleep(1000*20);
        
        });
}



function simplelog($message = "")
{
    echo "[" . date("Y-m-d H:i:s", time()) . "]--" . $message . "\n";
}

?>

输出信息里会出现类似如下信息,说明阻塞机制是起作用的,真实应用场景是从redis里读取数据,怕压力大时队列数据丢失.

[root@localhost swooletest]# php t.php 
//输出类似
.....
 write end 666
 write end 667
xfz-->289aaaaaaaaaaa message len=1027
xfz-->288aaaaaaaaaaa message len=1027
xfz-->291aaaaaaaaaaa message len=1027
.....

相关文章

  • swoole process write缓冲区写满测试

    php环境信息如下 主要为了验证 socket缓冲区写满write阻塞的极限情况,文档地址 https://wik...

  • swoole异步redis的使用

    (new \swoole_process(function ($process) use ($serv) { cl...

  • Swoole Process

    简介 基于C语言封装的进程管理模块,方便php的多进程编程 内置管道、消息队列接口,可方便实现进程间通信 自定义信号管理

  • Swoole| Swoole 中 Process

    date: 2018-1-8 20:56:08title: Swoole| Swoole 中 Process 这篇...

  • Swoole Process进程初级

    Swoole 初级教程 1 . swoole 进程模块 process,模拟并发处理不同任务的案例直接上代码 启动...

  • swoole中进程

    swoole-1.7.2增加了一个进程管理模块,用来替代PHP的pcntl扩展。优点:swoole_process...

  • PHP swoole (3.多进程)

    文档: https://wiki.swoole.com/wiki/search/?q=process 关于进程...

  • OutputStream 输出流 写

    // 带写缓冲区,缓冲区大小10,缓冲区内存中, 1,2,3,4把他们都放到缓冲区--缓冲区满是才写到文件 // ...

  • Socket缓冲区以及阻塞模式

    socket缓冲区每个 socket 被创建后,都会分配两个缓冲区,输入缓冲区和输出缓冲区。write()/sen...

  • Hbase读写流程

    写流程hbase write process.jpg流程描述 1.Client获取数据写入的Region所在的R...

网友评论

    本文标题:swoole process write缓冲区写满测试

    本文链接:https://www.haomeiwen.com/subject/ojihfftx.html