/** * @brief 子进程进入控制调度 */ protected function _start() { swoole_event_add($this->_worker->pipe, function ($pipe) { $package = $this->_worker->read(); $this->_stats($package); }); }
/** * @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(); }
protected function _initPipeEvents($process, $workerType) { \Daemon\Library\Ipc\Shared::setCurrentTaskTable($process->pid, array('taskNum' => 0, 'workerType' => $workerType)); $objMaster = \Daemon\Process\Master::getInstance(); swoole_event_add($process->pipe, function ($pipe) use($process, $objMaster) { $objMaster->dispatch($process); }); }
function init() { $this->serv->on('WorkerStart', function (\swoole_server $serv, $worker_id) { //每1分钟向服务器上报 $serv->tick(60000, [$this, 'onTimer']); swoole_event_add($this->centerSocket->sock, [$this, 'onPacket']); }); $this->log(__CLASS__ . '-' . self::VERSION . ' is running.'); }
public function __construct() { $this->process = new swoole_process(array($this, 'run'), false, true); //$this->process->daemon(true,true); $this->process->start(); swoole_event_add($this->process->pipe, function ($pipe) { $data = $this->process->read(); echo "RECV: " . $data . PHP_EOL; }); }
/** * create mysql connection */ protected function createConnection() { $config = $this->config; $db = new \mysqli(); $db->connect($config['host'], $config['user'], $config['password'], $config['database'], $config['port']); $db_sock = swoole_get_mysqli_sock($db); swoole_event_add($db_sock, array($this, 'onSQLReady')); $this->idle_pool[] = array('object' => $db, 'socket' => $db_sock); $this->connection_num++; }
public function onConnect($client) { fwrite(STDOUT, "Enter Msg:"); swoole_event_add(STDIN, function ($fp) { global $client; fwrite(STDOUT, "Enter Msg:"); $msg = trim(fgets(STDIN)); $client->send($msg); }); }
function onStart($serv) { $this->serv = $serv; for ($i = 0; $i < $this->pool_size; $i++) { $db = new mysqli(); $db->connect('172.16.1.19', 'test', 'test', '1188test'); $db_sock = swoole_get_mysqli_sock($db); swoole_event_add($db_sock, array($this, 'onSQLReady')); $this->idle_pool[] = array('mysqli' => $db, 'db_sock' => $db_sock, 'fd' => 0); } echo "Server: start.Swoole version is [" . SWOOLE_VERSION . "]\n"; }
public function task_run($worker) { swoole_event_add($worker->pipe, function ($pipe) use($worker) { $data = $worker->read(); var_dump($worker->pid . ": " . $data); if ($data == 'exit') { $worker->exit(); exit; } sleep(5); $worker->write("" . $worker->pid); }); }
function callback_function(swoole_process $worker) { $GLOBALS['worker'] = $worker; swoole_event_add($worker->pipe, function ($pipe) { $worker = $GLOBALS['worker']; $recv = $worker->read(); if ($recv) { $data = call_user_func_array('dosomething', [json_decode($recv, true)]); $worker->write($data); } else { $worker->write(''); } }); }
public function onConnect($cli) { fwrite(STDOUT, "Enter your name: "); $msg = trim(fgets(STDIN)); $data = json_encode(array('json' => 'Chat', 'ctrl' => 'Chat', 'method' => 'online', 'name' => $msg)); $data = pack("Na*", strlen($data), $data); $cli->send($data); swoole_event_add(STDIN, function ($fp) { global $cli; $msg = trim(fgets(STDIN)); $data = json_encode(array('json' => 'Chat', 'ctrl' => 'Chat', 'method' => 'send', 'sendto' => $this->channel, 'msg' => $msg)); $data = pack("Na*", strlen($data), $data); $cli->send($data); }); }
function callback_function_async(swoole_process $worker) { echo "Worker: start. PID=" . $worker->pid . "\n"; //recv data from master $GLOBALS['worker'] = $worker; swoole_event_add($worker->pipe, function ($pipe) { $worker = $GLOBALS['worker']; $recv = $worker->read(); echo "From Master: {$recv}\n"; //send data to master $worker->write("hello master\n"); sleep(5); $worker->exit(0); }); }
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 __construct() { $fp = stream_socket_client("tcp://127.0.0.1:9504", $code, $msg, 3); $http_request = "GET /index.html HTTP/1.1\r\n\r\n"; fwrite($fp, $http_request); swoole_event_add($fp, function ($fp) { echo fread($fp, 8192); swoole_event_del($fp); fclose($fp); }); swoole_timer_after(2000, function () { echo "2000ms timeout\n"; }); swoole_timer_tick(1000, function () { echo "1000ms interval\n"; }); }
public function onStart($server) { $pro_vs = $this->process; $server = $this->server; $application_vm = $this->application; swoole_event_add($pro_vs->pipe, function ($pipe) use($pro_vs, $server, $application_vm) { $str = $pro_vs->read(); ob_start(); $application_vm->execute(array('swoole_socket', 'getfd'), 'vmstat'); $result = ob_get_contents(); ob_end_clean(); $result_fd = json_decode($result, true); foreach ($result_fd as $id => $fd) { $server->push($fd, $str); } }); }
public function onConnect($cli) { $this->client->sendHeader($this->client->createHeader()); fwrite(STDOUT, "Enter your name: "); $msg = trim(fgets(STDIN)); $data = json_encode(array('json' => 'Chat', 'ctrl' => 'Chat', 'method' => 'online', 'name' => $msg)); $this->client->send($data); swoole_event_add(STDIN, function ($fp) { $msg = trim(fgets(STDIN)); if ($msg == 'exit') { $data = json_encode(array('json' => 'Chat', 'ctrl' => 'Chat', 'method' => 'offline', 'name' => $msg)); $this->client->send($data); exit; } $data = json_encode(array('json' => 'Chat', 'ctrl' => 'Chat', 'method' => 'send', 'sendto' => $this->channel, 'msg' => $msg)); $this->client->send($data); }); }
/** * 创建一个子进程 * @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); } }); }
public function onConnect($cli) { fwrite(STDOUT, "Enter cmd:"); swoole_event_add(STDIN, function ($fp) { global $cli; $cmd = trim(fgets(STDIN)); if (is_numeric($cmd)) { $filename = "Test.txt"; $i = intval($cmd); if ($i == Client::UPLOAD) { $cli->sendfile($filename); } else { if ($i == Client::DOWNLOAD) { $cli->send(Client::DOWNLOAD, $filename); } } } }); }
/** * [send 兼容Base类封装的send方法,调度器可以不感知client类型] * @param [type] $callback [description] * @return [type] [description] */ public function send(callable $callback) { if (!isset($this->db)) { echo " db not init \n"; //TODO do callback function to task return; } //TODO conf check $config = $this->conf; $this->callback = $callback; $this->calltime = microtime(true); $this->key = md5($this->calltime . $config['host'] . $config['port'] . rand(0, 10000)); $this->db->connect($config['host'], $config['user'], $config['password'], $config['database'], $config['port']); if (!empty($config['charset'])) { $this->db->set_charset($config['charset']); } $db_sock = swoole_get_mysqli_sock($this->db); swoole_event_add($db_sock, array($this, 'onSqlReady')); $this->doQuery($this->sql); }
/** * @param $serverPid * @throws NotFound */ function __construct($serverPid) { $this->pid = $serverPid; if (posix_kill($serverPid, 0) === false) { throw new NotFound("Process#{$serverPid} not found."); } $this->inotify = inotify_init(); $this->events = IN_MODIFY | IN_DELETE | IN_CREATE | IN_MOVE; swoole_event_add($this->inotify, function ($ifd) { $events = inotify_read($this->inotify); if (!$events) { return; } var_dump($events); foreach ($events as $ev) { if ($ev['mask'] == IN_IGNORED) { continue; } else { if ($ev['mask'] == IN_CREATE or $ev['mask'] == IN_DELETE or $ev['mask'] == IN_MODIFY or $ev['mask'] == IN_MOVED_TO or $ev['mask'] == IN_MOVED_FROM) { $fileType = strstr($ev['name'], '.'); //非重启类型 if (!isset($this->reloadFileTypes[$fileType])) { continue; } } } //正在reload,不再接受任何事件,冻结10秒 if (!$this->reloading) { $this->putLog("after 10 seconds reload the server"); //有事件发生了,进行重启 swoole_timer_after($this->afterNSeconds * 1000, array($this, 'reload')); $this->reloading = true; } } }); }
/** * create mysql connection */ protected function createConnection() { $config = $this->config; $db = new \mysqli(); $db->connect($config['host'], $config['user'], $config['password'], $config['database'], $config['port']); if ($db->connect_error) { return [$db->connect_errno, $db->connect_error]; } if (!empty($config['charset'])) { $db->set_charset($config['charset']); } $db_sock = swoole_get_mysqli_sock($db); //内置客户端不需要加入EventLoop if (!$this->haveSwooleAsyncMySQL) { swoole_event_add($db_sock, array($this, 'onSQLReady')); } else { $db->sock = $db_sock; } //保存到空闲连接池中 $this->idle_pool[$db_sock] = array('object' => $db, 'socket' => $db_sock); //增加计数 $this->connection_num++; return 0; }
/** * create mysql connection */ protected function createConnection() { $config = $this->config; $db = new \mysqli(); $db->connect($config['host'], $config['user'], $config['password'], $config['database'], $config['port']); if ($db->connect_error) { return [$db->connect_errno, $db->connect_error]; } if (!empty($config['charset'])) { $db->set_charset($config['charset']); } $db_sock = swoole_get_mysqli_sock($db); swoole_event_add($db_sock, array($this, 'onSQLReady')); $this->idle_pool[$db_sock] = array('object' => $db, 'socket' => $db_sock); $this->connection_num++; return 0; }
<?php $serv = new swoole_server("0.0.0.0", 9502); $serv->on('workerstart', function ($server, $id) { global $argv; swoole_set_process_name("php {$argv[0]}: worker"); $local_listener = stream_socket_server("127.0.0.1", 9999); swoole_event_add($local_listener, function ($server) { $local_client = stream_socket_accept($server); swoole_event_add($local_client, function ($client) { echo fread($client, 8192); fwrite($client, "hello"); }); }); }); $serv->on('connect', function (swoole_server $serv, $fd, $from_id) { //echo "connect\n";; }); $serv->on('receive', function (swoole_server $serv, $fd, $from_id, $data) { $serv->send($fd, "Swoole: " . $data); //$serv->close($fd); }); $serv->on('close', function (swoole_server $serv, $fd, $from_id) { //var_dump($serv->connection_info($fd)); //echo "onClose\n"; }); $serv->start();
<?php $fp = stream_socket_client("tcp://127.0.0.1:9501", $errno, $errstr, 30); if (!$fp) { exit("{$errstr} ({$errno})<br />\n"); } fwrite($fp, "HELLO world"); function stream_onRead($fp) { echo fread($fp, 1024) . "\n"; sleep(1); swoole_event_set($fp, null, null, SWOOLE_EVENT_READ | SWOOLE_EVENT_WRITE); //swoole_event_del($fp); //fclose($fp); } function stream_onWrite($fp) { fwrite($fp, "hi swoole\n"); swoole_event_set($fp, null, null, SWOOLE_EVENT_READ); } swoole_event_add($fp, 'stream_onRead', 'stream_onWrite'); echo "start\n";
<?php if (!function_exists('swoole_get_mysqli_sock')) { die("no async_mysql support\n"); } $db = new mysqli(); $db->connect('127.0.0.1', 'root', '123456', 'paopaogame'); $sql = "show tables"; $db->query($sql, MYSQLI_ASYNC); $readinfo = "read mysql back:" . $sql; $count = 0; swoole_event_add(swoole_get_mysqli_sock($db), function ($__db_sock) { global $db; global $readinfo; global $count; global $sql; // var_dump($__db_sock); $res = $db->reap_async_query(); var_dump($res->fetch_all(MYSQLI_ASSOC)); $db->query("SELECT * FROM paopaogame.paopaoaccount limit 0,2;", MYSQLI_ASYNC); echo $readinfo . " count=" . $count . "\n"; $count++; // echo "sleep "."1"." second"; sleep(1); }); echo "Finish\n";
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; } }
protected function _initPipeEvents() { swoole_event_add($this->_worker->pipe, function ($pipe) { $this->_onAckProcess(); }); }
echo socket_read($socket, 8192) . "\n"; $i++; if ($i > 10) { echo "finish\n"; swoole_event_del($socket); socket_close($socket); } else { sleep(1); swoole_event_set($socket, null, 'socket_onWrite', SWOOLE_EVENT_READ | SWOOLE_EVENT_WRITE); } } function socket_onWrite($socket) { socket_write($socket, "hi swoole"); swoole_event_set($socket, null, null, SWOOLE_EVENT_READ); } function socket_onConnect($socket) { $err = socket_get_option($socket, SOL_SOCKET, SO_ERROR); if ($err == 0) { echo "connect server success\n"; swoole_event_set($socket, null, 'socket_onWrite', SWOOLE_EVENT_READ); socket_write($socket, "first package\n"); } else { echo "connect server failed\n"; swoole_event_del($socket); socket_close($socket); } } swoole_event_add($socket, 'socket_onRead', 'socket_onConnect', SWOOLE_EVENT_WRITE); @socket_connect($socket, '127.0.0.1', 9501);
/** * 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; $vmstat = $table->get('vmstat'); $cmd = $vmstat['cmd']; $interval = $vmstat['interval'];
//创建的进程数 $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;