① 在Linux环境下安装 screen 命令 方便程序后台运行 有的话忽略
yum install screen
② 根据需要安装相应的类库和配置环境
1、安装PHP>=5.3.3,并安装了pcntl、posix扩展
2、建议安装event或者libevent扩展,但不是必须的(注意event扩展需要PHP>=5.4)
3、检测服务器环境是否满足安装workman的条件
curl -Ss http://www.workerman.net/check.php | php(换成你的php命令 有些集成的如APPNODE是 appnode-php72)
③ 下载最新workman源码 https://www.workerman.net/download
④ 往相应处理文件 server.php 引入workman框架设置好处理业务后运行
use Workerman\Worker;
require_once __DIR__ . '/Workerman/Autoloader.php';
xxxxx 业务代码
// 运行worker
Worker::runAll();
⑤ 命令行运行后将常驻内存 修改后需要重启 可参照 https://bd.125.la/?mod=experience&tid=711
php server.php start
相关命令
php server.php start 以调试方式运行 代码中echo、var_dump、print等打印函数会直接输出在终端
php server.php start -d 以守护进程方式启动 代码中echo、var_dump、print等打印会默认重定向到/dev/null文件
终端关闭后workerman继续后台正常运行
php server.php stop 停止
php server.php restart 重启
php server.php reload 平滑重启 只有子进程运行过程中载入的文件支持reload,主进程载入的文件不支持reload
Worker::runAll执行完后workerman运行过程中动态加载的文件支持reload,Worker::runAll执行前就载入的文件代码不支持reload
php server.php status 查看状态
php server.php connections 查看连接状态
注意
长连接应用必须加心跳,否则连接可能由于长时间不活跃而被路由节点防火墙断开。
区分主进程和子进程 有必要注意下代码是运行在主进程还是子进程,一般来说在Worker::runAll();调用前运行的代码都是在主进程运行的,onXXX回调运行的代码都属于子进程。注意写在Worker::runAll();后面的代码永远不会被执行。
不要在主进程中初始化数据库、memcache、redis等连接资源,因为主进程初始化的连接可能会被子进程自动继承(尤其是使用单例的时候),所有进程都持有同一个连接,服务端通过这个连接返回的数据在多个进程上都可读,会导致数据错乱。同样的,如果任何一个进程关闭连接(例如daemon模式运行时主进程会退出导致连接关闭),都导致所有子进程的连接都被一起关闭,并发生不可预知的错误,例如mysql gone away 错误。
推荐在 onWorkerStart 里面初始化连接资源。
onConnect事件仅仅代表客户端与Workerman完成了TCP三次握手,这时客户端还没有发来任何数据
Redis 开启 PHP_redis 拓展 phpinfo 中找到redis相关后 重启PHP