/** * @brief 启动子进程 * @param \swoole_process $worker */ public function start(\swoole_process $worker) { $this->_worker = $worker; swoole_event_add($worker->pipe, function ($pipe) use($worker) { echo $worker->read() . PHP_EOL; }); $this->worker(); }
function callback_process_function(swoole_process $worker) { set_time_limit(300); $task = json_decode($worker->read(), true); $worker->name('crontab.php worker=' . $task['uniqid']); $Handle = new TimingCall_Handle($task); $Handle->upNextExecuteTime(); $Handle->refreshStatistics(); $Handle->Execute(); $worker->exit(0); }
function callback_function(swoole_process $worker) { echo "Worker: start. PID=" . $worker->pid . "\n"; //recv data from master $recv = $worker->read(); echo "From Master: {$recv}\n"; //send data to master $worker->write("hello master\n"); sleep(2); $worker->exit(0); }
/** * @brief 读取管道中的消息包体 * @param \swoole_process $process */ public function readPipe(\swoole_process $process) { while (false !== ($content = $process->read())) { if (false === $content) { \Aha\Log\Sys::log()->error(array('IPC_PIPE_READ_ERR' => $content)); break; } else { $this->append($content); } if (strlen($content) < 8191) { break; } } }
function child_async(swoole_process $worker) { //echo "Worker: start. PID=".$worker->pid."\n"; //recv data from master $GLOBALS['worker'] = $worker; global $argv; $worker->name("{$argv[0]}: worker"); swoole_process::signal(SIGTERM, function ($signal_num) use($worker) { echo "signal call = {$signal_num}, #{$worker->pid}\n"; }); swoole_event_add($worker->pipe, function ($pipe) use($worker) { $recv = $worker->read(); echo "From Master: {$recv}\n"; $worker->write("hello master\n"); }); }
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(); } }); }
/** * 创建一个子进程 * @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); } }); }
{ $binpath = $_SERVER["_"]; $worker->exec($binpath, array(ROOT_PATH . "http_test.php", $worker->pipe)); } $process = new swoole_process("fork"); $process->start(); function process_run($worker) { echo "abc\n"; $worker->exit(0); exit; } function create_process() { $process = new swoole_process("process_run"); $process->start(); } swoole_timer_add(1000, function ($interval) { create_process(); create_process(); }); swoole_process::signal(SIGCHLD, function ($signo) { while ($pid = pcntl_wait($status, WNOHANG)) { echo $pid . "\n"; } }); swoole_event_add($process->pipe, function ($pipe) use($process) { $ret = $process->read(); echo $ret; $process->write($ret); });
<?php $process = new swoole_process('callback_function', true); $pid = $process->start(); function callback_function(swoole_process $worker) { $worker->exec('/usr/local/bin/php', array(__DIR__ . '/stdin_stdout.php')); } echo "From Worker: " . $process->read(); $process->write("hello worker\n"); echo "From Worker: " . $process->read(); $ret = swoole_process::wait(); var_dump($ret);
public function onTmpProcess(swoole_process $worker) { $cmd = $worker->read(); $handle = popen($cmd, 'r'); swoole_event_add($worker->pipe, function () use($worker, $handle) { $cmd = $worker->read(); if ($cmd == 'exit') { $worker->exit(); } fwrite($handle, $cmd); }); while (!feof($handle)) { $buffer = fread($handle, 18192); echo $buffer; } }
* websocket server配置 */ $server->set(array('worker_num' => 1, 'daemonize' => false, 'max_request' => 1000, 'dispatch_mode' => 1)); /** * websocket server start * 成功后回调 */ $server->on('start', function ($serv) use($_maxMasterPidLength, $_maxManagerPidLength, $_maxWorkerIdLength, $_maxWorkerPidLength) { echo "[1A\n[K-----------------------[47;30m SWOOLE [0m-----------------------------\n[0m"; echo 'swoole version:' . swoole_version() . " PHP version:" . PHP_VERSION . "\n"; echo "------------------------[47;30m WORKERS [0m---------------------------\n"; echo "[47;30mMasterPid[0m", str_pad('', $_maxMasterPidLength + 2 - strlen('MasterPid')), "[47;30mManagerPid[0m", str_pad('', $_maxManagerPidLength + 2 - strlen('ManagerPid')), "[47;30mWorkerId[0m", str_pad('', $_maxWorkerIdLength + 2 - strlen('WorkerId')), "[47;30mWorkerPid[0m", str_pad('', $_maxWorkerPidLength + 2 - strlen('WorkerPid')), "\n"; global $process; //将process->pipe加入到swoole的reactor事件监听中 swoole_event_add($process->pipe, function ($pipe) use($process, $serv) { $str = $process->read(); $conn_list = $serv->connection_list(); if (!empty($conn_list)) { foreach ($conn_list as $fd) { $serv->push($fd, $str); } } }); }); /** * swoole_process回调函数 * @param swoole_process $worker */ function callback_vmstat(swoole_process $worker) { global $table;
//创建的进程数 $finished = false; $lock = new swoole_lock(SWOOLE_MUTEX); for ($i = 0; $i < $worker_num; $i++) { $process = new swoole_process('process'); //$process->useQueue(); $pid = $process->start(); $workers[$pid] = $process; } foreach ($workers as $pid => $process) { //子进程也会包含此事件 swoole_event_add($process->pipe, function ($pipe) use($process, $lock, &$finished) { $lock->lock(); if (!$finished) { $finished = true; $data = $process->read(); echo "RECV: " . $data . PHP_EOL; } $lock->unlock(); }); } function process(swoole_process $process) { $response = 'http response'; $process->write($response); echo $process->pid, "\t", $process->callback . PHP_EOL; } for ($i = 0; $i < $worker_num; $i++) { $ret = swoole_process::wait(); $pid = $ret['pid']; echo "Worker Exit, PID=" . $pid . PHP_EOL;
<?php $process = new swoole_process('pyhon_process', true); $pid = $process->start(); function pyhon_process(swoole_process $worker) { $worker->exec('/usr/bin/python', array("echo.py")); } $process->write("hello world\n"); echo $process->read(); $ret = swoole_process::wait(); var_dump($ret);
function dosomething($data) { //具体要子进程处理的逻辑 如果这里的处理时间越长,使用多进程处理会越显优势 sleep(2); return 1; } //启动4个进程进行处理 $worker_num = 4; for ($i = 0; $i < $worker_num; $i++) { $process = new swoole_process('callback_function', false, true); $pid = $process->start(); $process->write(dotest()); $process->pid = $pid; // $workers[$pid] = $process; swoole_event_add($process->pipe, function ($pipe) use($process) { $recv = $process->read(); if ($recv != '') { $data = dotest(); if ($data != false) { $process->write($data); } else { swoole_process::kill($process->pid); } } }); } //开启子进程进行异步处理 function callback_function(swoole_process $worker) { $GLOBALS['worker'] = $worker; swoole_event_add($worker->pipe, function ($pipe) {
echo "#{$server->worker_id} message from #{$src_worker_id}: {$data}\n"; }); $server->on('task', function ($server, $task_id, $from_id, $data) { var_dump($task_id, $from_id, $data); }); $server->on('finish', function ($server, $fd, $from_id) { }); $server->on('receive', function (swoole_server $server, $fd, $from_id, $data) { if (trim($data) == 'task') { $server->task("async task coming"); } else { $worker_id = 1 - $server->worker_id; $server->sendMessage("hello task process", $worker_id); } }); $server->start(); $server = new swoole_server('127.0.0.1', 9501); $process = new swoole_process(function ($process) use($server) { while (true) { $msg = $process->read(); foreach ($server->connections as $conn) { $server->send($conn, $msg); } } }); $server->addProcess($process); $server->on('receive', function ($serv, $fd, $from_id, $data) use($process) { //群发收到的消息 $process->write($data); }); $server->start();
<?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);
//$worker->write("hello\n"); //var_dump($worker); //$worker->exit(0); //接受主进程的消息,并回复一个"hello master" /** swoole_event_add($worker->pipe, function($pipe) { $worker = $GLOBALS['process']; $recv = $worker->read(); //这里var_dump不是指向标准输出,而是指向 $worker->pipe, 发出的数据在主进程的$process->read()中可以接收到 // 这个特性在构造函数的第二个参数,修改为false即可打印到stdout var_dump("From Master: $recv"); sleep(2); //send data to master $worker->write("hello master\n"); sleep(2); $worker->exit(0); }); **/ } //发送给子进程$process一个消息 //$process->write("Hi, I am writing into a worker"); // 同步阻塞,可以用swoole_event_add加入事件监听 var_dump($process->read()); // swoole_event_add($process->pipe, function($pipe){ // $worker = $GLOBALS['process']; // $recv = $worker->read(); // //var_dump($recv); // echo "I am from eventloop. Content: $recv \n"; // }); echo "I must come first \n"; swoole_process::wait();
/** * 开启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; }