swoole入门简介

1.swoole 应用

互联网

移动通信

企业软件

云计算

网络游戏

物联网

车联网

2.swoole是什么

  • 异步、并行、高性能

  • 纯C语言编写

  • php扩展

3.swoole 能做什么

  • 异步多线程服务器及客户段
  • 异步Myslq、redis、数据连接池、任务队列
  • http/websocket服务器/客户端
  • 异步文件读写
  • swoole 2.0 支持协程

swoole 的安装

1.要求

  • 环境cenos7/ubuntu16

  • php版本>=7.2

    注意:此是安装swoole4.6.0的要求,其他版本查询官方文档

2.安装pecl

$ wget http://pear.php.net/go-pear.phar
$ php go-pear.phar

3.安装swoole

$ sudo pecl  install swoole

4.配置sockets.ini

  • 进入/etc/php.d下

  • 在sockets.ini中将extension=swoole.so加到extension=sockets.so下面

  • 重启php-fpm

注意:在php.ini 中添加extension=swoole.so会报错。Unable to load dynamic library 'swoole.so’

启动服务

1.TCP服务器

  • Server.php
//创建Server对象,监听 127.0.0.1:9501 端口
$server = new Swoole\Server('127.0.0.1', 9501);//监听连接进入事件
$server->on('Connect', function ($server, $fd) {echo "Client: Connect.\n";
});//监听数据接收事件
$server->on('Receive', function ($server, $fd, $reactor_id, $data) {$server->send($fd, "Server: {$data}");
});//监听连接关闭事件
$server->on('Close', function ($server, $fd) {echo "Client: Close.\n";
});//启动服务器
$server->start();
  • 执行程序

    php server.php
    

2.UDP 服务器

  • udp_server.php

    $server = new Swoole\Server('127.0.0.1', 9502, SWOOLE_PROCESS, SWOOLE_SOCK_UDP);//监听数据接收事件
    $server->on('Packet', function ($server, $data, $clientInfo) {var_dump($clientInfo);$server->sendto($clientInfo['address'], $clientInfo['port'], "Server:{$data}");
    });//启动服务器
    $server->start();
    
  • 启动服务

    php udp_server.php
    

3.HTTP 服务器

  • http_server.php
$http = new Swoole\Http\Server('0.0.0.0', 9501);$http->on('Request', function ($request, $response) {$response->header('Content-Type', 'text/html; charset=utf-8');$response->end('<h1>Hello Swoole. #' . rand(1000, 9999) . '</h1>');
});$http->start();
  • 启动服务

    php http_server.php
    
  • URL 路由

    应用程序可以根据 $request->server['request_uri'] 实现路由。如:http://127.0.0.1:9501/test/index/?a=1,代码中可以这样实现 URL 路由。

    $http->on('Request', function ($request, $response) {list($controller, $action) = explode('/', trim($request->server['request_uri'], '/'));//根据 $controller, $action 映射到不同的控制器类和方法(new $controller)->$action($request, $response);
    });
    

4.WebSocket 服务器

  • ws_server.php
//创建WebSocket Server对象,监听0.0.0.0:9502端口
$ws = new Swoole\WebSocket\Server('0.0.0.0', 9502);//监听WebSocket连接打开事件
$ws->on('Open', function ($ws, $request) {$ws->push($request->fd, "hello, welcome\n");
});//监听WebSocket消息事件
$ws->on('Message', function ($ws, $frame) {echo "Message: {$frame->data}\n";$ws->push($frame->fd, "server: {$frame->data}");
});//监听WebSocket连接关闭事件
$ws->on('Close', function ($ws, $fd) {echo "client-{$fd} is closed\n";
});$ws->start();
  • 运行程序
php ws_server.php

可以使用 Chrome 浏览器进行测试,JS 代码为:

var wsServer = 'ws://127.0.0.1:9502';
var websocket = new WebSocket(wsServer);
websocket.onopen = function (evt) {console.log("Connected to WebSocket server.");
};websocket.onclose = function (evt) {console.log("Disconnected");
};websocket.onmessage = function (evt) {console.log('Retrieved data from server: ' + evt.data);
};websocket.onerror = function (evt, e) {console.log('Error occured: ' + evt.data);
};

5.定时器

Swore_alarm.php

<?php
use Swoole\Process;
use function Swoole\Coroutine\run;run(function () {Process::signal(SIGALRM, function () {static $i = 0;echo "#{$i}\talarm\n";$i++;if ($i > 20) {Process::alarm(-1);Process::kill(getmypid());}});//100msProcess::alarm(100 * 1000);while(true) {sleep(0.5);}
});

6.异步TCP服务器

Task_server.php

<?php
$serv = new Swoole\Server('0.0.0.0', 9501);//设置异步任务的工作进程数量
$serv->set(['task_worker_num' => 4
]);//此回调函数在worker进程中执行
$serv->on('Receive', function($serv, $fd, $reactor_id, $data) {//投递异步任务$task_id = $serv->task($data);echo "Dispatch AsyncTask: id={$task_id}\n";
});//处理异步任务(此回调函数在task进程中执行)
$serv->on('Task', function ($serv, $task_id, $reactor_id, $data) {echo "New AsyncTask[id={$task_id}]".PHP_EOL;//返回任务执行的结果$serv->finish("{$data} -> OK");
});//处理异步任务的结果(此回调函数在worker进程中执行)
$serv->on('Finish', function ($serv, $task_id, $data) {echo "AsyncTask[{$task_id}] Finish: {$data}".PHP_EOL;
});$serv->start();

7.TCP客户端

Tcp_client.php

<?php$client = new Swoole\Client(SWOOLE_SOCK_TCP);
if (!$client->connect('172.20.10.4', 9505, -1)) {exit("connect failed. Error: {$client->errCode}\n");
}
$client->send("hello world\n");
echo $client->recv();
$client->close();

8.创建进程

Swoole_process.php

<?php
use Swoole\Process;for ($n = 1; $n <= 3; $n++) {$process = new Process(function () use ($n) {echo 'Child #' . getmypid() . " start and sleep {$n}s" . PHP_EOL;sleep($n);echo 'Child #' . getmypid() . ' exit' . PHP_EOL;});$process->start();
}
for ($n = 3; $n--;) {$status = Process::wait(true);echo "Recycled #{$status['pid']}, code={$status['code']}, signal={$status['signal']}" . PHP_EOL;
}
echo 'Parent #' . getmypid()

9.swoole锁机制详解与实现

Swore_lock.php

<?php$lock = new Swoole\Lock(SWOOLE_MUTEX);
echo "[Master]create lock\n";
$lock->lock();
if (pcntl_fork() > 0)
{sleep(1);$lock->unlock();
}
else
{echo "[Child] Wait Lock\n";$lock->lock();echo "[Child] Get Lock\n";$lock->unlock();exit("[Child] exit\n");
}
echo "[Master]release lock\n";
unset($lock);
sleep(1);
echo "[Master]exit\n";

10.swoole与dns查询

Swoole_dns.php

<?phpSwoole\Coroutine\run(function () {$ip = Swoole\Coroutine\System::dnsLookup("www.baidu.com");echo $ip;
});

11.swoole异步文件读取

Swoole_readfile.php

<?php$filename = __DIR__ . "/defer_client.php";
Swoole\Coroutine\run(function () use ($filename)
{$r = Swoole\Coroutine\System::readFile($filename);var_dump($r);
});

12.swoole异步写入文件

Swoole_writefile.php

<?php
$filename = __DIR__ . "/defer_client.php";
Swoole\Coroutine\run(function () use ($filename)
{$w = Swoole\Coroutine\System::writeFile($filename, "hello swoole!");var_dump($w);
});

13.swoole异步操作mysql

Swoole_mysql.php

<?php
use Swoole\Coroutine\MySQL;
use function Swoole\Coroutine\run;run(function () {$swoole_mysql = new MySQL();$swoole_mysql->connect(['host'     => '127.0.0.1','port'     => 3306,'user'     => 'root','password' => '######','database' => 'test',]);$res = $swoole_mysql->query('select sleep(1)');var_dump($res);
});

swoole安装及基本应用相关推荐

  1. swoole安装基本配置

    php安装swoole 1. 下载swoole安装 ``` wget http://pecl.php.net/get/swoole-1.9.1.tgz tar -zxvf swoole-1.9.1.t ...

  2. Swoole安装步骤

    参考:https://www.jianshu.com/p/fa2cbf1a9e26 1.更新源 yum update 2.安装pecl(默认安装 php7.2 没有pecl,如果已经安装可忽略) yu ...

  3. lnmp + swoole 安装

    nginx地址:http://120.52.51.16/nginx.org/download/nginx-1.15.7.tar.gz PHP地址:http://am1.php.net/distribu ...

  4. swoole 安装测试

    为什么80%的码农都做不了架构师?>>>    Swoole安装 安装完PHP后,即可安装swoole扩展. swoole扩展下载地址:https://github.com/swoo ...

  5. cygwin + swoole 安装

    cygwin + swoole 安装 cygwin: http://www.cygwin.com/ 下载:https://cygwin.com/setup-x86_64.exe 网易开源镜像站: ht ...

  6. PHP加swoole,php swoole 安装与使用

    swoole 安装 用的是centOS php安装目录:/usr/local/php php.ini配置文件路径:/usr/local/php/etc/php.ini 1.安装swoole cd /u ...

  7. php扩展swoole安装,php 安装swoole扩展

    步骤 1.在swoole官网 https://www.swoole.com/ 下载需要安装的版本如通过git clone下载: git clone https://gitee.com/swoole/s ...

  8. windows php swoole 安装

    Cygwin 官方地址:http://www.cygwin.com/ swoole 官方下载地址:https://github.com/swoole/swoole-src/releases 1.下载 ...

  9. swoole安装全纪录

    Ondřej Surý 的 PHP PPA 为 Ubuntu 16.04/14.04 提供了 PHP7.2 版本,软件源安装的 PHP 默认以 Unix Socket 的状态运行在 /run/php/ ...

  10. php cannot load service mmap.,php swoole 安装失败

    看到一个基于swoole的聊天室,php 环境根据yum安装lnmp安装好了,之后安装swoole,但是失败了 [root@VM_0_14_centos html]# cat /etc/redhat- ...

最新文章

  1. 书评 | 圈内大佬怎么看编程日历
  2. Springboot+Thymeleaf+layui框架的配置与使用
  3. Leetcode题目:Best Time to Buy and Sell Stock
  4. HttpClient超时重复提交问题
  5. 产品经理如何开始数据分析之路?(基础知识)
  6. IDEA 2020.1打开时闪退的问题及解决方法
  7. py-faster-rcnn + ZF 实现自己的数据训练与检测(二)
  8. 数组黑科技(偏性能方面)未完待更新...
  9. 【GNN】大热下的 GNN 研究面临哪些“天花板”?未来的重点研究方向又在哪?...
  10. TCP/IP协议简单介绍
  11. 树莓派 vnc Cannot currently show the desktop
  12. 打开GTA 5竟要跑19.8亿次if语句!黑客嘲讽R星代码烂,修改后直接省70%加载时间...
  13. Vue项目 在chrome页面崩溃:喔唷 崩溃了(总结)
  14. DFS.01-寻路问题
  15. Hadoop解除安全模式
  16. Windows 下网卡对802.1Q tag 的支持
  17. 手机\固定电话座机呼叫转移设置方法
  18. 蓝牙耳机哪个品牌最好?2023最新学生平价蓝牙耳机推荐
  19. 【论文写作】LaTeX学习笔记:一文入门LaTeX(超详细)
  20. 几道特别难搞的数据库面试题

热门文章

  1. STM32系列——工程移植(从stm32f103c8t6工程到stm32f103zet6工程)
  2. php 计算涨幅,如何计算股票涨幅空间?股票涨幅怎么算
  3. 以假乱真的AI美女,有着让人羡慕的好身材
  4. ROS学习(三)调用笔记本和usb外接摄像头
  5. vue中的input使用e.target.value赋值的问题
  6. 哈尔滨java开发工资_给哈尔滨Java开发初学者的几个学习建议
  7. 宾馆客房管理系统正文
  8. nginx 301 302重定向跳转配置 (一般都做301,对seo好)
  9. 配置jupyter连接服务器
  10. grad can be implicitly created only for scalar outputs