基本流程

(以一个简单的Websocket聊天室服务端为例)

1、任意位置建立项目目录

如 SimpleChat/ 进入目录执行 composer require workerman/workerman

2、引入vendor/autoload.php (composer安装后生成)

创建 start.php ,引入vendor/autoload.php

  1. use Workerman\Worker;
  2. use Workerman\Connection\TcpConnection;
  3. require_once __DIR__ . '/vendor/autoload.php';

3、选定协议

这里我们选定Text文本协议(WorkerMan中自定义的一个协议,格式为文本+换行)

(目前WorkerMan支持HTTP、Websocket、Text文本协议,如果需要使用其它协议,请参照协议一章开发自己的协议)

4、根据需要写入口启动脚本

例如下面这个是一个简单的聊天室的入口文件。

SimpleChat/start.php

  1. <?php
  2. use Workerman\Worker;
  3. use Workerman\Connection\TcpConnection;
  4. require_once __DIR__ . '/vendor/autoload.php';
  5. $global_uid = 0;
  6. // 当客户端连上来时分配uid,并保存连接,并通知所有客户端
  7. function handle_connection($connection)
  8. {
  9. global $text_worker, $global_uid;
  10. // 为这个连接分配一个uid
  11. $connection->uid = ++$global_uid;
  12. }
  13. // 当客户端发送消息过来时,转发给所有人
  14. function handle_message(TcpConnection $connection, $data)
  15. {
  16. global $text_worker;
  17. foreach($text_worker->connections as $conn)
  18. {
  19. $conn->send("user[{$connection->uid}] said: $data");
  20. }
  21. }
  22. // 当客户端断开时,广播给所有客户端
  23. function handle_close($connection)
  24. {
  25. global $text_worker;
  26. foreach($text_worker->connections as $conn)
  27. {
  28. $conn->send("user[{$connection->uid}] logout");
  29. }
  30. }
  31. // 创建一个文本协议的Worker监听2347接口
  32. $text_worker = new Worker("text://0.0.0.0:2347");
  33. // 只启动1个进程,这样方便客户端之间传输数据
  34. $text_worker->count = 1;
  35. $text_worker->onConnect = 'handle_connection';
  36. $text_worker->onMessage = 'handle_message';
  37. $text_worker->onClose = 'handle_close';
  38. Worker::runAll();

5、测试

Text协议可以用telnet命令测试

  1. telnet 127.0.0.1 2347