meshell/surf
Composer 安装命令:
composer require meshell/surf
包简介
README 文档
README
surf 是一个对Swoole扩展库的封装,它可以像传统MVC一样编写 Http,Tcp 应用.
Installation
使用Composer来安装框架.
$ composer require meshell/surf "^1.0.5"
Usage
一个简单的http应用,创建一个配置文件config.php.
# config.php return [ 'host' => '0.0.0.0', 'port' => 9527, 'setting' => [ 'reactor_num' => 8, 'worker_num' => 10, ] ];
创建一个http.php文件.
require __DIR__ . '/vendor/autoload.php'; $app = new \Surf\Application(__DIR__, [ 'app.config' => __DIR__ . '/config.php' ]); $app->addGet('/', function() { return "Hello world"; }); $app->register(new \Surf\Provider\PoolServiceProvider()); $app->run();
启动服务.
$ php http.php
浏览器打开http://127.0.0.1:9527/ 显示 "Hello world", 你也可以使用curl.
$ curl http://127.0.0.1:9527/
查看事例http
一个简单的tcp应用, 配置文件还是使用上面的config.php, 创建一个tcp.php. tcp需要设置protocol解析类. 一般tcp服务端和客户端使需要约定消息格式才能解析出正确的数据. 在surf中我们使用的默认解析格式是包头,包长,包体(unpack(A64header/Nlen/A*data))作为消息格式。调用每条协议我们是定义在包头中.
include __DIR__ . '/vendor/autoload.php'; $config = include __DIR__ . '/config.php'; $config['server'] = 'tcp'; $config['protocol'] = \Surf\Server\Tcp\Protocol\JsonProtocol::class; $app = new \Surf\Application(__DIR__, [ 'app.config' => $config ]); $app->addProtocol('user.name', Examples\TestTcpController::class . ':name'); $app->run();
编写客户端程序client.php.
$client = new Swoole\Client(SWOOLE_SOCK_TCP); if (!$client->connect('127.0.0.1', 9527, -1)) { exit("connection failed"); } $message = json_encode([ 'name' => 'meShell', 'age' => 18, 'job' => 'engineer' ]); $hex = pack('A64NA*', "name=user.name;format=json", strlen($message), $message); $client->send($hex); echo $client->recv(); $client->close();
启动服务
$ php tcp.php
连接服务
$ php client.php
打印服务返回内容: "my name is meShell, my age is 18, My job is an engineer";
查看事例tcp
Connection pool
在surf中使用连接池功能.
#config.php return [ ... 'database' => [ 'default' => [ 'driver' => 'mysql', 'host' => 'localhost', 'database' => 'test', 'username' => 'root', 'password' => "123456", 'options' => [], ], ], 'cache' => [ 'default' => [ 'driver' => 'redis', 'host' => '127.0.0.1', 'port' => 6379, // 'prefix' => 'SURF:' // 'auth' => 'password' ], ], 'pool' => [ 'interval' => 100, //心跳检测时间,以毫秒为单位 'database' => [ 'default' => [ 'start_number' => 10 //默认开启 ], ], 'cache' => [ 'default' => [ 'start_number' => 10 //默认开启 ], ], ], ];
在启动文件里注册provider.
$app->register(new \Surf\Provider\PoolServiceProvider());
在Controller中获取连接池中的对象.
/** * @var $pool PoolManager */ $pool = $this->container->get('pool'); //获取连接池管理对象 /** * @var $pdo \Surf\Pool\Connection 获取一个数据库对象 */ $pdo = $pool->pop('database.default'); //从database.default池子中获取当前对象 /** * 获取一个缓存对象 需要注册 * $app->register(new \Surf\Provider\CacheServiceProvider()); */ $redis = $pool->pop('cache.default'); //从cache.default池子中获取当前对象
查看事例pool
Usage Session and Cookie
session 和 cookie 在web开发中是经常需要使用的保存一些登录信息, 登录状态等等.
在匿名函数中使用. 在回调函数时候框架会自动将路由变量, request, cookies 这几个参数填充到函数.
use Surf\Server\Http\Cookie\CookieAttributes; $app->addGet('/', function($routeVars, Request $request, Cookies $cookies) { $session = $request->session; //获取session 对象 $session->set('userInfo', ['id' => 1]); //使用cookie, 传入一个CookieAttributes对象 $cookies->set(CookieAttributes::create('name', 'value', 0)); });
在HttpController中使用.
use Surf\Server\Http\Cookie\CookieAttributes; $app->addGet('/', 'SessionController:index'); ... class SessionController extends HttpController { ... public function index($routeVars) { $session = $this->request->session; // or $this->session; 获取session 对象 $session->set('userInfo', ['id' => 1]); //使用cookie $this->cookies->set(CookieAttributes::create('name', 'value', 0)); } }
查看事例session
任务
在控制器中使用$this->task(), 这个是异步, 想使用同步可以$this->syncTask().
... public function taskTest() { $taskId = $this->task('push all message worker' . $this->workerId, PushTaskHandle::class); //$status = $this->syncTask('sync push all message', PushTaskHandle::class); //var_dump($status); return "task push id:" . $taskId . ", workId:" . $this->workerId; }
查看事例task
全局定时器
在有些业务中我们可能会有这样的需求,比如每隔两小时需要读取下订单数.但你也可以用crontab实现.
相同时间的定时器会被最后一次添加的定时器覆盖,定时器时间单位为毫秒.
... $app->addTicker(100, \Surf\Examples\HeartbeatTicker::class); try { $app->run(); } catch (\Surf\Exception\ServerNotFoundException $e) { }
查看事例ticker
License
meshell/surf 适用场景与选型建议
meshell/surf 是一款 基于 PHP 开发的 Composer 扩展包,目前已累计 27 次下载、GitHub Stars 达 3, 最近一次更新时间为 2018 年 04 月 10 日, 在 PHP 生态内属于活跃度较高的组件。
它主要适用于以下技术方向: 「framework」 「micro」 「swoole-framework」 「micro-swoole-framework」 「micro-swoole-api」 等业务场景。在实际项目中,围绕这些方向常见需要落地的问题包括:接口对接、性能调优、并发安全、与既有框架(Laravel / ThinkPHP / Yii / Webman 等)的兼容适配,以及生产环境的日志埋点与稳定性保障。
我们在过去多个企业项目中使用过 meshell/surf 或与其功能相近的方案,如果你在选型或落地过程中遇到问题,例如 版本兼容、二次改造、私有化封装、与内部系统对接、生产 BUG 排查,欢迎联系我们协助评估。
基于 meshell/surf 在你已有业务上做功能扩展、字段裁剪、UI 适配、与内部账号 / 权限 / 日志系统的深度对接。
线上偶发问题、内存泄漏、慢查询、并发异常等排查修复;针对高流量场景做缓存、队列、索引层面的调优。
承接完整的项目从需求 → 设计 → 开发 → 上线 → 长期运维;也可按月提供技术保姆服务。
与 meshell/surf 相关的其它包
同方向 / 同关键字的高下载量 PHP Composer 包推荐,方便对比选型:
PHP Framework HLEB2 is the foundation of the web application. Provides ease of development and application performance.
Anax htmlform module.
Micro Active Record library in PHP, support chain calls, events, and relations.
Onix Micro Framework
PHP classes for database handling upon PDO
A weather module for the anax framework.
统计信息
- 总下载量: 27
- 月度下载量: 0
- 日度下载量: 0
- 收藏数: 3
- 点击次数: 2
- 依赖项目数: 0
- 推荐数: 0
其他信息
- 授权协议: MIT
- 更新时间: 2018-04-10