一、安装 官方手册
http://doc.workerman.net/315116
1.1、 安装错误:
WARNING: channel "pecl.php.net" has updated its protocols, use "pecl channel-update pecl.php.net" to update
解决办法:
pecl channel-update pecl.php.net
1.2 错误:
Warning: popen() has been disabled for security reasons in OS/Guess.php
警告:出于安全原因,popen()已经在OS/Guess.php中被禁用
Warning: popen() has been disabled for security reasons in OS/Guess.php on line 241
PHP Warning: popen() has been disabled for security reasons in /www/server/php/56/lib/php/OS/Guess.php on line 241
Warning: popen() has been disabled for security reasons in /www/server/php/56/lib/php/OS/Guess.php on line 241
Warning: fgets() expects parameter 1 to be resource, null given in OS/Guess.php on line 242
PHP Warning: fgets() expects parameter 1 to be resource, null given in /www/server/php/56/lib/php/OS/Guess.php on line 242
Warning: fgets() expects parameter 1 to be resource, null given in /www/server/php/56/lib/php/OS/Guess.php on line 242
Warning: pclose() expects parameter 1 to be resource, null given in OS/Guess.php on line 251
PHP Warning: pclose() expects parameter 1 to be resource, null given in /www/server/php/56/lib/php/OS/Guess.php on line 251
Warning: pclose() expects parameter 1 to be resource, null given in /www/server/php/56/lib/php/OS/Guess.php on line 251
Warning: readlink() has been disabled for security reasons in OS/Guess.php on line 257
PHP Warning: readlink() has been disabled for security reasons in /www/server/php/56/lib/php/OS/Guess.php on line 257
Warning: readlink() has been disabled for security reasons in /www/server/php/56/lib/php/OS/Guess.php on line 257
downloading event-2.5.6.tgz ...
Starting to download event-2.5.6.tgz (141,226 bytes)
..............................done: 141,226 bytes
50 source files, building
Warning: putenv() has been disabled for security reasons in PEAR/Builder.php on line 310
PHP Warning: putenv() has been disabled for security reasons in /www/server/php/56/lib/php/PEAR/Builder.php on line 310
Warning: putenv() has been disabled for security reasons in /www/server/php/56/lib/php/PEAR/Builder.php on line 310
running: phpize
Warning: popen() has been disabled for security reasons in PEAR/Builder.php on line 465
PHP Warning: popen() has been disabled for security reasons in /www/server/php/56/lib/php/PEAR/Builder.php on line 465
Warning: popen() has been disabled for security reasons in /www/server/php/56/lib/php/PEAR/Builder.php on line 465
ERROR: failed to run `phpize'
解决办法:
popen readlink putenv三个函数在php.ini里将popen函数禁用了
或者在这里添加
disable_functions中去掉对应三个函数,重启服务
1.3 继续安装 pecl install event (重点关注1.2.3地方输入的值)
三个地方按上面来操作
二 安装Event扩展
注意目前libevent扩展不支持php7,php7用户只能使用Event扩展。
yum install libevent-devel
pecl install channel://pecl.php.net/libevent-0.1.0 //提示libevent installation [autodetect]: 时按回车
echo extension=libevent.so > /etc/php.d/libevent.ini
四、测试是否成功
<!DOCTYPE html>
<html lang="en">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<meta http-equiv="Content-Security-Policy" content="upgrade-insecure-requests">
<title>Title</title>
</head>
<body>
<script>
ws = new WebSocket("wss://www.xxxx.com:2xxx");
ws.onopen = function() {
alert("连接成功");
ws.send('tom');
alert("给服务端发送一个字符串:tom");
};
ws.onmessage = function(e) {
alert("收到服务端的消息:" + e.data);
};
</script>
</body>
</html>
注意:每次修改Workerman,都要重新启动
五、Workerman TP5 php代码测试启动
要启动Workerman,首先需要有一个启动入口文件,里面定义了服务监听的端口及协议。
可以参考入门指引--简单开发实例部分
这里以我们自己的项目为例,它的启动入口为server.php。
server.php文件是自己写的php文件,路径放到项目中,
<?php
define('APP_PATH', __DIR__ . '/application/');
define('BIND_MODULE','push/Worker');
// 加载框架引导文件
require __DIR__ . '/thinkphp/start.php';
?>
进入项目根目录后再命令启动
宝塔操作方法:
启动
以debug(调试)方式启动
php
server.php start
以daemon(守护进程)方式启动
php
server.php start -d
停止
php
server.php stop
重启
php start.php restart
平滑重启
php
server.php reload
查看状态
php
server.php status
4.1 错误:pcntl_fork() has been disabled for security reasons in file
由于安全原因,pcntl_fork()在第1515行文件/xxxxxx/vendor/workerman/workerman/Worker.php中被禁用
四、给Workerman 配置SSL证书,就是域名那个SSL证书
创建wss服务
问:
Workerman如何创建一个wss服务,使得客户端可以用过wss协来连接通讯,比如在微信小程序中连接服务端。
答:
wss协议实际是websocket+SSL,就是在websocket协议上加入SSL层,类似https(http+SSL)。 所以只需要在websocket协议的基础上开启SSL即可支持wss协议。
方法一 ,直接用Workerman开启SSL
准备工作:
1、Workerman版本不小于3.3.7
2、PHP安装了openssl扩展
3、已经申请了证书(pem/crt文件及key文件)放在磁盘任意目录
代码:
<?php
require_once __DIR__ . '/Workerman/Autoloader.php';
use Workerman\Worker;
// 证书最好是申请的证书
$context = array(
// 更多ssl选项请参考手册 http://php.net/manual/zh/context.ssl.php
'ssl' => array(
// 请使用绝对路径
'local_cert' => '磁盘路径/server.pem', // 也可以是crt文件
'local_pk' => '磁盘路径/server.key',
'verify_peer' => false,
// 'allow_self_signed' => true, //如果是自签名证书需要开启此选项
)
);
// 这里设置的是websocket协议(端口任意,但是需要保证没被其它程序占用)
$worker = new Worker('websocket://0.0.0.0:443', $context);
// 设置transport开启ssl,websocket+ssl即wss
$worker->transport = 'ssl';
$worker->onMessage = function($con, $msg) {
$con->send('ok');
};
Worker::runAll();
参考:http://doc.workerman.net/faq/secure-websocket-server.html
在代码中配置对应SSL证书的路径:
4.1 把证书上传到宝塔SSL证书路径/www/server/panel/vhost/ssl/www.xxx.com/
名称与后缀修改成下面这样子
密钥: privkey.pem
fullchain.pem
4.2 修改代码中证书路径:\vendor\topthink\think-worker\src\Server.php