php开发面试题---php 对swoole的理解

目录
一、总结
一句话总结:
1、swoole出现的意义是什么?
2、swoole的本质是什么?
3、swoole支持哪些功能?
4、php+swoole能做什么?
二、php 对swoole的理解
1:关于phper常用的全局变量(global)为什么在onRequest函数中不能使用。
2:什么是异步、什么是回调
3:为什么onReceive收到的数据这么大
4:自制httpserve
使用swoole必须要掌握的技能
个人学习swoole的经历
总结

一、总结(点击显示或隐藏总结内容)
一句话总结:
以战养学,实例驱动
swoole是披着PHP外衣的C程序:其实就是c、java那些语言里面的高阶功能:比如 持久连接、异步通信、websocket、多线程

1、swoole出现的意义是什么?
解決php缺失的功能:swoole做为一种网络通信框架,解决php缺失的功能:比如多线程、异步通信、持久连接等

2、swoole的本质是什么?
披着PHP外衣的C程序:其实就是c、java那些语言里面的高阶功能
php所缺失的功能:swoole所提供的功能正是php所缺失的功能:比如多线程、异步通信、持久连接等
异步网络通信引擎:面向生产环境的 PHP 异步网络通信引擎

3、swoole支持哪些功能?
其实就是c、java那些语言里面的高阶功能
持久连接、异步通信、websocket、多线程

4、php+swoole能做什么?
c能做的,php+swoole都能做:比如 游戏服务器、在线聊天系统等

二、php 对swoole的理解
转自或参考:php 对swoole的理解
https://blog.csdn.net/qq_42030417/article/details/82997124

本文主要记录一下学习swoole的过程、填过的坑以及swoole究竟有多么强大!
首先说一下对swoole的理解:披着PHP外衣的C程序。很多PHPer朋友看到swoole提供的强大功能、外界对其的崇拜便跃跃欲试的安装、调 试其demo、编写新功能,然后兴奋的奔走相告。没过几天当你按照自己的理解继续用swoole时,发现代码并没有按照自己的预期运行,然后开始破口大 骂,什么破东西呀,代码跟demo基本一样,为啥运行不通呢?什么狗屁work、task、共享内存、ipcs、异步,各种问题涌现,然后迅速去查官方文 档,发现文档中竟然对这些并没有提及,只是简单的介绍怎么使用,此时几乎对swoole丧失希望。

回到顶部
1:关于phper常用的全局变量(global)为什么在onRequest函数中不能使用。
因为swoole是多线程编程,global是不能在多个进程间共享的。例如

global $i = 0;

function onRequest() {

echo $i++; 

}
如果在swoole中写一个上面的程序,并不会每次访问输出一个递增的数字。如果要实现预期的效果,需要使用swoole_table的相关函数。

回到顶部
2:什么是异步、什么是回调
对于phper来说,对异步、回调的理解估计就是ajax。当看到swoole里面对异步、回调的解释,貌似很简单的样子,就这样在没有任何多线程编辑经验的时候贸然用了swoole,结果被坑的偷偷撸代码好几个通宵来填自己的坑。

回到顶部
3:为什么onReceive收到的数据这么大
客户端发送的多次请求,服务端是可以一次性接收的。并不是客户端发送一次,服务端接收一次

回到顶部
4:自制httpserve
写一个http服务端,然后通过浏览器访问这个自制的服务器,刷新一次浏览器,服务端为什么为接收到两次请求?这个问题估计困饶了好多初次用swoole写httpserver的朋友。因为浏览器会多发一个favicon.ico请求。
原因
出现这种情况的原因其实很简 单,大部分phper都只会php这一种语言,主要用途就是做web,写业务逻辑。很少去了解服务器程序的开发。有一次一个朋友用swoole写了一个简 单的服务端,一个客户端,跑过来问我为什么都启动了却都收不到数据,我简单看了下代码,所有连接确实都成功了,两端都设置了onReceive回调,代码 没问题,看到最后才发现他的服务端、客户端都设置了接到消息的回调函数,但是两端都没有向对方发消息,两端处于僵持状态。然后swoole官方对于这种常 识问题没有给出说明,只是说如何设置回调、如何发消息,如何这样,如何那样。对于有服务端开发经验的同学来说,肯定不会遇到这种问题,swoole文档也 不需要指明需要这样做,因为这是常识。但对于phper来说,指明这一点是非常重要的,因为如上面所说phper是没有这方面认知的,只有服务端开发经验 的程序员有才会有。
swoole的特色:
网络通信 框架、异步、多线程。这些特性正是php所不完善的功能(虽然官方提供很多基础函数可以实现这些功能,然后缺少中文文档,很少有人用php来实现这部分功 能),普通的phper也不具备这些特性的基础认知,所以贸然使用swoole难免会遇到一些根本在swoole官方查不到的常识问题。

使用swoole必须要掌握的技能
多线程编程
进程间通信
网络协议TCP/UDP的认知
PHP的各项基本技能
回到顶部
个人学习swoole的经历
在很久之前我也是一个只会 php的程序员,后来一次偶然机会需要用httpsqs,用了一段时间后发现有一些个性的需求,于是就开始看源码。这真是不看不知道,一看吓一 跳,httpsqs只是一层简单的包装,内部是一个Tokyo Cabinet数据库,印象中封装的代码也就一百多行。主要思路就是用C语言的libevent做了一个http服务器,接收请求读写tokyo cabinet数据库,当时按照这种思路做出来的程序确实不少。后来我就突发奇想,既然C语言可以用libevent函数,那PHP肯定也可以用 libevent监听网络,接收请求后读写数据库做队列服务。后来经过查php官方文档,PHP确实提供一系统完整的函数来完成这些功能,甚至多线程的全 套函数都有提供,但中文文档太少,网上也很少搜索到成熟的代码。在逼不得已的情况下,补习了linux-C多线程开发的基本原理,进程间通信的常用方法, 也用来做了一些简单的demo。唯一的感觉就是写一个简单的功能,设计起来还真复杂。就在快要放弃的时候,swoole出现了。swoole所提供的功能 正是php所缺失的功能,简直是太棒了。swoole做为一种网络通信框架,只需要简单的几行设置,一个服务器就搭建起来了,以后就是不断的去完善业务代 码。之前在libevent交流群中得知swoole的设计在c\c++中并不是最好的框架设计,但其亮点就是把基本功能用C封装好,业务功能留给世界上 最好的语言PHP来编写。自此便开始了swoole的填坑之旅。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
think-swoole是基于ThinkPHP框架和Swoole扩展开发的一款高性能Web框架,它能够提供更快的响应速度和更高的并发能力。下面是think-swoole的基本使用文档。 1. 安装 在使用think-swoole之前,需要先安装ThinkPHPSwoole扩展。可以通过composer安装: ``` composer require topthink/think-swoole ``` 2. 配置 在config目录下新建swoole.php配置文件,配置swoole服务器参数: ```php return [ //swoole服务器参数 'server' => [ 'host' => '0.0.0.0', //监听地址 'port' => 9501, //监听端口 'worker_num' => 4, //worker进程数 ], //swoole服务器事件回调 'callbacks' => [ 'onStart' => [App\Server\Server::class, 'onStart'], 'onWorkerStart' => [App\Server\Server::class, 'onWorkerStart'], 'onRequest' => [App\Server\Server::class, 'onRequest'], 'onTask' => [App\Server\Server::class, 'onTask'], 'onFinish' => [App\Server\Server::class, 'onFinish'], 'onClose' => [App\Server\Server::class, 'onClose'], ], ]; ``` 3. 创建服务器 在app目录下新建Server目录,创建Server.php文件,实现onStart、onWorkerStart、onRequest、onTask、onFinish、onClose等事件回调方法。 ```php namespace App\Server; use Swoole\Http\Request; use Swoole\Http\Response; use Swoole\Server; class Server { public static function onStart(Server $server) { echo "Swoole http server is started at http://{$server->host}:{$server->port}\n"; } public static function onWorkerStart(Server $server, int $workerId) { //worker进程启动时加载ThinkPHP框架 defined('APP_PATH') or define('APP_PATH', __DIR__ . '/../'); require __DIR__ . '/../vendor/autoload.php'; } public static function onRequest(Request $request, Response $response) { //处理请求 $_SERVER = []; if (isset($request->server)) { foreach ($request->server as $k => $v) { $_SERVER[strtoupper($k)] = $v; } } if (isset($request->header)) { foreach ($request->header as $k => $v) { $_SERVER[strtoupper($k)] = $v; } } $_GET = []; if (isset($request->get)) { foreach ($request->get as $k => $v) { $_GET[$k] = $v; } } $_POST = []; if (isset($request->post)) { foreach ($request->post as $k => $v) { $_POST[$k] = $v; } } $_FILES = []; if (isset($request->files)) { foreach ($request->files as $k => $v) { $_FILES[$k] = $v; } } ob_start(); try { //执行ThinkPHP应用 $app = new \think\App; $app->run()->send(); } catch (\Exception $e) { //异常处理 echo $e->getMessage(); } $result = ob_get_contents(); ob_end_clean(); //响应结果 $response->end($result); } public static function onTask(Server $server, $taskId, $workerId, $data) { //处理任务 //... return 'task finished'; } public static function onFinish(Server $server, $taskId, $data) { //处理任务完成后的结果 echo 'Task finished: ' . $data . PHP_EOL; } public static function onClose(Server $server, $fd, $reactorId) { //关闭连接时执行 echo "client {$fd} closed\n"; } } ``` 在public目录下新建index.php文件,创建swoole服务器,并启动: ```php //定义应用目录 define('APP_PATH', __DIR__ . '/../app/'); // 加载框架基础文件 require __DIR__ . '/../vendor/autoload.php'; // 创建swoole服务器 $http = new Swoole\Http\Server('0.0.0.0', 9501); $http->set([ 'worker_num' => 4, ]); // 加载swoole配置和事件回调 $http->on('start', [App\Server\Server::class, 'onStart']); $http->on('workerStart', [App\Server\Server::class, 'onWorkerStart']); $http->on('request', [App\Server\Server::class, 'onRequest']); $http->on('task', [App\Server\Server::class, 'onTask']); $http->on('finish', [App\Server\Server::class, 'onFinish']); $http->on('close', [App\Server\Server::class, 'onClose']); // 启动服务器 $http->start(); ``` 4. 访问 启动服务器后,在浏览器中访问http://localhost:9501即可使用think-swoole开发的应用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值