예제 #1
0
파일: Stats.php 프로젝트: eyehere/aha
 /**
  * @brief 子进程进入控制调度
  */
 protected function _start()
 {
     swoole_event_add($this->_worker->pipe, function ($pipe) {
         $package = $this->_worker->read();
         $this->_stats($package);
     });
 }
예제 #2
0
파일: Asyncworker.php 프로젝트: vucms/aha
 /**
  * @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();
 }
예제 #3
0
파일: Manager.php 프로젝트: eyehere/aha
 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);
     });
 }
예제 #4
0
 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.');
 }
예제 #5
0
 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;
     });
 }
예제 #6
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']);
     $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++;
 }
예제 #7
0
 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";
 }
예제 #9
0
 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);
     });
 }
예제 #10
0
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('');
        }
    });
}
예제 #11
0
 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);
     });
 }
예제 #12
0
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);
    });
}
예제 #13
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");
    });
}
예제 #14
0
파일: async.php 프로젝트: nosun/yaf
 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";
     });
 }
예제 #15
0
 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);
         }
     });
 }
예제 #16
0
 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);
     });
 }
예제 #17
0
 /**
  * 创建一个子进程
  * @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);
         }
     });
 }
예제 #18
0
 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);
                 }
             }
         }
     });
 }
예제 #19
0
파일: MYSQL.php 프로젝트: delphinBlue/tsf
 /**
  * [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);
 }
예제 #20
0
 /**
  * @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;
             }
         }
     });
 }
예제 #21
0
파일: MySQL.php 프로젝트: kilmas/framework
 /**
  * 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;
 }
예제 #22
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;
 }
예제 #23
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();
예제 #24
0
<?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";
예제 #25
0
<?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";
예제 #26
0
 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;
     }
 }
예제 #27
0
파일: Drive.php 프로젝트: eyehere/aha
 protected function _initPipeEvents()
 {
     swoole_event_add($this->_worker->pipe, function ($pipe) {
         $this->_onAckProcess();
     });
 }
예제 #28
0
    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);
예제 #29
0
/**
 * websocket server start
 * 成功后回调
 */
$server->on('start', function ($serv) use($_maxMasterPidLength, $_maxManagerPidLength, $_maxWorkerIdLength, $_maxWorkerPidLength) {
    echo "\n----------------------- SWOOLE -----------------------------\n";
    echo 'swoole version:' . swoole_version() . "          PHP version:" . PHP_VERSION . "\n";
    echo "------------------------ WORKERS ---------------------------\n";
    echo "MasterPid", str_pad('', $_maxMasterPidLength + 2 - strlen('MasterPid')), "ManagerPid", str_pad('', $_maxManagerPidLength + 2 - strlen('ManagerPid')), "WorkerId", str_pad('', $_maxWorkerIdLength + 2 - strlen('WorkerId')), "WorkerPid", 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'];
예제 #30
0
//创建的进程数
$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;