• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

swoole-worker: 基于swoole_process的workerman,支持毫秒级定时器,事件驱动,常驻进 ...

原作者: [db:作者] 来自: 网络 收藏 邀请

开源软件名称:

swoole-worker

开源软件地址:

https://gitee.com/FEIGE/swoole-worker

开源软件介绍:

swoole-worker

Join the chat at https://gitter.im/swoole-worker/Lobby

关于本项目

此项目是workerman(v3.4.5)的swoole移植版本,移除了对pcntl,libevent,event,ev扩展的依赖,转而使用swoole提供的swoole_process和swoole_event,定时器采用swoole的swoole_timer,server采用stream扩展

环境依赖

  • PHP版本大于等于 5.4 (推荐PHP7及以上版本)
  • POSIX操作系统(Linux, OSX, BSD)
  • Posix和Swoole扩展
  • Swoole扩展版本不小于1.9.18或者不小于2.0.8(2.0.10及其以上版本支持协程)

致谢

安装

composer require fage1151/swoole-worker

基本用法

用法与workerman兼容

协程用法

<?phpSwoole\Coroutine::create(function() {    $redis = new Swoole\Coroutine\Redis();    $res = $redis->connect('127.0.0.1', 6379);    $ret = $redis->incr('coroutine');    $redis->close();    Swoole\Coroutine::create(function() {        $redis = new Swoole\Coroutine\Redis();        $res = $redis->connect('127.0.0.1', 6379);        $ret = $redis->set('coroutine_i', 50);        $redis->close();    });});

创建进程服务

<?phprequire_once __DIR__ . '/vendor/autoload.php';use \Workerman\Worker;use \Workerman\Lib\Timer;$task = new Worker();$task->onWorkerStart = function($task){    // 每2.5秒执行一次    $time_interval = 2.5;    Timer::add($time_interval, function()    {        echo "task run\n";    });};// 运行workerWorker::runAll();

创建websocket服务

<?phprequire_once __DIR__ . '/vendor/autoload.php';use Workerman\Worker;// Create a Websocket server$ws_worker = new Worker("websocket://0.0.0.0:2346");// 4 processes$ws_worker->count = 4;// Emitted when new connection come$ws_worker->onConnect = function($connection){    echo "New connection\n"; };// Emitted when data received$ws_worker->onMessage = function($connection, $data){    // Send hello $data    $connection->send('hello ' . $data);};// Emitted when connection closed$ws_worker->onClose = function($connection){    echo "Connection closed\n";};// Run workerWorker::runAll();

创建http服务

<?phprequire_once __DIR__ . '/vendor/autoload.php';use Workerman\Worker;// #### http worker ####$http_worker = new Worker("http://0.0.0.0:2345");// 4 processes$http_worker->count = 4;// Emitted when data received$http_worker->onMessage = function($connection, $data){    // $_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER, $_FILES are available    var_dump($_GET, $_POST, $_COOKIE, $_SESSION, $_SERVER, $_FILES);    // send data to client    $connection->send("hello world \n");};// run all workersWorker::runAll();

创建WebServer

<?phprequire_once __DIR__ . '/vendor/autoload.php';use Workerman\WebServer;use Workerman\Worker;// WebServer$web = new WebServer("http://0.0.0.0:80");// 4 processes$web->count = 4;// Set the root of domains$web->addRoot('www.your_domain.com', '/your/path/Web');$web->addRoot('www.another_domain.com', '/another/path/Web');// run all workersWorker::runAll();

创建tcp server

<?phprequire_once __DIR__ . '/vendor/autoload.php';use Workerman\Worker;// #### create socket and listen 1234 port ####$tcp_worker = new Worker("tcp://0.0.0.0:1234");// 4 processes$tcp_worker->count = 4;// Emitted when new connection come$tcp_worker->onConnect = function($connection){    echo "New Connection\n";};// Emitted when data received$tcp_worker->onMessage = function($connection, $data){    // send data to client    $connection->send("hello $data \n");};// Emitted when new connection come$tcp_worker->onClose = function($connection){    echo "Connection closed\n";};Worker::runAll();

开启 SSL.

<?phprequire_once __DIR__ . '/vendor/autoload.php';use Workerman\Worker;// SSL context.$context = array(    'ssl' => array(        'local_cert' => '/your/path/of/server.pem',        'local_pk'   => '/your/path/of/server.key',    ));// Create a Websocket server with ssl context.$ws_worker = new Worker("websocket://0.0.0.0:2346", $context);// Enable SSL. WebSocket+SSL means that Secure WebSocket (wss://). // The similar approaches for Https etc.$ws_worker->transport = 'ssl';$ws_worker->onMessage = function($connection, $data){    // Send hello $data    $connection->send('hello ' . $data);};Worker::runAll();

自定义协议

Protocols/MyTextProtocol.php

<?phpnamespace Protocols;/** * User defined protocol * Format Text+"\n" */class MyTextProtocol{    public static function input($recv_buffer)    {        // Find the position of the first occurrence of "\n"        $pos = strpos($recv_buffer, "\n");        // Not a complete package. Return 0 because the length of package can not be calculated        if($pos === false)        {            return 0;        }        // Return length of the package        return $pos+1;    }    public static function decode($recv_buffer)    {        return trim($recv_buffer);    }    public static function encode($data)    {        return $data."\n";    }}
<?phprequire_once __DIR__ . '/vendor/autoload.php';use Workerman\Worker;// #### MyTextProtocol worker ####$text_worker = new Worker("MyTextProtocol://0.0.0.0:5678");$text_worker->onConnect = function($connection){    echo "New connection\n";};$text_worker->onMessage =  function($connection, $data){    // send data to client    $connection->send("hello world \n");};$text_worker->onClose = function($connection){    echo "Connection closed\n";};// run all workersWorker::runAll();

创建定时器

<?phprequire_once __DIR__ . '/vendor/autoload.php';use Workerman\Worker;use Workerman\Lib\Timer;$task = new Worker();$task->onWorkerStart = function($task){    // 2.5 seconds    $time_interval = 2.5;     $timer_id = Timer::add($time_interval,         function()        {            echo "Timer run\n";        }    );};// run all workersWorker::runAll();

异步tcp客户端 (支持tcp/ws/text/frame...)

<?phprequire_once __DIR__ . '/vendor/autoload.php';use Workerman\Worker;use Workerman\Connection\AsyncTcpConnection;$worker = new Worker();$worker->onWorkerStart = function(){    // Websocket protocol for client.    $ws_connection = new AsyncTcpConnection("ws://echo.websocket.org:80");    $ws_connection->onConnect = function($connection){        $connection->send('hello');    };    $ws_connection->onMessage = function($connection, $data){        echo "recv: $data\n";    };    $ws_connection->onError = function($connection, $code, $msg){        echo "error: $msg\n";    };    $ws_connection->onClose = function($connection){        echo "connection closed\n";    };    $ws_connection->connect();};Worker::runAll();

异步 Tcp 客户端

<?php/** * run with command * php start.php start */use \Workerman\Worker;use \Workerman\Clients\Tcp;require_once '../Autoloader.php';$worker = new Worker();$worker->onWorkerStart = function (Worker $worker) {    $url = 'www.workerman.net:80';    $tcp = new Tcp($url);    $tcp->onConnect = function ($client) {        $client->send('123');    };    $tcp->onReceive = function ($client,$data) {        var_dump($data);    };    $tcp->connect();};$worker->count = 1;Worker::$stdoutFile = '/tmp/oauth.log';Worker::$logFile = __DIR__ . '/workerman.log';Worker::$pidFile = __DIR__ . "/" . str_replace('/', '_', __FILE__) . ".pid";// 运行所有服务Worker::runAll();

异步 WebSocket 客户端

<?php/** * run with command * php start.php start */use \Workerman\Worker;use \Workerman\Clients\Ws;use \Swoole\Http\Client;require_once '../Autoloader.php';$worker = new Worker();$worker->onWorkerStart = function (Worker $worker) {    $url = 'laychat.workerman.net:9292';    $tcp = new Ws($url);    $tcp->onConnect = function (Client $client) {        var_dump($client);    };    $tcp->onMessage = function (Client $client,$data) {        $client->push('{"type":"ping"}');        var_dump($data);    };    $tcp->connect();};$worker->count = 1;Worker::$stdoutFile = '/tmp/oauth.log';Worker::$logFile = __DIR__ . '/workerman.log';Worker::$pidFile = __DIR__ . "/" . str_replace('/', '_', __FILE__) . ".pid";// 运行所有服务Worker::runAll();

异步 Dns 客户端

<?phprequire_once __DIR__ . '/vendor/autoload.php';use Workerman\Worker;$worker = new Worker('tcp://0.0.0.0:6161');$worker->onWorkerStart = function() {   swoole_async_dns_lookup("www.baidu.com", function($host, $ip){       echo "{$host} : {$ip}\n";   });};$worker->onMessage = function($connection, $host) {};Worker::runAll();

异步 Http 客户端

https网站需要依赖openssl,必须在编译swoole时启用--enable-openssl
<?php/** * run with command * php start.php start */use \Workerman\Worker;use \Workerman\Clients\Http;require_once '../Autoloader.php';$worker = new Worker();$worker->onWorkerStart = function (Worker $worker) {    $url = 'http://www.workerman.net';    $request_method = 'get';    $data = ['uid'=>1];    $http = new Http($url, $request_method);    $http->onResponse = function ($cli) {        var_dump($cli->body);    };    $http->request($data);};$worker->count = 1;Worker::$stdoutFile = '/tmp/oauth.log';Worker::$logFile = __DIR__ . '/workerman.log';Worker::$pidFile = __DIR__ . "/" . str_replace('/', '_', __FILE__) . ".pid";// 运行所有服务Worker::runAll();

异步 Mysql 客户端

<?phprequire_once '../Autoloader.php';use Workerman\Worker;use \Swoole\Mysql;$worker = new Worker('tcp://0.0.0.0:6161');$worker->onWorkerStart = function () {    global $mysql;    $mysql = new Mysql;    $server = array(        'host' => '192.168.56.102',        'port' => 3306,        'user' => 'test',        'password' => 'test',        'database' => 'test',        'charset' => 'utf8', //指定字符集        'timeout' => 2,  // 可选:连接超时时间(非查询超时时间),默认为SW_MYSQL_CONNECT_TIMEOUT(1.0)    );    $mysql->connect($server, function (Mysql $db, $r) {        if ($r === false) {            var_dump($db->connect_errno, $db->connect_error);            die;        }    });};$worker->onMessage = function ($connection, $data) {    global $mysql;    $sql = 'show tables';    $mysql->query($sql, function (Mysql $db, $r) {        if ($r === false) {            var_dump($db->error, $db->errno);        } elseif ($r === true) {            var_dump($db->affected_rows, $db->insert_id);        }        var_dump($r);    });};Worker::runAll();

异步 Redis 客户端

使用Redis客户端,需要安装hiredis库编译swoole时,在configure指令中加入--enable-async-redis

Document https://wiki.swoole.com/wiki/page/p-redis.html

<?phprequire_once '../Autoloader.php';use Workerman\Worker;use \Swoole\Redis;$worker = new Worker('tcp://0.0.0.0:6161');$worker->onWorkerStart = function () {    global $client;    $client = new Redis;    $client->connect
                      

鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
热门推荐
热门话题
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap