Exemple #1
0
function forkChildInWorker()
{
    global $serv;
    echo "on worker start\n";
    $process = new swoole_process(function (swoole_process $worker) {
        // 		$serv = new swoole_server( "0.0.0.0", 9503 );
        // 		$serv->set(array(
        // 				'worker_num' => 1
        // 		));
        // 		$serv->on ( 'receive', function (swoole_server $serv, $fd, $from_id, $data) {
        // 			$serv->send ( $fd, "Swoole: " . $data );
        // 			$serv->close ( $fd );
        // 		});
        // 		$serv->start ();
        // 		swoole_event_add ($worker->pipe, function ($pipe) use ($worker) {
        // 			echo $worker->read()."\n";
        // 		});
        // 		swoole_timer_add (1000, function ($interval) use ($worker) {
        // 			echo "#{$worker->pid} child process timer $interval\n"; // 如果worker中没有定时器,则会输出 process timer xxx
        // 		});
    });
    $pid = $process->start();
    echo "Fork child process success. pid={$pid}\n";
    //保存子进程对象,这里如果不保存,那对象会被销毁,管道也会被关闭
    $serv->childprocess = $process;
}
Exemple #2
0
 function run($options)
 {
     $asDaemon = isset($options['asDaemon']) ? $options['asDaemon'] : 0;
     if ($asDaemon) {
         \swoole_process::daemon();
     }
     $pids = [];
     $workers = [];
     for ($i = 0; $i < $this->worker_num; $i++) {
         $process = new \swoole_process($this->workerStart, $this->redirect_stdout);
         $process->id = $i;
         $pid = $process->start();
         $pids[] = $pid;
         $workers[$pid] = $process;
     }
     $pidFile = isset($options['pidFile']) ? $options['pidFile'] : 0;
     if ($pidFile) {
         $ppid = posix_getpid();
         $pids[] = $ppid;
         file_put_contents($pidFile, implode("|", $pids));
     }
     \swoole_process::signal(SIGTERM, function () use($workers) {
         exit(0);
     });
     \swoole_process::signal(SIGINT, function () {
         exit(0);
     });
     \swoole_process::wait(false);
     return $workers;
 }
 function run()
 {
     //swoole_process::daemon(0, 1);
     $this->start_time = $this->middle_time = microtime(true);
     if ($this->status == 'import') {
         $db = new mysqli('127.0.0.1', 'root', '', 'friend');
         //$db = new mysqli('119.254.111.25', 'myroot', '*****@*****.**', 'friend', 60002);
         $sql = "SELECT COUNT(*) FROM friend";
         if ($result = $db->query($sql)) {
             $row = $result->fetch_row();
             $this->data_row = $row[0];
             $result->free();
         }
         $db->close();
         echo 'total data count: ' . $this->data_row . PHP_EOL;
     }
     //$this->data_row = 100000;
     for ($i = 0; $i < $this->worker_num; $i++) {
         $process = new swoole_process(array($this, 'child_async'), $this->redirect_stdout);
         $process->id = $i;
         $pid = $process->start();
         $this->workers[$pid] = $process;
         //echo "Master: new worker, PID=".$pid."\n";
     }
     $this->master_async();
 }
 public function onMessage(swoole_websocket_server $server, $frame)
 {
     var_dump($frame->data);
     $data = json_decode($frame->data, true);
     var_dump($data);
     $cmd = $data['cmd'];
     $is_block = isset($data['is_block']) ? $data['is_block'] : 0;
     if ($is_block) {
         if (isset($this->async_process[$frame->fd])) {
             $process = $this->async_process[$frame->fd];
         } else {
             $process = new swoole_process(array($this, 'onTmpProcess'), true, 2);
             $process->start();
             $this->async_process[$frame->fd] = $process;
             swoole_event_add($process->pipe, function () use($process, $frame) {
                 $data = $process->read();
                 var_dump($data);
                 $this->server->push($frame->fd, $data);
             });
         }
         $process->write($cmd);
         sleep(1);
     } else {
         $this->process->write($cmd);
         $data = $this->process->read();
         $this->server->push($frame->fd, $data);
     }
 }
Exemple #5
0
 static function run()
 {
     $table = new swoole_table(1024 * 256);
     $table->column('index', swoole_table::TYPE_INT);
     $table->column('serid', swoole_table::TYPE_INT);
     $table->column('data', swoole_table::TYPE_STRING, 64);
     $table->create();
     self::$table = $table;
     for ($i = 0; $i < self::$key_num; $i++) {
         $key = 'user_' . (self::$key_base + $i);
         $ret = self::$table->set($key, array('index' => $i, 'serid' => rand(1000, 9999), 'data' => "hello_world_{$i}"));
         if (!$ret) {
             echo "count {$i} failed.";
             break;
         }
     }
     for ($i = 0; $i < self::$worker_num; $i++) {
         $process = new swoole_process('UnitTest_Table::worker');
         $process->start();
         $workers[$i] = $process;
     }
     for ($i = 0; $i < self::$worker_num; $i++) {
         $exit = swoole_process::wait();
         echo "worker[{$i}] exit\n";
     }
 }
 /**
  * 创建一个子进程
  * @param $task
  */
 public function create_process($id, $task)
 {
     $this->task = $task;
     $process = new swoole_process(array($this, "run"));
     if (!($pid = $process->start())) {
     }
     //记录当前任务
     Crontab::$task_list[$pid] = array("start" => microtime(true), "id" => $id, "task" => $task);
 }
 /**
  * 创建一个子进程
  * @param $classname
  * @param $number
  * @param $redis
  */
 public function create_process($classname, $number, $redis)
 {
     $this->workers["classname"] = $classname;
     $this->workers["number"] = $number;
     $this->workers["redis"] = $redis;
     $process = new swoole_process(array($this, "run"));
     if (!($pid = $process->start())) {
     }
     //记录当前任务
     Crontab::$task_list[$pid] = array("start" => microtime(true), "classname" => $classname, "number" => $number, "redis" => $redis, "type" => "worker", "process" => $process);
 }
Exemple #8
0
function callback_timer_function()
{
    $Handle = new TimingCall_Tasks();
    $Handle->upDaemonTime();
    $tasks = $Handle->readExecuteTasks();
    foreach ($tasks as $task) {
        $process = new swoole_process('callback_process_function', true);
        $process->write(json_encode($task));
        $process->start();
        $process->wait(false);
    }
}
Exemple #9
0
 private function worker_run()
 {
     for ($i = 0; $i < $this->process_number; $i++) {
         $process = new swoole_process(array($this, "worker_callback"), false, true);
         $pid = $process->start();
         self::$workers[$i] = $process;
         self::$workers_pipe[$process->pipe] = $process;
         self::$restart_event[$i] = event_new();
         //var_dump($process->pipe);
         event_set(self::$restart_event[$i], $process->pipe, EV_READ | EV_PERSIST, array($this, "relisten"));
         event_base_set(self::$restart_event[$i], $this->event_base);
         event_add(self::$restart_event[$i]);
     }
 }
Exemple #10
0
 public function run()
 {
     $this->current_num = $this->min_worker_num;
     for ($i = 0; $i < $this->current_num; $i++) {
         $process = new swoole_process(array($this, 'task_run'), false, 2);
         $pid = $process->start();
         $this->process_list[$pid] = $process;
         $this->process_use[$pid] = 0;
     }
     foreach ($this->process_list as $process) {
         swoole_event_add($process->pipe, function ($pipe) use($process) {
             $data = $process->read();
             var_dump($data);
             $this->process_use[$data] = 0;
         });
     }
     swoole_timer_tick(1000, function ($timer_id) {
         static $index = 0;
         $index = $index + 1;
         $flag = true;
         foreach ($this->process_use as $pid => $used) {
             if ($used == 0) {
                 $flag = false;
                 $this->process_use[$pid] = 1;
                 $this->process_list[$pid]->write($index . "Hello");
                 break;
             }
         }
         if ($flag && $this->current_num < $this->max_worker_num) {
             $process = new swoole_process(array($this, 'task_run'), false, 2);
             $pid = $process->start();
             $this->process_list[$pid] = $process;
             $this->process_use[$pid] = 1;
             $this->process_list[$pid]->write($index . "Hello");
             $this->current_num++;
         }
         var_dump($index);
         if ($index == 10) {
             foreach ($this->process_list as $process) {
                 $process->write("exit");
             }
             swoole_timer_clear($timer_id);
             $this->process->exit();
         }
     });
 }
Exemple #11
0
 protected function memoryCheck()
 {
     $process = new \swoole_process(function (\swoole_process $worker) {
         $worker->name("kerisy-rpcserver:memoryCheck");
         swoole_timer_tick(1000, function () {
             $serverName = "kerisy-rpcserver:master";
             Reload::load($serverName, 0.8);
             //                echo date('H:i:s')."\r\n";
             if (date('H:i') == '04:00') {
                 Reload::reload($serverName);
                 //休息70s
                 sleep(70);
             }
         });
     });
     $process->start();
 }
Exemple #12
0
 public static function createWorkerProcess($className, $number, $options)
 {
     $reflector = new \ReflectionClass($className);
     if (!$reflector->implementsInterface("PHPKit\\Console\\Workers\\IWorker")) {
         defined('PHPKIT_RUN_DEBUG') && syslog(LOG_ERR, 'class [' . $className . '] is error');
         self::stop();
     } else {
         $process = new \swoole_process(function ($worker) use($className, $number, $options) {
             $worker->name(self::$child_process_name . str_replace('\\', '_', $className) . '_' . $number);
             $handler = new $className($options);
             $handler->tick($worker);
         });
         $pid = $process->start();
         self::$worker_list[$pid] = ['className' => $className, 'number' => $number, 'process' => $process, 'options' => $options];
         defined('PHPKIT_RUN_DEBUG') && syslog(LOG_INFO, 'create child process success:' . $pid);
     }
 }
Exemple #13
0
 /**
  * @brief 启动子进程
  */
 public function start()
 {
     $workerNum = $this->_objAha->getConfig()->get('aha', 'worker_num');
     for ($i = 0; $i < $workerNum; $i++) {
         $worker = new \Daemon\Asyncworker($this->_objAha);
         $process = new \swoole_process(array($worker, 'start'));
         //$process->daemon();
         $workerPid = $process->start();
         $this->_workers[$workerPid] = $process;
         $process->write("worker started!");
     }
     foreach ($this->_workers as $process) {
         $workerPid = \swoole_process::wait();
         echo "[Worker Shutdown][WorkerId] {$workerPid} " . PHP_EOL;
         unset($this->_workers[$workerPid]);
     }
 }
 /**
  * 创建一个子进程
  * @param $task
  */
 public function create_process($id, $task)
 {
     $this->task = $task;
     $process = new swoole_process(array($this, "run"));
     if (!($pid = $process->start())) {
     }
     //记录当前任务
     Crontab::$task_list[$pid] = array("start" => microtime(true), "id" => $id, "task" => $task, "type" => "crontab", "process" => $process);
     swoole_event_add($process->pipe, function ($pipe) use($process) {
         $task = $process->read();
         list($pid, $sec) = explode(",", $task);
         if (isset(Crontab::$task_list[$pid])) {
             $tasklist = Crontab::$task_list[$pid];
             Crontab::$delay[time() + $sec] = $tasklist["task"];
             $process->write($task);
         }
     });
 }
Exemple #15
0
 * $redirect_stdin_stdout,重定向子进程的标准输入和输出。 启用此选项后,在进程内echo将不是打印屏幕,而是写入到管道。读取键盘输入将变为从管道中读取数据。 默认为阻塞读取。
 * $create_pipe,是否创建管道,启用$redirect_stdin_stdout后,此选项将忽略用户参数,强制为true 如果子进程内没有进程间通信,可以设置为false
 */
if ($cfg && isset($cfg['muti_process']) && is_array($cfg['muti_process'])) {
    foreach ($cfg['muti_process'] as $proc_cfg) {
        $process = new swoole_process(function (swoole_process $worker) use($proc_cfg) {
            swoole_timer_tick($proc_cfg['ms'], function ($timer_id) use($proc_cfg) {
                $curl = curl_init();
                curl_setopt($curl, CURLOPT_URL, $proc_cfg['url']);
                curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
                $data = curl_exec($curl);
                curl_close($curl);
                logprint('info', trim($data));
            });
        }, false, false);
        $pid = $process->start();
        $workers[$pid] = $process;
    }
} else {
    logprint('warn', 'cfg is invaild');
}
master_process($workers);
function logprint($level, $msg)
{
    global $cfg;
    if ($cfg['debug'] == true) {
        echo '[' . date("Y/m/d H:i:s") . '] [' . $level . '] [' . posix_getpid() . '] [' . $msg . ']' . PHP_EOL;
    } else {
        file_put_contents($cfg['logfile'], '[' . date("Y/m/d H:i:s") . '] [' . $level . '] [' . posix_getpid() . '] [' . $msg . ']' . PHP_EOL, FILE_APPEND | LOCK_EX);
    }
}
 public function runAction()
 {
     //根据max_id, lastIndex,安排job
     $this->calculateJob();
     //生成一个sitemap的index文件
     $this->generateSitemapIndex();
     exit;
     for ($i = 0; $i < $this->worker_num; $i++) {
         $process = new swoole_process(array($this, 'generate'));
         // 传递job给子进程
         $process->sitemap_job = $this->jobs[$i];
         $pid = $process->start();
         $this->workers[$pid] = $process;
     }
     for ($i = 0; $i < $this->worker_num; $i++) {
         //阻塞
         $ret = swoole_process::wait();
         $pid = $ret['pid'];
         unset($this->workers[$pid]);
         echo "Worker Exit, PID=" . $pid . PHP_EOL;
     }
 }
Exemple #17
0
function StartServ($phpStart, $cmd, $name)
{
    $process = new swoole_process(function (swoole_process $worker) use($name, $cmd, $phpStart) {
        //目前指支持一个
        $worker->exec($phpStart, array(STARTBASEPATH . "/lib/Swoole/shell/start.php", $cmd, $name));
        //拉起server
        StartLogTimer(__LINE__ . '   ' . $phpStart . ' ' . STARTBASEPATH . '/lib/Swoole/shell/start.php ' . $cmd . ' ' . $name);
    }, false);
    $pid = $process->start();
    $exeRet = swoole_process::wait();
    return;
}
    public function runAction(){
        //根据max_id, currentIndex,安排job
        $this->calculateJob();

        // 参数 -g 判断是否需要生成sitemap
        if($this->generate){
            echo "Starting generating sitemaps...";
            //生成一个sitemap的index文件
            $this->generateSitemapIndex();

            for($i = 0; $i < $this->worker_num; $i++){
                $process = new swoole_process(array($this, 'generate'));
                // 传递job给子进程
                if(isset($this->jobs[$i])){
                    $process->sitemap_job = $this->jobs[$i];
                }
                $pid = $process->start();
                $this->workers[$pid] = $process;
            }

            for($i = 0; $i < $this->worker_num; $i++)
            {
                //阻塞
                $ret = swoole_process::wait();
                $pid = $ret['pid'];
                unset($this->workers[$pid]);
                echo "Generator Worker Exit, PID=".$pid.PHP_EOL;
            }

            echo "Finishing generating sitemaps...";
        }


        // 参数 -p 判断是否需要推送url
        // 一次提交100条,开4个进程,
        if($this->push){
            echo "Starting pushing urls...";
            for($i = 0; $i < $this->worker_num; $i++){
                $process = new swoole_process(array($this, 'push'));
                // 传递job给子进程
                if(isset($this->jobs[$i])){
                    $process->sitemap_job = $this->jobs[$i];
                }
                $pid = $process->start();
                $this->workers[$pid] = $process;
            }

            for($i = 0; $i < $this->worker_num; $i++)
            {
                //阻塞
                $ret = swoole_process::wait();
                $pid = $ret['pid'];
                unset($this->workers[$pid]);
                echo "Push Worker Exit, PID=".$pid.PHP_EOL;
            }
            echo "Finishing pushing urls...";
        }

    }
Exemple #19
0
function StartServ($phpStart, $cmd, $name)
{
    $process = new swoole_process(function (swoole_process $worker) use($name, $cmd, $phpStart) {
        //目前指支持一个
        $worker->exec($phpStart, array(STARTBASEPATH . "/lib/Swoole/shell/start.php", $cmd, $name));
        //拉起server
        StartLogTimer(__LINE__ . '   ' . $phpStart . ' ' . STARTBASEPATH . '/lib/Swoole/shell/start.php ' . $cmd . ' ' . $name);
    }, false);
    $pid = $process->start();
    $exeRet = swoole_process::wait();
    if ($exeRet['code']) {
        //创建失败
        StartLog(" startall   [FAIL] " . PHP_EOL);
        return false;
    } else {
        StartLog(" startall   [SUCCESS] " . PHP_EOL);
        return true;
    }
}
Exemple #20
0
 public function createStatsWorker($objAha, $workerNum)
 {
     $process = null;
     $processNum = 0;
     do {
         $worker = new \Daemon\Process\Stats($objAha);
         $process = new \swoole_process(array($worker, 'create'));
         $workerPid = $process->start();
         $this->_stats_workers[$workerPid] = $process;
         $this->_initPipeEvents($process, self::WORKER_TYPE_STATS);
     } while (++$processNum < $workerNum);
     return $process;
 }
Exemple #21
0
 public static function createTaskProcess($id, $task)
 {
     $className = $task['execute'];
     $reflector = new \ReflectionClass($className);
     if (!$reflector->implementsInterface("PHPKit\\Console\\Tasks\\ITask")) {
         defined('PHPKIT_RUN_DEBUG') && syslog(LOG_ERR, 'class [' . $className . '] is error');
         self::stop();
     } else {
         $process = new \swoole_process(function ($worker) use($className, $task) {
             $worker->name(self::$child_process_name . str_replace('\\', '_', $className));
             $handler = new $className();
             $handler->doing($worker, $task['args']);
             $worker->exit(1);
         });
         $pid = $process->start();
         self::$worker_list[$pid] = ['className' => $className, 'id' => $id, 'process' => $process, 'task' => $task];
         defined('PHPKIT_RUN_DEBUG') && syslog(LOG_INFO, 'create child process success:' . $pid);
     }
 }
Exemple #22
0
 private function spawnCustomWorker($worker_name, $config)
 {
     $process = new \swoole_process(function (\swoole_process $worker) {
         $recv = $worker->pop();
         $worker_config = unserialize($recv);
         extract($worker_config);
         $name = isset($this->serverConfig['server']['worker_process_name']) ? $this->serverConfig['server']['worker_process_name'] : 'ypf:swoole-worker-%d';
         $processName = sprintf("{$name}:%s", 0, $worker_name);
         \swoole_set_process_name($processName);
         self::getInstance()->disPatch($config['action'], array('worker_name' => $worker_name));
     }, false, false);
     $process->useQueue();
     $pid = $process->start();
     $this->worker_pid[] = $pid;
     $process->push(serialize(array('pid' => $pid, 'worker_name' => $worker_name, 'config' => $config)));
     if ($pid > 0) {
         echo "starting worker : {$worker_name}        [ OK ]\n";
     } else {
         echo "starting worker : {$worker_name}        [ FAIL ]  '" . \swoole_strerror(swoole_errno()) . "' \n";
     }
 }
Exemple #23
0
echo "------------------------------------------------------------------\n";
echo "Swoole Unit Tests. Version 1.0.0\n";
echo "Author: Han Tianfeng.\n";
echo "CopyRight: Swoole-Team.\n";
echo "------------------------------------------------------------------\n";
Console::put("extension_loaded('swoole')", !extension_loaded('swoole'), true);
Console::put("swoole_get_local_ip()", !is_array(swoole_get_local_ip()));
Console::put("swoole_version()", !is_string(swoole_version()));
if (!class_exists('swoole_process')) {
    Console::put("no have swoole_process", true, true);
}
$server = new swoole_process(function ($process) {
    $php = $_SERVER['_'];
    return $process->exec($php, array(__DIR__ . "/../examples/server.php", 'daemon'));
}, false, false);
if (!$server->start()) {
    Console::put("Server start failed.", true, true);
}
usleep(200000);
register_shutdown_function(function () {
    global $server;
    if (swoole_process::kill($server->pid, SIGTERM)) {
        Console::put("swoole_process::kill()");
        $status = swoole_process::wait();
        Console::put("swoole_process::wait()", !($status['pid'] == $server->pid));
    } else {
        Console::put("swoole_process::kill()", true);
    }
    echo "------------------------------------------------------------------\n";
    echo "Swoole UnitTest Finish.\n";
});
Exemple #24
0
<?php

$redirect_stdout = true;
$process = new swoole_process('callback_function', $redirect_stdout);
$worker_pid = $process->start();
echo "new worker,PID=" . $worker_pid . PHP_EOL;
function callback_function($worker)
{
    echo "workerstart PID=" . $worker->pid . "\n";
    sleep(2);
    $worker->write("hello world!\n");
    $recv = $worker->read();
    echo "worker receive : {$recv} \n";
    $worker->exit(0);
}
$ret = swoole_process::wait();
var_dump($ret);
echo "Master Receive:\n" . $process->read() . PHP_EOL;
$process->write("master");
$ret = swoole_process::wait();
var_dump($ret);
sleep(2);
Exemple #25
0
 /**
  * 开启http服务 web api
  * @param $opt
  */
 public static function params_http($opt)
 {
     if (!isset($opt["http"])) {
         return false;
     }
     if (isset($opt["host"]) && $opt["host"]) {
         self::$host = $opt["host"];
     }
     if (isset($opt["port"]) && $opt["port"]) {
         self::$port = $opt["port"];
     }
     $process = new swoole_process(array(new Main(), "http_run"));
     $process->start();
     self::$http_server = $process;
     swoole_event_add($process->pipe, function ($pipe) use($process) {
         $manager = new Manager();
         $recv = $process->read();
         $recv = explode("#@#", $recv);
         $function = $recv[0] . "_cron";
         $process->write(json_encode($manager->{$function}(json_decode($recv[1], true))));
     });
     return true;
 }
Exemple #26
0
<?php

$table = new swoole_table(1024);
$table->column('id', swoole_table::TYPE_INT, 4);
//1,2,4,8
$table->column('name', swoole_table::TYPE_STRING, 64);
$table->column('num', swoole_table::TYPE_FLOAT);
$table->create();
$worker = new swoole_process('child1', false, false);
$worker->start();
//child
function child1($worker)
{
    global $table;
    $table->set('*****@*****.**', array('id' => 145, 'name' => 'rango', 'num' => 3.1415));
    $table->set('*****@*****.**', array('id' => 358, 'name' => "Rango1234", 'num' => 3.1415));
    $table->set('*****@*****.**', array('id' => 189, 'name' => 'rango3', 'num' => 3.1415));
    sleep(100000);
}
//master
sleep(1);
$s = microtime(true);
for ($i = 0; $i < 1000; $i++) {
    $arr = $table->get('*****@*****.**');
}
echo "use: " . (microtime(true) - $s) * 1000 . "ms\n";
//var_dump($table->get('*****@*****.**'));
sleep(100000);
Exemple #27
0
function create_process()
{
    $process = new swoole_process("process_run");
    $process->start();
}
Exemple #28
0
 /**
  * 创建子进程
  *
  */
 public function create_process($task)
 {
     $this->task = $task;
     $process = new swoole_process(array($this, 'run'), true);
     $pid = $process->start();
 }
Exemple #29
0
<?php

const WORK_NUM = 250;
for ($i = 0; $i < WORK_NUM; $i++) {
    $process = new swoole_process(function ($worker) {
        $worker->exec("/usr/bin/php", array("/mnt/hgfs/work/swoole/swoole_task/chat_room/client.php"));
    });
    $process->start();
}
for ($i = 0; $i < WORK_NUM; $i++) {
    swoole_process::wait();
    // 回收结束运行的子进程
}
Exemple #30
0
 public function eventAction()
 {
     $context_option['socket']['backlog'] = 1024;
     $context = stream_context_create($context_option);
     SwooleController::$socket = stream_socket_server('tcp://192.168.80.140:9021', $errno = 0, $errmsg = '', STREAM_SERVER_BIND | STREAM_SERVER_LISTEN, $context);
     // 尝试打开tcp的keepalive,关闭TCP Nagle算法
     if (function_exists('socket_import_stream')) {
         $s = socket_import_stream(SwooleController::$socket);
         @socket_set_option($s, SOL_SOCKET, SO_KEEPALIVE, 1);
         @socket_set_option($s, SOL_SOCKET, TCP_NODELAY, 1);
     }
     stream_set_blocking(SwooleController::$socket, 0);
     #$socket = System_Socket::create(AF_INET,SOCK_STREAM,0);
     #SwooleController::$socket = $socket;
     /*$socket->bind('127.0.0.1',9021);
       $socket->listen(1024);
       #print_r($socket->listenfd());
       SwooleController::$socket = $socket;
       SwooleController::$socket->setBlocking(false);
       */
     echo "Master: parent, PID=" . posix_getpid() . "\n";
     $workers = array();
     $worker_num = 1;
     $worker_last = 0;
     function callback_function(swoole_process $worker)
     {
         echo "Worker: start. PID={$worker->pid}.\n";
         echo "Worker: pipe={$worker->pipe}\n";
         SwooleController::$event_base = event_base_new();
         SwooleController::$event = event_new();
         $GLOBALS['worker'] = $worker;
         function do_write($fd, $what, $arg)
         {
             SwooleController::$size--;
             $len = fwrite($fd, SwooleController::$send_str);
             event_del(SwooleController::$write_event[$arg]);
             unset(SwooleController::$write_event[$arg]);
             unset(SwooleController::$read_event[$arg]);
             fclose($fd);
         }
         function do_read($fd, $what, $arg)
         {
             $recv_buf = '';
             while (1) {
                 $buffer = fread($fd, 8192);
                 #echo "123\n";
                 if ($buffer === '' || $buffer === false) {
                     break;
                 }
                 $recv_buf .= $buffer;
             }
             #echo 'I have received that : '.$recv_buf;
             #fwrite(SwooleController::$client, " OK\n");
             $write_event = event_new();
             SwooleController::$write_event[$arg] = $write_event;
             event_set(SwooleController::$write_event[$arg], $fd, EV_WRITE | EV_PERSIST, 'do_write', $arg);
             event_base_set(SwooleController::$write_event[$arg], SwooleController::$event_base);
             event_add(SwooleController::$write_event[$arg]);
             #fclose(SwooleController::$client);
             event_del(SwooleController::$read_event[$arg]);
         }
         function do_accept($fd, $what, $arg)
         {
             $res = $GLOBALS['worker']->read();
             #echo $res;
             $client = @stream_socket_accept(SwooleController::$socket, 0);
             stream_set_blocking($client, 0);
             $recv = $GLOBALS['worker']->write('0');
             $read_event = event_new();
             $idx = intval($read_event);
             #SwooleController::$client[$idx] = $client;
             SwooleController::$read_event[$idx] = $read_event;
             #print_r(SwooleController::$read_event);
             event_set(SwooleController::$read_event[$idx], $client, EV_READ | EV_PERSIST, 'do_read', $idx);
             event_base_set(SwooleController::$read_event[$idx], SwooleController::$event_base);
             event_add(SwooleController::$read_event[$idx]);
             /*$message= fread(SwooleController::$client, 8192);
                             echo 'I have received that : '.$message;
             
                             fwrite(SwooleController::$client, " OK\n");
             
             
                             fclose(SwooleController::$client);*/
             #event_del(SwooleController::$event);
         }
         event_set(SwooleController::$event, $worker->pipe, EV_READ | EV_PERSIST, 'do_accept');
         event_base_set(SwooleController::$event, SwooleController::$event_base);
         event_add(SwooleController::$event);
         event_base_loop(SwooleController::$event_base);
     }
     $event_base = event_base_new();
     function do_listen_restart($pipe)
     {
         $res = SwooleController::$workers_pipe[$pipe]->read();
         #echo $pipe."\n";
         SwooleController::$stop = 0;
     }
     for ($i = 0; $i < SwooleController::$worker_num; $i++) {
         $process = new swoole_process('callback_function', false, true);
         $pid = $process->start();
         SwooleController::$workers[$i] = $process;
         echo "Master: new worker, PID={$pid}\n";
         SwooleController::$workers_pipe[$process->pipe] = $process;
         SwooleController::$restart_event[$i] = event_new();
         event_set(SwooleController::$restart_event[$i], $process->pipe, EV_READ | EV_PERSIST, 'do_listen_restart');
         event_base_set(SwooleController::$restart_event[$i], $event_base);
         event_add(SwooleController::$restart_event[$i]);
         /*swoole_event_add($process->pipe,function($pipe){
               $read = SwooleController::$workers_pipe[$pipe]->read();
               SwooleController::$stop = 0;
           });*/
     }
     function do_dispatch()
     {
         if (!SwooleController::$stop) {
             #print_r('___'.SwooleController::$socket."\n");
             $w_i = (SwooleController::$worker_last + 1) % SwooleController::$worker_num;
             SwooleController::$worker_last = $w_i;
             SwooleController::$workers[$w_i]->write('c');
             SwooleController::$stop = 1;
         }
     }
     $event = event_new();
     event_set($event, SwooleController::$socket, EV_READ | EV_PERSIST, 'do_dispatch');
     event_base_set($event, $event_base);
     event_add($event);
     /*swoole_event_add(SwooleController::$socket,function ($fd){
                 #print_r("stop--->>>>".SwooleController::$stop."\n");
     
                 if (!SwooleController::$stop){
     
                     #print_r('___'.SwooleController::$socket."\n");
     
                     $w_i = (SwooleController::$worker_last+1)%SwooleController::$worker_num;
                     SwooleController::$worker_last = $w_i;
     
     
                     SwooleController::$workers[$w_i]->write('c');
                     SwooleController::$stop = 1;
                 }else {
                     #print_r("pipe_read_start\n");
                     #$read = SwooleController::$workers[SwooleController::$worker_last]->read();
                     #print_r("pipe_read--->>>>".$read."\n");
                     #SwooleController::$stop = $read;
                     #echo 123;
                 }
     
                 #swoole_event_del($fd);
             });*/
     event_base_loop($event_base);
     //swoole_event_wait();
     swoole_process::wait();
 }