Swoole

PHP 的异步并行和协程 C 扩展 Swoole

Apache2.0
C/C++ PHP
跨平台
2014-03-03
matyhtf

完善个人资料领开源豆,速来抽奖!>>>

PHP的异步、并行、高性能网络通信引擎,使用纯C语言编写,提供了PHP语言的异步多线程服务器异步TCP/UDP网络客户端异步MySQL异步Redis数据库连接池AsyncTask消息队列毫秒定时器异步文件读写异步DNS查询。 Swoole内置了Http/WebSocket服务器端/客户端Http2.0服务器端

Swoole底层内置了异步非阻塞、多线程的网络IO服务器。PHP程序员仅需处理事件回调即可,无需关心底层。与Nginx/Tornado/Node.js等全异步的框架不同,Swoole既支持全异步,也支持同步。

除了异步IO的支持之外,Swoole为PHP多进程的模式设计了多个并发数据结构和IPC通信机制,可以大大简化多进程并发编程的工作。其中包括了并发原子计数器并发HashTableChannelLock进程间通信IPC等丰富的功能特性。

Swoole从2.0版本开始支持了内置协程,可以使用完全同步的代码实现异步程序。PHP代码无需额外增加任何关键词,底层自动进行协程调度,实现异步。

Swoole可以广泛应用于互联网、移动通信、企业软件、网络游戏、物联网、车联网、智能家庭等领域。 使用PHP+Swoole作为网络通信框架,可以使企业IT研发团队的效率大大提升,更加专注于开发创新产品。

Swoole是开源免费的自由软件,授权协议是Apache2.0。企业和个人开发者均可免费使用Swoole的代码,并且在Swoole之上所作的修改可用于商业产品,无需开源(注:必须保留原作者的版权声明)。

Server

$serv = new Swoole\Server("127.0.0.1", 9501);
$serv->on('connect', function ($serv, $fd){
    echo "Client:Connect.\n";
});
$serv->on('receive', function ($serv, $fd, $from_id, $data) {
    $serv->send($fd, 'Swoole: '.$data);
    $serv->close($fd);
});
$serv->on('close', function ($serv, $fd) {
    echo "Client: Close.\n";
});
$serv->start();

Http服务器

$http = new Swoole\Http\Server("127.0.0.1", 9502);

$http->on("start", function ($server) {
    echo "Swoole http server is started at http://127.0.0.1:9502\n";
});

$http->on("request", function ($request, $response) {
    $response->header("Content-Type", "text/plain");
    $response->end("Hello Swoole\n");
});

$http->start();

WebSocket服务器

$serv = new Swoole\Websocket\Server("127.0.0.1", 9503);

$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();

Channel

Co\run(function(){
    //使用Channel进行协程间通讯
    $chan = new Swoole\Coroutine\Channel(1);
    Swoole\Coroutine::create(function () use ($chan) {
        for($i = 0; $i < 100000; $i++) {
            co::sleep(1.0);
            $chan->push(['rand' => rand(1000, 9999), 'index' => $i]);
            echo "$i\n";
        }
    });
    Swoole\Coroutine::create(function () use ($chan) {
        while(1) {
            $data = $chan->pop();
            var_dump($data);
        }
    });
});
的码云指数为
超过 的项目
加载中

评论(19)

mingzhanghui
mingzhanghui
搞这些玩意,不如直接换语言,比如Go, Node.js
高久峰-肥猪减肥

引用来自“eechen”的评论

很多人都喜欢吐槽Swoole的文档,个人认为 #Swoole# 项目有必要出书,比如书名可以是: 《高性能PHP7网络编程:Swoole权威指南》 内容介绍如何使用Swoole进行开发,项目实例可以是开发一个基于Web的即时通讯软件,高级部分还可以加入如何使用C开发PHP扩展。
你这种想法好。但是怎么不考虑你去写。eechen不是php 大佬吗
洛萨
出书就算了,容易过时
这波天秀
这波天秀
swoole都全协程化了,还async/await,逗我呢
dosshell
dosshell
PHP缺乏async/await语法糖会导致使用#Swoole#陷入Callback Hell
哈哈爱兮爱兮乎乎
虽然不用php,还是支持
宇润-非洲black鬼人人得而诛之
只有swoole才可以救php!
纯24K爷们儿
纯24K爷们儿
还是回归PHP7.2的好
hell0cat
hell0cat
折腾了几天在FreeBSD上安装 swoole pecl还是源码编译都死活安装不上,放弃了,不知道是不是韩总不支持FreeBSD?#Swoole#
eechen
eechen
很多人都喜欢吐槽Swoole的文档,个人认为 #Swoole# 项目有必要出书,比如书名可以是: 《高性能PHP7网络编程:Swoole权威指南》 内容介绍如何使用Swoole进行开发,项目实例可以是开发一个基于Web的即时通讯软件,高级部分还可以加入如何使用C开发PHP扩展。
eechen
eechen
很多人都喜欢吐槽Swoole的文档,个人认为 #Swoole# 项目有必要出书,比如书名可以是: 《高性能PHP网络编程:Swoole权威指南》 内容介绍如何使用Swoole进行开发, 项目实例可以是开发一个基于Web的即时通讯软件, 高级部分还可以加入如何使用C开发PHP扩展。

Swoole v4.5.1 版本发布

v4.5.1,这是一个 BUG 修复版本, 补充了本应在v4.5.0引入的 System 文件函数废弃标记。 增强 支持 hook 下的 socket_context 的 bindto 配置 (#3275) (#3278) (@codinghuang) 支持 client::...

05/11 20:32

Swoole 4.5 发布,新增多项新特性

4.5.0 这是一个大版本更新,在 4.5 版本中移除了 4.4 版本中标记为已废弃的特性,大幅优化了异步 Server 消息回调函数的性能。增强了对于 PHP-FPM 互调用的支持。 新增 API DTLS 支持, 现在我...

04/26 14:33

Swoole 4.4.13 发布,内置协程连接池

新的API 内置连接池 (例子) (文档) (@twose) 增强 Coroutine\Http\Server支持Websocket帧压缩 (#2943) (@twose) CURL hook 支持 CURLOPT_PUT, CURLOPT_INFILE, CURLOPT_INFILESIZE 等选项 (#...

2019/12/17 16:43

Swoole 4.4.1 发布,BUG 修复版本

Swoole 4.4.1 发布了,更新内容如下: 修复 修复 SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER,解决SSL下大数据包发送失败 (#2667) (@twose) 修复信号监听功能的BUG (#2675) (@matyhtf) 修复MySQL...

2019/07/18 17:49

Swoole 4.4 正式版已发布,包含大量更新

Swoole 4.4 正式版已发布,该版本包含大量更新,详细信息如下: 向下不兼容改动 和PHP官方保持一致, 不再支持PHP7.0 (@matyhtf) 移除Serialize模块, 在单独的 ext-serialize 扩展中维护. 废弃...

2019/07/10 12:38

swoolefy 4.2.2 发布,基于 swoole 实现的高性能、协程级框架

swoolefy是一个基于swoole实现的轻量级高性能的常驻内存型的API和Web应用服务框架, 高度封装了http,websocket,udp服务器,以及基于tcp实现可扩展的rpc服务, 同时支持composer包方式安装部...

2019/05/19 21:52

Swoole 2019 :化繁为简、破茧成蝶

Swoole开源项目从2012年开始发布第一个版本,到现在已经有近7年的历史。在这七年的时间里: 提交了8821次代码变更 发布了287个版本 收到并解决1161次issue反馈 合并了603次pull request 共有...

2019/01/21 13:03

Swoole 4.2.10 发布,BUG 修复版本

增强 重构Coroutine\Http\Client,开发人员不再需要关心连接是否断开,除非网络异常(自动重新连接) 协程切换器添加了一些操作,因为PDO在IO请求时更改了全局BUG处理程序 支持使用内部C函数创...

2018/12/21 09:48

Swoole 4.1 发布,支持原生 Redis/PDO/MySQLi 协程化

Swoole 4.1 发布了,更新如下: 重大新特性 支持 Redis/PDO/MySQLi 从4.1.0版本开始支持了对PHP原生Redis、PDO、MySQLi协程化的支持。 可使用Swoole\Runtime::enableCorotuine()将普通的同步...

2018/09/06 13:36

Swoole 4.1.0 发布,支持原生 Redis/PDO/MySQLi 协程化

重大新特性 支持 Redis/PDO/MySQLi 从4.1.0版本开始支持了对PHP原生Redis、PDO、MySQLi协程化的支持。 可使用Swoole\Runtime::enableCorotuine()将普通的同步阻塞Redis、PDO、MySQLi操作变为...

没有更多内容

加载失败,请刷新页面

1
回答
nodejs 与swoole 如何通讯?

服务器用的php和swoole搭配构建的tcp客户端,还挺好,最近因需求驱动,需要nodejs写一些东西,要调用服务器的数据采用tcp链接的形式,但是查了...

02/05 19:05
7
回答
千人齐聚共探开源,剑指源码尖峰对话 | 2019 OSC 年终盛典图文回顾

12月15日,2019年 OSC源创会年终盛典在深圳科兴科学园国际会议中心成功举办,本次年终盛典 活动详情 请查看, PPT下载 请点击,视频回看请点击。...

2019/12/17 21:42
4
回答
swoole停止队列问题

我 swoole 开启一个常驻内存脚本 里面有 redis 队列 我前端请求这个接口 前端有两个按钮,停止队列和开始队列 怎么实现停止队列 大佬们有思路吗...

2019/08/09 11:34
1
回答
请问swoole4.4怎么操作redis

看官方文档说 4.3版本以后 --enable-async-redis参数被废弃了 我就通过coroutine协程的方式把这个示例运行了一下 不成功 请问...

2019/05/25 18:03
8
回答
为什么基于 swoole 有那么多框架轮子,而不是提供一个好用的轮子?

为什么基于 swoole 有那么多框架轮子,而不是提供一个好用的轮子?

2018/06/22 10:22
4
回答
既然韩天峰的Swoole4能实现了Golang的所有功能了,PHPer还有必要学Golang吗?

既然韩天峰的Swoole4能实现了Golang的所有功能了,PHPer还有必要学Golang吗? 性能比较,Swoole和Golang性能也相差无几。 性...

2018/12/04 10:54
30
回答
【开源访谈】韩天峰:从 2.x 跃入 4.x ,Swoole 开发背后的故事

6月14日,流行 PHP 协程引擎 Swoole 正式发布 4.0 版本,支持在 PHP 代码中的任意位置使用协程,并带来了全局变量隔离、支持 MySQL...

2018/07/03 07:51
4
回答
swoole_process 多进程爬虫url去重和数据存储问题

用swoole_process创建主进程,然后再开启多个子进程,从主进程首次爬取主页面,把爬取到的url过滤后平均分发给多个子进程,每个子进程去爬取收到的...

2017/11/10 15:27
2
回答
swoole,异步的PHP程序中可以使用Swoole\Http\Client作为WebSocket客户端?
iGeek 的回答 2017/07/25 11:25
最佳答案
Server部分用PHP实现,Client部分没必要用PHP,有数据交互直接PHP内部就能解决,Client部分可以用HTML5实现。 websocket本身是长连接的协议,不用自己轮询。实现步骤PHP编写Server,前端页面js编写Client(相当于浏览器作为终端跟服务器连接)

没有更多内容

加载失败,请刷新页面

Swoole server函数列表(转载)

swoole_server::__construct swoole_server::set swoole_server::on swoole_server::addlistener swoole_server::handler swoole_server::start swoole_server::reload swoole_server::shutd...

2018/03/26 10:03
69
0
swoole tcp client/server-献给swoole初初初初初初学者们

## 环境 - PHP5.6.17 - Swoole 1.8.8-stable - Ubuntu 14.04 (use_namespace 需要开启命名空间) ## 学前提要 - Server 角色并不是一成不变的,当 Server 在请求数据时,实际上就是 Client,相...

2016/08/29 17:45
645
1
一例swoole_process运行swoole_http_server

swoole_process swoole_process('执行的文件路径','文件所需的参数');//利用swoole-process执行一个外部脚本 swoole_process__construct(回调函数, redirect_stdin_stdout, 是否创建进程通信...

2019/06/06 14:09
13
0
swoole http server 性能优化

上线了一个基于 swoole http server 的服务以后,发现这个服务的请求耗时监控毛刺十分严重,接口耗时波动比较大,经过一段时间的分析,发现这个服务 response 包十分大,有些 response 包高达...

2018/08/21 10:10
668
0
Swoole server事件回调函数

在swoole中,一个swoole_server的拥有若干回调函数,这些回调函数决定了swoole_server的相关功能。可以通过 $serv->on( string $event, mixed $callback ); 1.onReceive 描述:接收数据的回调...

2018/12/13 14:37
25
0
swoole深入学习 2. tcp Server和tcp Client

这节来学习Swoole最基础的Server和Client。会通过创建一个tcp Server来讲解。 server <?php class Server { private $serv; public function __construct() { $this->serv = new Swoole\Ser...

2018/07/02 18:31
185
0
swoole项目思维转换 -- mysql server gone away

swoole项目思维转换 -- mysql server gone away

2015/10/15 11:20
551
0
swoole server 超时控制以及踩过的坑

在选定swoole作为PHP微服务的底层以后,我找了很久swoole server端的超时控制,但是,swoole的官方文档里,没有写server端的超时控制(类似于php-fpm的request_terminate_timeout配置),swo...

2018/08/07 11:22
1.4K
1
swoole_server的相关属性

在swoole中,一个swoole_server的相关属性可以通过 $serv->set( $array configs ); 函数来配置,这些配置选项使得swoole更加灵活。 示例: $serv = new swoole_server("0.0.0.0", 9501); $s...

2018/05/30 14:37
22
0
压测 swoole_websocket_server 性能

概述 这是关于 Swoole 入门学习的第十篇文章:压测 swoole_websocket_server 性能。 第九篇:Swoole Redis 连接池的实现 第八篇:Swoole MySQL 连接池的实现 第七篇:Swoole RPC 的实现 第六...

2019/04/10 10:10
48
0

没有更多内容

加载失败,请刷新页面

返回顶部
顶部