1. mac 怎么开启swoole 服务
Swoole是php的异步并行扩展,有点像Node.js,但swoole既支持同步又支持异步,比node更强大。Swoole扩展是基于epoll高性能事件轮询,并且是多线程的,性能非常好。
Swoole除了提供网络Server/Client的功能之外,还提供了Task异步任务管理器,可以使你的程序中某些处理慢的函数异步去执行。
2. 如何使用 PHP 构建一个高性能的弹幕后端服务
随着WEB2.0的流行,现在很多网站都流行使用“弹幕”这种形式来实现互动。
弹幕(barrage),中文流行词语,原意指用大量或少量火炮提供密集炮击。大量以字幕弹(dàn)出形式显示的评论同时在屏幕上飘过的现象也被称为弹幕。
作为PHPer的我们,看到现在各种网站都有酷炫的弹幕飞过,我们是不是也想给自己的网站加入弹幕功能呢?
首先弹幕的后端其实说白了和公共聊天室的后端原理十分相似,都是一个客户端发送消息给服务端,服务端再将收到的消息广播给其他的客户端。对于后端来说他们几乎没区别,区别就在于前端。
好在我们有一个前端弹幕插件,这个插件是一个jquery插件,github地址:https://github.com/chiruom/jquery.danmu.js,基本上会使用jquery语法,看看示例代码就可以傻瓜化使用。
前端已经有了解决方案,但是后端呢?前端如何与后端通讯?用传统的ajax轮询吗?不行,这样效率太低,想想各大火爆的直播平台都是同一时间几万人在线,几千人同时发弹幕,如果靠ajax轮询一个php接口的话服务器会吃不消的。且弹幕消息存储方案略显复杂,有人问为什么要存储呢?因为ajax使用的HTTP协议是无状态协议,A客户端和B客户端之间对于服务器来说没有任何标志,如果服务器要确保A客户端和B客户端分别在两次请求的时候服务器只返回这两个客户端没有获取过的弹幕消息,那么服务器端就必须使用一个缓存来标识某某客户端看过哪条弹幕消息。综上所述ajax可以实现小规模的弹幕通信方案,但是很麻烦。
好在最新的HTML5中加入了WebSocket协议,我们可以通过WebSocket这种基于HTTP协议之上的即时通信协议来替代ajax这种传统的我问你答的老旧通信模式。而我们是PHPer,对于我们这种只懂PHP的人该如何编写WebSocket服务端呢?好在我们又得知PHP有一个Swoole扩展,我们在PHP语言中使用它可以很方便的构建一个WebSocket服务端。
关于Swoole的介绍可以参照他的官网http://www.swoole.com/,下面引用官网对它的一段简短的介绍。
PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,异步Redis,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。 Swoole内置了Http/WebSocket服务器端/客户端、Http2.0服务器端。
Swoole可以广泛应用于互联网、移动通信、企业软件、云计算、网络游戏、物联网(IOT)、车联网、智能家居等领域。 使用PHP+Swoole作为网络通信框架,可以使企业IT研发团队的效率大大提升,更加专注于开发创新产品。
先别被Swoole这么多的功能吓到了。我们先关注这里面的重点Swoole内置了Http/WebSocket服务器端/客户端意味着我们可以通过它构建WebSocket的服务端。看到这里我们是不是就急急忙忙去拿官网的WebSocket服务端代码做测试呢?不,Swoole是一个PHP扩展,意味着我们还得去安装它。是不是直接去下载so文件然后在php.ini中加入extension=swoole.so就可以了呢?还不是,我们先去看看Swoole扩展的依赖,这也是我们使用任何语言的任何外部包,外部模块,外部扩展最先要了解的问题。
参考官网:http://wiki.swoole.com/wiki/page/7.html环境依赖
仅支持linux,FreeBSD,MacOS,3类操作系统
Linux内核版本2.3.32以上
PHP5.3.10以上版本,包括PHP7
gcc4.4以上版本或者clang
cmake2.4+,编译为libswoole.so作为C/C++库时需要使用cmakePHP版本依赖
swoole仅支持PHP5.3.10或更高版本,建议使用PHP5.4+swoole不依赖php的stream、sockets、pcntl、posix、sysvmsg等扩展。PHP只需安装最基本的扩展即可意味着我们Windows下是无法使用这个扩展了(其实可以借助cygwin在win下使用swoole,但是考虑到我们使用swoole扩展就是为了性能,也为了熟悉以后的生产环节部署做准备,强烈推荐在linux下开发),那么我们把开发环境转移到Linux下进行吧。
接着还要求Linux内核版本为2.3.32以上,PHP为5.3.10以上,那么我们就用最新的CentOS吧,这个版本的yum安装的php直接就是PHP7最新版,根本无需考虑其他问题,当然你喜欢图形界面,用Ubuntu也可以。其他的基本上最新的Linux发行版都是符合版本要求的。
接着我们便来安装这个扩展,推荐使用PECL来安装,只需要一条pecl install swoole
即可,非常方便。当然你要编译安装,具体步骤请参考http://wiki.swoole.com/wiki/page/6.html安装完扩展之后在命令行下输入
php -m
检查,如果有swoole那么说明安装成功了。
接下来就正式开始我们的编码旅程了。
开始编码旅程之前我们先看看最基础的效果原型是什么样子没错就是这个样子,两个浏览器之前完全独立使用Websocket连接服务端,因此对于服务端来说这两个浏览器就相当于两个完全处在不同机器上的客户端。
效果看完了就开始来讲代码吧。
我们先看看官网的WebSocket服务端示例代码。
$serv = new Swoole\Websocket\Server("127.0.0.1", 9502);$serv->on('Open', function($server, $req) {echo "connection open: ".$req->fd;
});
$serv->on('Message', function($server, $frame) {echo "message: ".$frame->data;
$server->push($frame->fd, json_encode(["hello", "world"]));});
$serv->on('Close', function($server, $fd) {echo "connection close: ".$fd;
});
$serv->start();
我们看到这个代码的第一行先是new了一个WebSocket服务端对象,并且在构造方法中的第一个参数指定了服务端监听的IP,第二个参数指定了服务端监听的端口。然后使用on方法为每一个事件设置了回调函数,最后一行start方法正式开始运行服务端。
这种写法非常像Javascript里面的异步调用,这也是Swoole中的事件驱动异步非阻塞特性,正因为是这种特性,每一个独立的事件(请求)会在服务端接收到之后分别异步处理,他们之间无需互相等待,这也是Swoole性能高的原因所在。
我们来分别剖析一下每一个事件的含义。
$serv->on('Open', function($server, $req) {echo "connection open: ".$req->fd;
});
顾名思义,Open表示打开一个新的链接,并且在事件触发之后echo出连接上服务端的客户端id,该客户端唯一id为回调函数第二个参数中的fd字段。这也是服务端区分客户端的唯一id。
$serv->on('Message', function($server, $frame) {echo "message: ".$frame->data;
$server->push($frame->fd, json_encode(["hello", "world"]));});
同样顾名思义,Message表示消息到达服务端的事件,并且在事件触发之后echo出发送给服务端的数据,该数据为回调函数第二个参数的data字段。另外我们还看到它调用了$server->push,这是回调函数的第一个参数中的push方法,它是一个服务端给客户的发送数据的方法,第一个参数为要发送的客户端id,第二个为要发送的数据,这里的含义是向发给服务端消息的那个客户端发送["hello", "world"]这个数组(方括号写数组为PHP5.4的新特性,如果你是PHP5.3请使用传统的array工厂函数生成数组)经过json序列化之后的数据。
$serv->on('Close', function($server, $fd) {echo "connection close: ".$fd;
});
最后一个事件Close更加容易理解,就是关闭事件,当然关闭的不是服务端,而是客户端,可以理解为客户端与服务端断开连接的事件。回调函数中的代码含义为echo出与服务端断开连接的那个客户端id。
基本的API都清楚了,下面就直接看代码吧,短短二十行而已。
https://github.com/cw1997/danmu-demo/blob/master/server.php$server = new swoole_websocket_server("0.0.0.0", 1997);$server->on('open', function (swoole_websocket_server $server, $request) {echo "server: handshake success with fd{$request->fd}\n";//$request->fd 是客户端id});
$server->on('message', function (swoole_websocket_server $server, $frame) {echo "receive from {$frame->fd}:{$frame->data},opcode:{$frame->opcode},fin:{$frame->finish}\n";//$frame->fd 是客户端id,$frame->data是客户端发送的数据//服务端向客户端发送数据是用 $server->push( '客户端id' , '内容')$data = $frame->data;
foreach($server->connections as $fd){
$server->push($fd , $data);//循环广播
}
});
$server->on('close', function ($ser, $fd) {echo "client {$fd} closed\n";
});
$server->start();
这里最核心的广播代码其实还用到了一个之前没有提到过的成员,也就是swoole_websocket_server对象的connections成员,这个成员中保存了所有已连接上该WebSocket服务端的fd,也就是客户端id。因此我们只要在message事件中使用foreach遍历该成员,循环将所有服务端收到的弹幕消息都发送给其他已连接上该服务端的客户端即可。
后端讲完了再讲讲前端吧。
前端代码也不是很多https://github.com/cw1997/danmu-demo/blob/master/index.htmlvar ws = new WebSocket("ws://192.168.1.107:1997");ws.onopen = function(){
console.log("握手成功");
ws.send('hello world!!!');
};
ws.onmessage = function(e){
console.log("message:" + e.data);
var time = jQuery('#danmu').data("nowtime") + 1;var text_obj = '{ "text":"' + e.data + '" , "color":"green" ,"size":"1","position":"0","time":"' + time + '" ,"isnew":" "}'; //构造加上了innew属性的字符串danmu对象console.log(text_obj);
var new_obj = eval('(' + text_obj + ')'); //转化为js对象jQuery('#danmu').danmu("add_danmu", new_obj); //向插件中添加该danmu对象};
ws.onerror = function(){
console.log("error");
};
核心代码都在这里,使用new WebSocket("ws://192.168.1.107:1997")创建一个WebSocket客户端连接对象,通过该对象的各种事件进行对应的操作,和服务端是不是很像?更多代码解释可以参考源代码中的注释,这里不做更多介绍。
看到这里相信作为一名PHPer的你也可以开发出属于自己的弹幕系统了。这里展示的只是一个最基础最原始的弹幕平台。我们也了解到了使用PHP开发一个弹幕平台需要涉及到的技术有WebSocket,Swoole扩展,甚至碰到了很多初级开发者平时不怎么接触的工具,比如说PECL,比如说Linux。
其实PHP结合Swoole扩展还可以做很多事情,比如说对接各种家电,对接各种硬件接口实现在Web端实时控制家电,又比如说结合树莓派做智能小车,通过web端进行遥控等等,各种新奇的玩法等你发现。谁说PHP只能做Web开发?PHP拥有了Swoole扩展其实能做的事情还有很多,Swoole就像他的宣传标题一样:重新定义PHP。
3. 菜鸟问个很基础的问题Centos怎么安装swoole
php扩展swoole实现实时异步任务队列的方案。安装swoole
pecl 安装:
pecl install swoole
看命令行提示,如果它提示说没有写php.ini,则自己手动在PHP.ini后面加上:
extension = "swoole.so"
服务端
在打算放置脚本的目录(你也可以自行新建)新建Server.php,代码如下:
“`
<?php
class Server
{
private $serv;
public function __construct() {
$this->serv = new swoole_server("0.0.0.0", 9501);
$this->serv->set(array(
'worker_num' => 1, //一般设置为服务器CPU数的1-4倍
'daemonize' => 1, //以守护进程执行
'max_request' => 10000,
'dispatch_mode' => 2,
'task_worker_num' => 8, //task进程的数量
"task_ipc_mode " => 3 , //使用消息队列通信,并设置为争抢模式
//"log_file" => "log/taskqueueu.log" ,//日志
));
$this->serv->on('Receive', array($this, 'onReceive'));
// bind callback
$this->serv->on('Task', array($this, 'onTask'));
$this->serv->on('Finish', array($this, 'onFinish'));
$this->serv->start();
}
public function onReceive( swoole_server $serv, $fd, $from_id, $data ) {
//echo "Get Message From Client {$fd}:{$data}n";
// send a task to task worker.
$serv->task( $data );
}
public function onTask($serv,$task_id,$from_id, $data) {
$array = json_decode( $data , true );
if ($array['url']) {
return $this->httpGet( $array['url'] , $array['param'] );
}
4. 框架中集成swoole扩展怎么使用
swoole扩展是PHP扩展。php swoole扩展,PHP语言的高性能网络通信框架,提供了PHP语言的异步多线程服务器,异步TCP/UDP网络客户端,异步MySQL,数据库连接池,AsyncTask,消息队列,毫秒定时器,异步文件读写,异步DNS查询。
1、下载swoole源码包
[root@nginx ~]# wget
2、解压进入swoole文件夹
[root@nginx ~]# tar -zxvf swoole-1.7.17-stable
[root@nginx ~]# cd swoole-src-swoole-1.7.17-stable/
3、编译安装swoole
[root@nginx swoole-src-swoole-1.7.17-stable]# phpize
[root@nginx swoole-src-swoole-1.7.17-stable]# ./configure
[root@nginx swoole-src-swoole-1.7.17-stable]# make && make install
4、php.ini配置文件加载swoole.so模块
[root@nginx swoole-src-swoole-1.7.17-stable]# vi /usr/local/php/lib/php.ini
注意 php命令行运行和浏览器运行的配置文件不一样。
php 命令行的配置:
[root@nginx swoole-src-swoole-1.7.17-stable]# php --ini
Configuration File(php.ini)Path:/usr/local/lib
Loaded Configuration File:/usr/local/lib/php.ini//配置文件
Scanforadditional .ini files in:(none)
Additional .ini files parsed:(none)
5、查看swoole模块是否已经安装成功
[root@nginx swoole-src-swoole-1.7.17-stable]# php -m
6、编写服务端httpServer.php文件并运行
$serv=newswoole_server("127.0.0.1",9501);
$serv->on('connect',function($serv,$fd){
echo"Client:Connect.
";
});
$serv->on('receive',function($serv,$fd,$from_id,$data){
$serv->send($fd,'Swoole: '.$data);
});
$serv->on('close',function($serv,$fd){
echo"Client: Close.
";
});
$serv->start();
运行httpServer.php
[root@nginx swoole-src-swoole-1.7.17-stable]# php httpServer.php
7、用telnet测试
[root@nginx ~]# telnet 127.0.0.1 9501
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is'^]'.
hello 客户端
Swoole: hello 服务端
来源:PHP swoole扩展安装和使用-
20170819 13:57
5. php swoole 只能运行在php-cli 环境吗
一直想写点Swoole的东西,毕竟它重新定义了php,却一直不知道怎么下手写Swoole涉及的知识点非常多,互为表里,每次想写都发现根本理不出一个头绪Swoole是一个php的扩展,它的核心目的就是解决php在实现server服务中可能遇到的一系列问题,这些问题用源生的php往往并不能很高效(执行效率)的解决,一般也不会使用php来解决,所以会有说swolle重新定义的php的说法。
其实swoole也提供了一个框架,swoole framework是基于swoole extension设计的一个框架,要用好这个框架,还是要先了解swoole extension。
扩展的英文名称是Extension,php扩展是用C语言作为开发语言,基于Zend引擎提供的API,编译成的一个动态库。
如果曾经做过类似动态库调用开发的童鞋可能会更好理解一些,例如Android中的NDK开发在php的配置文件中配置好extension的属性后,就可以引用这个动态库了。
也就是说,swoole本身是用C语言编写的,它可以让php获得一些额外的function。
然后是运行方式,swoole的许多功能都只能运行在cli模式下,而cli模式往往是很多刚接触swoole的phper遇到的第一个问题。
有时候其实只是需要转变一下思路
我们现在整理一下最常见的php代码执行方式:
安装apache、php
配置apache对那个目录进行php解析
用浏览器访问那个目录的php文件
更多的细节这里就不提了,毕竟我相信每个phper对这个都是很熟悉的。
但这里就开始出现了第一个问题,我们知道,php是一个脚本语言,脚本语言的核心特点在于不用编译,随时执行,而执行脚本的工具就是解析器,而php的解析器就是zend引擎。
严格来说,zend并不是唯一的选择,不过,zend是最官方的。另外,Zend Studio和Zend Engine不是同一个东西,本文中的Zend全部指Zend Engine。
换个角度讲,只要有解析器,写好的php脚本就是可以执行的,而zend引擎与apache之间并没有绝对的关系实际上,apahce是调用了zend对php脚本进行执行,然后将执行结果输出给了浏览器所以所谓cli模式(CommandLine,命令行模式),其实就是在命令行下直接调用zend引擎对php脚本进行解析并执行,并获得程序输出结果的php脚本执行方式。
其实php也可以作为shell脚本来使用哦,就像bash shell一样既然问题讲清楚了,在一个系统中具体怎么操作呢?
本文以CentOS 7.5作为系统环境,swoole是针对linux系统开发的,windows下并不适用。学习swoole的一个前题是懂得基本的linux系统使用。
当安装好php的时候,找到php的安装目录,如果是默认安装的话,可以试试whereis命令# 某种简单的方法
whereis php
> /usr/local/bin/php;
locate whereis find这些命令都可以试试,目的是找到php然后我们来写一个最经典的php脚本:
<?php
//vi hello_cli.php
echo 'Hello PHP Cli';
编写纯php脚本时,php标签不要封口
然后我们在shell里执行它:
/usr/local/bin/php hello_cli.php
> Hello PHP Cli
这段代码中的第一个php,是一个可执行文件,它接受一个php脚本文件作为输入参数,并解析执行这个php脚本文件(通过zend)。
没有错,第一个cli模式下的php程序就被你执行成功了!
默认情况下,php都会被安装在了$PATH的目录下,那就可以直接省略路径前缀了,下文中调用php的时候,全都省略了路径前缀。
因为swoole是pecl的项目,所以使用pecl安装是最简单的方法,强烈推荐第一次接触的童鞋先使用pecl安装,在熟悉了swoole之后,再考虑使用编译安装的方式以获取更多进阶功能。
pecl这个工具基本都会被安装在与php相同的目录下(往往也都是$PATH目录)pecl install swoole
执行以下命令查看是否安装成功:
php -m | grep swoole
> swoole
如果正确的输出了swoole,那么恭喜你,这次安装很成功另一个常见的比较麻烦的问题是,有些童鞋的电脑里安装了多个php,而安装的时候没有正确的安装到预期的php的扩展目录中,就会导致无法正常工作,解决方案就是弄清楚各个php安装目录及配置关系,选择正确的目录进行安装。
其实本文还没正式开始介绍swoole,都是在学习swoole之前的准备工作,swoole的上手门槛比一般的php应用要高的多,如果没有网络开发和操作系统方面的一些知识,学习它并不是一件容易的事情,学习曲线很陡峭。
这句话我在群里说了无数次
很多新手会诟病swoole的手册写的太模糊,其实是前置知识不足,而手册也给出了需要的前置知识列表,以下引用至官网的手册-学习swoole需要哪些知识?
多进程/多线程
了解Linux操作系统进程和线程的概念
了解Linux进程/线程切换调度的基本知识
了解进程间通信的基本知识,如管道、UnixSocket、消息队列、共享内存socket
了解SOCKET的基本操作如accept/connect、send/recv、close、listen、bind了解SOCKET的接收缓存区、发送缓存区、阻塞/非阻塞、超时等概念IO复用
了解select/poll/epoll
了解基于select/epoll实现的事件循环,Reactor模型了解可读事件、可写事件
TCP/IP网络协议
了解TCP/IP协议
了解TCP、UDP传输协议
调试工具
使用gdb调试Linux程序
使用strace跟踪进程的系统调用
使用tcpmp跟踪网络通信过程
其他Linux系统工具,如ps、lsof、top、vmstat、netstat、sar、ss等学习并理解一个新事务并不是一个容易的事情,特别对于swoole这种具备一定颠覆性的工具,要有耐心和实践。
淡定的把手册看完,遇到不理解的名词学会使用搜索引擎学习,swoole的手册其实是个大宝库,网络开发常见的问题其实里边都涉及到了。
6. swoole不能在windows下直接安装吗
简介
Swoole是一种PHP高级Web开发框架,框架不是为了提升网站的性能,是为了提升网站的开发效率。最少的性能损耗,换取最大的开发效率。利用Swoole框架,开发一个复杂的Web功能,可以在很短的时间内完成!
Swoole不是一个像Zend Framework、CakePHP、Yii、symfony、ThinkPHP等一样的框架,也不是一个向WordPress、Drupal、Discuz、UChome等开源产品看齐的项目。 Swoole的目标是向Java框架、Rails On Ruby、Python DjangoPylons等一流框架发起挑战。
运行环境:Linux Windows Mac FreeBSD Unix
PHP版本支持:PHP5.2 PHP5.3 PHP6.0
支持的数据库:MS SQL Server、MySQL、IBM DB2、Oracle、Interbase 、SQLite、PostgreSQL、ODBC
支持的运行方式:Web、Cli命令行脚本、PHP-GTK GUI。
功能
包含以下几个特色功能:
1、 类似ORM的数据查询,提供SQL封装器,让MySQL的SQL与PHP的Array,会话,Cache无缝结合
2、App MVC分层结构,有效的程序结构分层,提高程序的可维护性和扩展性,实现低耦合,基于接口开发。
7. windows 可以编译swoole吗或者有人编译出了swoole.dll吗
下载 releases版本的swoole编译安装2.11编译安装swoole扩展,然后: # cd swoole # phpize # ./configure # make && make install