0、检查Linux是否满足workman的环境要求
curl -Ss www.workerman.net | php
看要求的环境是否都是ok。
如果出现:
workman Call to undefined function stream_socket_server()
解决方案:去PHP的配置文件查找disabled_function,去掉stream_socket_server()
1、无法启动
Linux环境下执行php think chat代码会返回:
定位到源码:
我们是用thinkPHP6的自定义命令(php think chat)去启动workman。但是在Linux环境中,workman的底层代码中会读取CLI端输入的参数(start,stop,status,restart)来判断处理操作。如果没有输入任何执行参数,就会返回并提示输入相应参数。
所以自定义命令这里需要设置相应的参数:
/**
* window环境下执行命令:php think chat
* linux环境下执行命令:
* php think chat start -d
* php think chat status
*/
protected function configure()
{
// 指令配置
$this->setName('startChat')
->addArgument('action', Argument::OPTIONAL, "action start|stop|restart|status|reload")
->addOption('daemon', '-d', Option::VALUE_OPTIONAL, 'daemon')
->setDescription('the startChat command');
}
/**
* 重置Cli参数
*/
protected function resetCli()
{
global $argv, $argc;
$file = "{$argv['0']} {$argv['1']}";
$action = $argv['2'];
$extend = empty($argv['3']) ? '' : $argv['3'];
$argv = [];
$argv[] = $file;
$argv[] = $action;
if ($extend)
{
$argv[] = $extend;
}
$argc = count($argv);
$_SERVER['argv'] = $argv;
$_SERVER['argc'] = $argc;
}
protected function execute(Input $input, Output $output)
{
//重置Cli命令行参数(linux环境下需要)
if (strtolower(php_uname('s')) == 'linux') {
$this->resetCli();
}
}
2、启动成功后,无法连接(connect refuse)
这个问题困扰了我一下午。。。。
我尝试过开放安全组、开启防火墙并开放对应端口。都尝试失败。**最后把客户端连接websocket的地址从127.0.0.1改为服务器的IP地址就成功了。**我真的被自己蠢哭了。
开启websocket的服务端代码:
//启动workman-websocket服务
$ws_worker = new Worker("websocket://0.0.0.0:2000");
连接websocket的客户端js代码:
//部署到正式环境,就必须使用服务器端IP地址或者域名
ws = new WebSocket("ws:服务器IP地址:端口号");
3、补习一下防火墙的相关命令
systemctl status firewalld #防火墙状态
systemctl start firewalld #开启防火墙
firewall-cmd --list-port #查看防火墙列表
firewall-cmd --zone=public --add-port=2000/tcp --permanent #开放2000端口(开放后重启一下)
firewall-cmd --reload #重启防火墙
firewall-cmd --zone=public --query-port=2000/tcp #查询2000端口是否开放