日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > php >内容正文

php

php 5w的并发需要多少台服务器_php使用异步编程是怎样的?

發布時間:2024/9/19 php 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 php 5w的并发需要多少台服务器_php使用异步编程是怎样的? 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

前言

傳統的 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 WorkermanWorker; use WorkermanConnectionAsyncTcpConnection; use AmpArtaxResponse;$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 ReactHttpClientClient($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 "$valuen"; }

生成器就是每次程序執行到 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 "$valuen"; }

由此可見,協程就是一種對函數的封裝,使其變成一種可以被中斷的函數,行為更像是子進程或子線程,而不是函數。協程的具體寫法這里不細寫,因為協程的寫法十分復雜,可能需要再做一層封裝才能好用。

協程與異步

既然協程可以被中斷,那么只要在程序發起請求后發起事件循環,然后用 yield 返回,然后程序繼續執行主程序部分,等事件返回后觸發函數,執行 Generatot::next() 或 Generator::send() 來繼續執行協程部分。封裝好后就好像沒有異步回調函數一樣,和同步函數很像。

現在已經有 ampphp 和 swoole 兩個框架封裝了協程,有興趣可以了解一下。

以上內容希望幫助到大家,更多PHP大廠PDF面試文檔,PHP進階架構視頻資料,PHP精彩好文可以關注公眾號:PHP開源社區,或者訪問:

精華PHP技術文章整理合集——PHP框架篇

精華PHP技術文合集——微服務架構篇

精華PHP技術文合集——分布式架構篇

精華PHP技術文合集——高并發場景篇

精華PHP技術文章整理合集——數據庫篇

總結

以上是生活随笔為你收集整理的php 5w的并发需要多少台服务器_php使用异步编程是怎样的?的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一区二区免费 | 捆绑黑丝美女 | 久久久久免费观看 | 97超碰97 | 激情在线观看视频 | 在线中文字日产幕 | 日日噜噜噜噜久久久精品毛片 | 婷婷天堂 | 国产真人无遮挡作爱免费视频 | 亚洲福利一区二区三区 | 四虎成人免费视频 | 美国三级视频 | 国产麻豆成人精品av | 亚洲素人 | 国产天堂第一区 | 青草一区 | 国产精选一区二区三区 | 91人人草| 欧美一区二区三区四 | 中文字幕在线观看日本 | 黄频视频在线观看 | 激情宗合网 | 黑人精品一区二区三区 | 日韩欧美精品在线播放 | 国产 日韩 欧美 综合 | 日韩电影一区二区三区四区 | 2018天天干天天操 | 少妇按摩一区二区三区 | 久久两性视频 | 日本黄色录像片 | 伊人久久五月 | 伊人网大香 | 婷婷五月精品中文字幕 | 男女日屁视频 | 毛片网站在线免费观看 | 免费av网站在线 | 欧美特级特黄aaaaaa在线看 | 黄色免费在线网址 | 午夜不卡福利 | 黄色a网| 日本老熟妇乱 | 无码人妻丰满熟妇区96 | 国产无套内射又大又猛又粗又爽 | 午夜第一页 | 永久av网站 | 中文字幕2区 | 韩国一级一片高清免费观看 | 成人欧美精品一区二区 | 不用播放器的av网站 | 欧美性大战久久久久久久 | 国产视频分类 | 激情综合网激情 | 日韩午夜免费视频 | 日韩在线中文 | 97人人澡| 浪潮av一区二区三区 | 少妇免费直播 | 老司机成人网 | 免费午夜网站 | 亚洲福利视频一区二区三区 | 在线高清观看免费观看 | 日韩国产欧美一区二区三区 | 日韩免费播放 | 91久精品| 求毛片网站 | 亚洲欧美日韩高清 | 日本xxxxxxxxx18 | 啪啪网免费 | 干干天天 | 欧美巨乳在线 | 色婷婷综合久久久久中文字幕 | 日韩精品电影一区二区三区 | 国产三级做爰高清在线 | 久久久久国产精品人妻 | 美女光屁股视频 | 久久人人爽人人 | 日韩精品乱码久久久久久 | 婷婷资源网 | 精品一区二区三区免费观看 | 国产精品9 | 69xav| 日本波多野结衣在线 | 天堂国产 | 男生和女生靠逼视频 | 久久久久久久久久久av | 亚洲一区二区三区四区 | 国产露脸91国语对白 | 人妻精品一区二区在线 | 狠狠的日 | 国产精品自拍一区 | 国产电影一区二区三区 | 91国产在线免费观看 | 成人午夜电影网站 | 国产乱淫片视频 | 亚洲自拍偷拍图 | 色偷偷免费费视频在线 | 婷婷麻豆 | 伊人伊人伊人 | 久久久久一区二区 |