workerman HTTP服务端

2022-02-02
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();

 

{/if}