use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use Workerman\Protocols\Http\Request;
use Workerman\Protocols\Http\Response;
use Workerman\Protocols\Http\Session;
use Workerman\Protocols\Http\Session\RedisSessionHandler;
require_once __DIR__ . '/vendor/autoload.php';
$worker = new Worker('http://0.0.0.0:8686');
// redis配置
$config = [
'host' => '127.0.0.1', // 必选参数
'port' => 6379, // 必选参数
'timeout' => 2, // 可选参数
'auth' => '******', // 可选参数
'database' => 1, // 可选参数
'prefix' => 'session_' // 可选参数
];
// 使用 Workerman\Protocols\Http\Session::handlerClass方法来更改session底层驱动类
Session::handlerClass(RedisSessionHandler::class, $config);
// 设置session文件存储位置
FileSessionHandler::sessionSavePath('/tmp/session');
// Worker子进程启动时的回调函数,可以实例化数据库连接、文件引入等等
$worker->onWorkerStart = function(Worker $worker)
{
echo "Worker starting...\n";
};
// 连接时的回调,表示完成了TCP三次握手
$worker->onConnect = function(TcpConnection $connection)
{
echo '获取客户端IP:' . $connection->getRemoteIp() . PHP_EOL;
};
// 客户端发送数据时的回调
$worker->onMessage = function(TcpConnection $connection, Request $data)
{
// 获取get参数,指定$arg时获取单个参数,如果$arg没有值则指定为$default
$get = $request->get($arg = '', $default = '');
// 获取post参数,指定$arg时获取单个参数,如果$arg没有值则指定为$default
$post = $request->post($arg = '', $default = '');
// 获得原始请求post包体
$post = json_decode($request->rawBody(), true);
// 获取请求头,指定$arg时获取单个参数,如果$arg没有值则指定为$default
$headers = $request->header($arg = '', $default = '');
// 获取cookie,指定$arg时获取单个参数,如果$arg没有值则指定为$default
$cookies = $request->cookie($arg = '', $default = '');
// 获取整个上传文件数组,指定$arg时获取单个文件;上传文件大小受到defaultMaxPackageSize限制,默认10M,可修改。
$cookies = $request->file($arg = '');
[
'file' => [
'name' => '123.jpg',
'tmp_name' => '/tmp/workerman.upload.9hjR4w',
'size' => 1196127,
'error' => 0,
'type' => 'application/octet-stream',
],
];
// 获取host,$bool为true时不获取端口
$host = $request->host($bool = true);
// 获取请求方法
$method = $request->method();
// 返回请求的uri,包括path和queryString部分
$uri = $request->uri();
// 返回请求的path部分
$path = $request->path();
// 返回请求的queryString部分
$query_string = $request->queryString();
// 返回字符串,由字母和数字组成
$sid = $request->sessionId();
// 获取session对象
$session = $request->session();
// 设置session
$session->set('name', 'tome');
// 批量设置
$session->put(['name' => 'tom', 'age' => 12]);
// 获取session值,获取不到时设置为$default
$session->get('name', $default = '');
// 获取所有session数据
$all = $session->all();
// 删除session
$session->forget('name');
$session->delete('name');
// 删除多项session
$session->forget(['name', 'age']);
// 获取并删除session某个值
$name = $session->pull('name');
// 删除所有session数据
$session->flush();
// session值不存在或为null时返回flase,否则返回true
$has = $session->has('name');
// session值不存在时返回false,否则返回true
$has = $session->exists('name');
// 简洁响应
$connection->send("hello");
// 复杂响应,设置状态码、响应头,响应内容
$response = new Response(200, [
'X-Header-One' => 'Header Value'
], 'this is body');
// 添加响应头
$response->header('Content-Type', 'text/html');
// 设置cookie
$response->cookie('name', 'tom');
$connection->send($response);
// 响应发送文件
$response = (new Response())->withFile($file);
$connection->send($response);
// 分段发送响应
// 首先发送一个带Transfer-Encoding: chunked头的Response响应
$connection->send(new Response(200, array('Transfer-Encoding' => 'chunked'), 'hello'));
// 后续Chunk数据用Workerman\Protocols\Http\Chunk类发送
$connection->send(new Chunk('第一段数据'));
$connection->send(new Chunk('第二段数据'));
$connection->send(new Chunk('第三段数据'));
// 最后必须发送一个空的chunk结束响应
$connection->send(new Chunk(''));
};
// 客户端关闭连接时的回调
$worker->onClose = function(TcpConnection $connection)
{
echo "connection{$connection->id} closed\n";
};
// 连接错误时的回调
$worker->onError = function(TcpConnection $connection, $code, $msg)
{
echo "error $code $msg\n";
};
// 运行worker
Worker::runAll();