Swoole 服务器

Swoole 服务器依赖于 swoole 并且提供灵活优雅的实现方式。

swoole 必须依赖于 ext-swoole 扩展,并且版本 >= 1.9.6

swoole 服务器的配置文件存放在 config/server.php 中,其中 host 选项是必填,options 配置项请看 server 配置选项

  1. $ php bin/server {start|status|stop|reload} [-d: 守护进程] [-t: web root 目录,默认使用当前命令执行路径]

默认操作方式是 status,可用于简单查看进程状态。

访问的方式与 FPM 下访问保持一致。开发环境下推荐使用 FPM,生产环境可以尝试用 Swoole 代替 FPM,如果有必要的话

守护进程

以守护进程的方式启动,只需要加一个 —daemon|-d 选项即可。

  1. $ php bin/server {start|status|stop|reload} -d > /dev/null

启动守护进程需要屏蔽输出,屏蔽输出仅仅是屏蔽输出而已,并不会对程序和性能造成影响。

以上即可通过不修改代码,支持 Swoole 操作。

多端口监听

服务器支持多端口监听,只需要简单的配置。

  1. <?php
  2. return [
  3. 'host' => 'http://0.0.0.0:9527',
  4. 'class' => \FastD\Servitization\Server\HTTPServer::class,
  5. 'options' => [
  6. 'pid_file' => __DIR__ . '/../runtime/pid/' . app()->getName() . '.pid',
  7. 'worker_num' => 10,
  8. 'task_worker_num' => 20,
  9. ],
  10. 'listeners' => [
  11. [
  12. 'class' => \FastD\Servitization\Server\TCPServer::class,
  13. 'host' => 'tcp://127.0.0.1:9528',
  14. 'options' => [
  15. ]
  16. ],
  17. [
  18. 'class' => \FastD\Servitization\Server\ManagerServer::class,
  19. 'host' => 'tcp://127.0.0.1:9529',
  20. ],
  21. ],
  22. ];

框架提供一个默认的 TCP 服务,以提供 TCP 调用,可以通过创建发现服务器,监控实现一套 RPC 系统。

每个需要监听的端口需要继承 FastD\Swoole\Server 对象,实现内部抽象方法,具体请查看 examples

注意事项

swoole_http_serverswoole_websocket_server 因为是使用继承子类实现的,无法使用 listen 创建 Http/WebSocket 服务器。如果服务器的主要功能为RPC,但希望提供一个简单的Web管理界面。

在这样的场景中,可以先创建 Http/WebSocket 服务器,然后再进行 listen 监听 RPC 服务器的端口。

因为多端口是共享进程处理的,所以如果要使用 task 任务处理,需要在主服务器中处理 doTask 回调方法。

服务器进程

服务器内置 Process 进程,在启动服务器的时候会自动拉起进程,通过 Swoole::addProcess 实现。

配置依然是 server.php

  1. <?php
  2. return [
  3. 'host' => 'http://0.0.0.0:9527',
  4. 'class' => \FastD\Servitization\Server\HTTPServer::class,
  5. 'options' => [
  6. 'pid_file' => __DIR__ . '/../runtime/pid/' . app()->getName() . '.pid',
  7. 'worker_num' => 10,
  8. 'task_worker_num' => 20,
  9. ],
  10. 'processes' => [
  11. ],
  12. ];

重写 FastD\Swoole\Processhandle 方法,handle 为进程具体执行的事务。示例: DemoProcessor

完整的配置
  1. <?php
  2. return [
  3. 'listen' => 'http://0.0.0.0:9527',
  4. 'class' => \FastD\Servitization\Server\HTTPServer::class,
  5. 'options' => [
  6. 'pid_file' => '',
  7. 'worker_num' => 10,
  8. 'task_worker_num' => 20,
  9. ],
  10. 'processes' => [
  11. ],
  12. 'listeners' => [
  13. [
  14. 'class' => \FastD\Servitization\Server\TCPServer::class,
  15. 'host' => 'tcp://127.0.0.1:9528',
  16. ]
  17. ],
  18. ];

Task 服务器

在 swoole 组件中,已经实现了 Swoole Task 功能,可以通过集成扩展的方式实现自己的 Task 服务器。如下:

Server\TaskServer
  1. <?php
  2. namespace Server;
  3. use FastD\Servitization\Server\HTTPServer;
  4. use Psr\Http\Message\ServerRequestInterface;
  5. use swoole_server;
  6. class TaskServer extends HTTPServer
  7. {
  8. public function doTask(swoole_server $server, $data, $taskId, $workerId)
  9. {
  10. echo $data . PHP_EOL;
  11. }
  12. public function doRequest(ServerRequestInterface $serverRequest)
  13. {
  14. $response = parent::doRequest($serverRequest); // TODO: Change the autogenerated stub
  15. server()->task("some data");
  16. return $response;
  17. }
  18. }

调整配置:

  1. <?php
  2. return [
  3. 'host' => 'http://0.0.0.0:9527',
  4. 'class' => \Server\TaskServer::class,
  5. 'options' => [
  6. 'pid_file' => __DIR__ . '/../runtime/pid/' . app()->getName() . '.pid',
  7. 'worker_num' => 10,
  8. 'task_worker_num' => 20,
  9. ],
  10. 'processes' => [
  11. ],
  12. 'listeners' => [
  13. [
  14. 'class' => \FastD\Servitization\Server\TCPServer::class,
  15. 'host' => 'tcp://127.0.0.1:9528',
  16. ]
  17. ],
  18. ];

即可实现 task 服务器

Swoole 客户端

除了提供 Swoole Server 以外,还提供一个远程操作的 Client 连接端客户,在服务器启动后,可以通过客户端,对远程服务器进行管理。

使用: php bin/client schema://host:port

根据提示,输入具体操作的命令。

下一节: 扩展