1.Swoole编译安装步骤
Swoole扩展是按照php标准扩展构建的。使用phpize来生成php编译配置,./configure来做编译配置检测,make进行编译,make install进行安装。
请下载releases版本的swoole,直接从github主干上拉取最新代码可能会编译不过
如果当前用户不是root,可能没有php目录的写权限,安装时需要sudo或者su
如果是在git分支上直接git pull更新代码,重新编译前务必要执行make clean
安装准备
安装swoole前必须保证系统已经安装了下列软件
php-5.3.10或更高版本gcc-4.4或更高版本makeautoconf
下载地址
https://github.com/swoole/swoole-src/releases
http://pecl.php.net/package/swoole
http://git.oschina.net/matyhtf/swoole
下载源代码包后,在终端进入源码目录,执行下面的命令进行编译和安装
cdswoolephpize./configuremake sudo make install
(注:swoole的./configure有很多额外参数,可以通过./configure --help命令查看,这里仅开启其中async-mysql项,其他均选择默认项) 这里是./configure编译配置的额外参数,用于开启某些特性
1.8.7或更高版本不再需要设置--enable-async-mysql和--enable-async-httpclient,async_mysql和async_httpclient改为内置
--enable-swoole-debug
打开调试日志,开启此选项后swoole将打印各类细节的调试日志。生产环境不要启用。
--enable-sockets
增加对sockets资源的支持,依赖sockets扩展。开启此参数,swoole_event_add就可以添加sockets扩展创建的连接到swoole的事件循环中。
--enable-async-mysql
增加异步mysql支持, 依赖mysqli和mysqlnd扩展。
--enable-async-redis
增加异步Redis客户端支持, 依赖hiredis库
--enable-async-httpclient
增加异步Http和WebSocket客户端支持
--enable-ringbuffer
开启RingBuffer内存池
此设置为试验性质,主要用于提升性能,生产环境请不要开启
--enable-openssl
启用SSL支持
--with-php-config=/url/local/php/bin/php-config
PECL
swoole项目已收录到PHP官方扩展库,除了手工下载编译外,还可以通过PHP官方提供的pecl命令,一键下载安装swoole
peclinstall swoole
配置php.ini
编译安装成功后,修改php.ini加入
extension=swoole.so
通过php -m或phpinfo()来查看是否成功加载了swoole,如果没有可能是php.ini的路径不对,可以使用php -i grep php.ini来定位到php.ini的绝对路径。
安装成功后通过phpinfo()查看到的信息:
2.构建一个Swoole基本实例
下面贴一个基本的基于swoole的echo服务器
// Server
classServer{
private$serv;
publicfunction__construct() {
$this->serv=newswoole_server("0.0.0.0",9501);
$this->serv->set(array(
'worker_num'=>8,
'daemonize'=>false,
'max_request'=>10000,
'dispatch_mode'=>2,
'debug_mode'=>1
));
$this->serv->on('Start',array($this,'onStart'));$this->serv->on('Connect',array($this,'onConnect'));$this->serv->on('Receive',array($this,'onReceive'));$this->serv->on('Close',array($this,'onClose'));$this->serv->start();
}
publicfunctiononStart($serv) {
echo"Start\n";
}
publicfunctiononConnect($serv,$fd,$from_id) {
$serv->send($fd,"Hello {$fd}!");
}
publicfunctiononReceive(swoole_server$serv,$fd,$from_id,$data) {
echo"Get Message From Client {$fd}:{$data}\n";
}
publicfunctiononClose($serv,$fd,$from_id) {
echo"Client {$fd} close connection\n";
}
}
// 启动服务器
$server=newServer();
从代码中可以看出,创建一个swoole_server基本分三步: 1. 通过构造函数创建swoole_server对象 2. 调用set函数设置swoole_server的相关配置选项 3. 调用on函数设置相关回调函数 关于set配置选项以及on回调函数的具体说明,请参考我整理的swoole文档( 配置选项)
这里只给出简单介绍。onStart回调在server运行前被调用,onConnect在有新客户端连接过来时被调用,onReceive函数在有数据发送到server时被调用,onClose在有客户端断开连接时被调用。 这里就可以大概看出如何使用swoole:在onConnect处监听新的连接;在onReceive处接收数据并处理,然后可以调用send函数将处理结果发送出去;在onClose处处理客户端下线的事件。
下面贴出客户端的代码:
classClient{
private$client;
publicfunction__construct() {
$this->client=newswoole_client(SWOOLE_SOCK_TCP);
}
publicfunctionconnect() {
if(!$this->client->connect("127.0.0.1",9501,1) ) {echo"Error: {$fp->errMsg}[{$fp->errCode}]\n";
}
$message=$this->client->recv();
echo"Get Message From Server:{$message}\n";
fwrite(STDOUT,"请输入消息:");
$msg=trim(fgets(STDIN));
$this->client->send($msg);
}
}
$client=newClient();
$client->connect();
这里,通过swoole_client创建一个基于TCP的客户端实例,并调用connect函数向指定的IP及端口发起连接请求。随后即可通过recv()和send()两个函数来接收和发送请求。需要注意的是,这里我使用了默认的同步阻塞客户端,因此recv和send操作都会产生网络阻塞。
领取专属 10元无门槛券
私享最新 技术干货