当前位置: 首页 > news >正文

重庆网站制作福州/网站建设报价方案

重庆网站制作福州,网站建设报价方案,有没有免费的crm系统,dw怎么做购物网站前言 传统的 php-fpm 一个进程执行一个请求,要达到多少并发,就要生成多少个进程。更糟糕的是每次请求都需要重新编译执行,导致并发一直上不来。因此出现了 Swoole 和 WorkerMan 两个国内流行的常驻内存框架。这两个框架原理都是通过事件循环…

前言

传统的 php-fpm 一个进程执行一个请求,要达到多少并发,就要生成多少个进程。更糟糕的是每次请求都需要重新编译执行,导致并发一直上不来。因此出现了 Swoole 和 WorkerMan 两个国内流行的常驻内存框架。这两个框架原理都是通过事件循环,让程序一直停留在内存,等待外部请求,达到高并发。

点此加入我的企鹅群

为什么需要异步

先来看一个例子

在工作目录下新建文件 slowServer.php

<?php
sleep(5); // 5秒后才能返回请求
echo 'done';

开启服务

$ php -S localhost:8081 slowServer.php

开另一个终端,安装依赖

$ pecl install event # 安装 event 扩展
$ composer require workerman/workerman
$ composer require react/http-client:^0.5.9

新建文件 worker.php

require_once __DIR__ . '/vendor/autoload.php';
use Workerman\Worker;
use Workerman\Connection\AsyncTcpConnection;
use Amp\Artax\Response;$http_worker = new Worker("http://0.0.0.0:8082");$http_worker->count = 1; // 只开一个进程$http_worker->onMessage = function($connection, $host) {echo 1;$data = file_get_contents('http://localhost:8081');$connection->send($data);
};Worker::runAll();

开启服务器

php worker.php start

在浏览器开启两个标签,都打开网址 http://localhost:8082 。这时可以看到终端输出“1”,过了一会儿又输出“1”,原因是8081服务器在处理第一个请求的时候阻塞在了等待8081返回之中,等第一个请求结束后,才开始处理第二个请求。也就是说请求是一个一个执行的,要达到多少个并发,就要建立多少个进程,跟 php-fpm 一样。现在修改一下代码

$http_worker->onMessage = function($connection, $host) {echo 1;$loop    = Worker::getEventLoop();$client  = new \React\HttpClient\Client($loop);$request = $client->request('GET', 'http://localhost:8081');$request->on('error', function(Exception $e) use ($connection) {$connection->send($e);});$request->on('response', function ($response) use ($connection) {$response->on('data', function ($data) use ($connection) {$connection->send($data);});});$request->end();
};

现在打开服务,再在浏览器发起请求,发现第二个“1”在请求后就马上输出了,而这时第一个请求还没结束。这表明进程不再阻塞,并发量取决于 cpu 和 内存,而不是进程数。

为什么需要异步

通过上面的例子已经很明白了,reactphp 框架通过把 http 请求变成异步,让 onMessage 函数变成非阻塞,cpu 可以去处理下一个请求。即从 cpu 循环等待 8081 返回,变成了 epoll 等待。

异步的意义在于把 cpu 从 io 等待中解放出来,可以处理其他计算任务。 如果你想知道怎么用框架实现异步,看到这里就可以了。WorkerMan 配合 ReactPHP 或者自身的 AsyncTcpConnection 已经可以满足很多 io 请求异步化的需求。下面继续讨论这些框架是怎么做到异步的。

哪些地方应该被做成异步

通过上面的例子已经知道一旦执行到不需要 cpu,但是要等待 io 的时候,应该把 io 的过程做成异步。

实现事件循环

上面的例子是通过 reactphp 把 http 请求变成了异步,其实 WorkerMan 框架本身也是异步的,下面来看看 WorkerMan 是怎么使 onMessage 函数可以异步接受请求。先来新建下面这个文件 react.php

<?php
$context = stream_context_create();
$socket = stream_socket_server('tcp://0.0.0.0:8081', $errno, $errmsg, STREAM_SERVER_BIND | STREAM_SERVER_LISTEN,$context); // 注册一个 fd(file descriptor)function react($socket){$new_socket = stream_socket_accept($socket, 0, $remote_address);echo 1;
}$eventBase = new EventBase();
$event = new Event($eventBase, $socket, Event::READ | Event::PERSIST, 'react', $socket); // 注册一个事件,检测 fd 有没有写入内容
$event->add();
$eventBase->loop(); // 开始循环

开始执行

$ php react.php

在另一个终端执行

telnet 127.0.0.1 8081

这时就会看到第一个终端输出’1’。

这里,事件回调是通过检测 fd 是否有写入内容来实现,这个过程不需要 cpu 参与。当 fd 有内容写入时,会调函数 ‘react’,这时开始使用 cpu。如果这时候进程执行另一个异步请求,比如用 reactphp 框架请求一个网页,那么程序会让出 cpu,此时如果有另一个请求进来,就可以回调执行另一个 ‘react’ 函数。由此提高了并发量。

协程

生成器 Generater

这是生成器的 PHP 官方文档 http://php.net/manual/zh/lang…

<?php
function gen_one_to_three() {for ($i = 1; $i <= 3; $i++) {//注意变量$i的值在不同的yield之间是保持传递的。yield $i;}
}$generator = gen_one_to_three();
foreach ($generator as $value) {echo "$value\n";
}

生成器就是每次程序执行到 yield 的时候保存状态,然后返回 $i,是否继续执行 gen_one_to_three 里的循环,取决于主程序是否继续调用

什么是协程

上面的程序另一种写法是

<?php
$i = 1;
function gen_one_to_three() {global $i;if ($i<=3){return $i++;}
}while ($value = gen_one_to_three()) {echo "$value\n";
}

由此可见,协程就是一种对函数的封装,使其变成一种可以被中断的函数,行为更像是子进程或子线程,而不是函数。协程的具体写法这里不细写,因为协程的写法十分复杂,可能需要再做一层封装才能好用。

协程与异步

既然协程可以被中断,那么只要在程序发起请求后发起事件循环,然后用 yield 返回,然后程序继续执行主程序部分,等事件返回后触发函数,执行 Generatot::next() 或 Generator::send() 来继续执行协程部分。封装好后就好像没有异步回调函数一样,和同步函数很像。

现在已经有 ampphp 和 swoole 两个框架封装了协程,有兴趣可以了解一下。

点关注,不迷路

好了各位,以上就是这篇文章的全部内容了,能看到这里的人呀,都是人才。之前说过,PHP方面的技术点很多,也是因为太多了,实在是写不过来,写过来了大家也不会看的太多,所以我这里把它整理成了PDF和文档,如果有需要的可以

点击进入暗号: PHP+「平台」

在这里插入图片描述

在这里插入图片描述


更多学习内容可以访问【对标大厂】精品PHP架构师教程目录大全,只要你能看完保证薪资上升一个台阶(持续更新)

以上内容希望帮助到大家,很多PHPer在进阶的时候总会遇到一些问题和瓶颈,业务代码写多了没有方向感,不知道该从那里入手去提升,对此我整理了一些资料,包括但不限于:分布式架构、高可扩展、高性能、高并发、服务器性能调优、TP6,laravel,YII2,Redis,Swoole、Swoft、Kafka、Mysql优化、shell脚本、Docker、微服务、Nginx等多个知识点高级进阶干货需要的可以免费分享给大家,需要的可以加入我的 PHP技术交流群

http://www.lbrq.cn/news/1280683.html

相关文章:

  • 上海专业网站建设服/网络营销与市场营销的区别
  • 看那种片哪个网站好用/电商网站分析
  • 汕头网站快速排名提升/百度指数十年
  • 做本地门户网站/网站推广交换链接
  • 做网站龙华/公司网站建站要多少钱
  • 运动猿app 网站开发/百度pc版网页
  • 磁力网站怎么做的源码/seo深圳培训班
  • 网站开发的总结与展望/百度识图查图片
  • 卧龙区网站建设哪家好/小广告多的网站
  • 品牌网站建设策/百度一下网页版浏览器百度
  • 网站建设专业介绍/推广公众号的9种方法
  • 做爰片姿势网站/网站超级外链
  • 个人业务网站制作/yy直播
  • 网站申请/百度小说排名
  • 动态网站的设计与实现/短信广告投放
  • 创建一个网站多少钱/百度投诉中心24小时电话
  • 做淘宝美工的网站/樱花12e56
  • 网站开发完整的解决方案/注册网站免费注册
  • 网站开发工资淄博/品牌传播推广方案
  • wordpress the7/seo外包方法
  • 怎么用vps做网站/如何提高百度搜索排名
  • 网站建设规划ppt/西安seo服务公司
  • 义乌外贸网站制作/seoul是韩国哪个城市
  • 织梦模板可以在wordpress用/windows优化大师有必要安装吗
  • 烟台做网站公司/成人职业技能培训有哪些项目
  • 梭子手做鱼网站/武汉网络推广有限公司
  • 天天自学网网址/苏州seo报价
  • 宁波市镇海建设交通局网站首页/网站制作的服务怎么样
  • 顺昌网站建设/数据分析报告
  • 网站首页新闻模板/深圳seo推广外包
  • Python Pandas.cut函数解析与实战教程
  • 编程语言Java——核心技术篇(五)IO流:数据洪流中的航道设计
  • OpenResty 高并发揭秘:架构优势与 Linux 优化实践
  • 一分钟部署一个导航网站
  • Java中排序规则详解
  • 【408二轮强化】数据结构——线性表