php多進程並發控制的測試用例,php解決並發問題的幾種實現

本文目錄一覽:

thinkphp怎麼用phpunit寫測試用例

測試用例

本例中,根目錄的index.php的配置如下:

?php    

define(‘APP_NAME’, ‘example’);    

define(‘APP_PATH’, ‘../example/’);    

define(‘APP_PHPUNIT’, false);    

define(‘APP_DEBUG’, true);    

require(‘../ThinkPHP/ThinkPHP.php’);    

?

首次訪問之後,生成以下目錄結構:

在example站點中新建文件夾,命名為“Testcase”。

測試Model

創建HelloModel.class.php:

?php    

     

class HelloModel extends Model    

{    

    public function sayHello()    

    {    

        print ‘Hello’;    

        return ‘Hello’;    

    }    

}

在Test文件夾中新建Test.php文件作為PHPUnit,其中注意require ThinkPHP作為初始化框架環境,另外在Think.class.php中,修改

start()函數中,App::run()為 !APP_PHPUNIT App::run();

該區分站點運行與測試用例。

?php    

define(‘APP_NAME’, ‘example’);    

define(‘APP_PATH’, ‘./../../example/’);    

define(‘APP_PHPUNIT’, true);    

require(‘./../../ThinkPHP/ThinkPHP.php’);    

class TestSayHello extends PHPUnit_Framework_TestCase {    

     

    public function setUp() { }    

     

    public function tearDown(){ }    

     

}

在TestSayHello中加入測試用例:

public function testHelloModel()    

{    

    $hello = D(‘Hello’);    

    $this-assertTrue( $hello-sayHello(‘Hello’) == ‘Hello’);    

}

測試Action

修改IndexAction.class.php如下:

?php    

class IndexAction extends Action    

{    

    public function index()    

    {    

        $hello = D(“Hello”);    

        return $hello-sayHello();    

    }    

}

瀏覽器訪問Index效果:

在TestSayHello中加入測試用例:

public function  testHelloAction()    

{    

    $hello = new IndexAction();    

    $this-assertTrue($hello-index() == ‘Hello’);    

}

運行效果

運行Test.php效果如下:

Test通過,至此給ThinkPHP加上了單元測試。

php 高並發解決思路解決方案

php 高並發解決思路解決方案,如何應對網站大流量高並發情況。本文為大家總結了常用的處理方式,但不是細節,後續一系列細節教程給出。希望大家喜歡。

一 高並發的概念

在互聯網時代,並發,高並發通常是指並發訪問。也就是在某個時間點,有多少個訪問同時到來。

二 高並發架構相關概念

1、QPS (每秒查詢率) : 每秒鐘請求或者查詢的數量,在互聯網領域,指每秒響應請求數(指 HTTP 請求)

2、PV(Page View):綜合瀏覽量,即頁面瀏覽量或者點擊量,一個訪客在 24 小時內訪問的頁面數量

–註:同一個人瀏覽你的網站的同一頁面,只記做一次 pv

3、吞吐量(fetches/sec) :單位時間內處理的請求數量 (通常由 QPS 和並發數決定)

4、響應時間:從請求發出到收到響應花費的時間

5、獨立訪客(UV):一定時間範圍內,相同訪客多次訪問網站,只計算為 1 個獨立訪客

6、帶寬:計算帶寬需關注兩個指標,峰值流量和頁面的平均大小

7、日網站帶寬: PV/統計時間(換算到秒) * 平均頁面大小(kb)* 8

三 需要注意點:

1、QPS 不等於並發連接數(QPS 是每秒 HTTP 請求數量,並發連接數是系統同時處理的請求數量)

2、峰值每秒請求數(QPS)= (總 PV 數*80%)/ (六小時秒數*20%)【代表 80%的訪問量都集中在 20%的時間內】

3、壓力測試: 測試能承受的最大並發數 以及測試最大承受的 QPS 值

4、常用的性能測試工具【ab,wrk,httpload,Web Bench,Siege,Apache JMeter】

四 優化

1、當 QPS 小於 50 時

優化方案:為一般小型網站,不用考慮優化

2、當 QPS 達到 100 時,遇到數據查詢瓶頸

優化方案: 數據庫緩存層,數據庫的負載均衡

3、當 QPS 達到 800 時, 遇到帶寬瓶頸

優化方案:CDN 加速,負載均衡

4、當 QPS 達到 1000 時

優化方案: 做 html 靜態緩存

5、當 QPS 達到 2000 時

優化方案: 做業務分離,分布式存儲

五、高並發解決方案案例:

1、流量優化

防盜鏈處理(去除惡意請求)

2、前端優化

(1) 減少 HTTP 請求[將 css,js 等合併]

(2) 添加異步請求(先不將所有數據都展示給用戶,用戶觸發某個事件,才會異步請求數據)

(3) 啟用瀏覽器緩存和文件壓縮

(4) CDN 加速

(5) 建立獨立的圖片服務器(減少 I/O)

3、服務端優化

(1) 頁面靜態化

(2) 並發處理

(3) 隊列處理

4、數據庫優化

(1) 數據庫緩存

(2) 分庫分表,分區

(3) 讀寫分離

(4) 負載均衡

5、web 服務器優化

(1) nginx 反向代理實現負載均衡

(2) lvs 實現負載均衡

如何使用ab對WebSocket服務器做並發性能測試

Apache服務器自帶了ab壓力測試工具,可以用來測試網站性能,使用簡單方便。

工具/原料

Apache

方法/步驟

打開Apache服務器的安裝路徑,在bin目錄中有一個ab.exe的可執行程序,就是我們要介紹的壓力測試工具。

在Windows系統的命令行下,進入ab.exe程序所在目錄,執行ab.exe程序。注意直接雙擊無法正確運行。

執行ab命令成功後,可以看到如圖提示。該幫助很清楚詳細的介紹了ab的用法以及各個參數的含義。

ab 的用法是:ab [options] [http://]hostname[:port]/path

例如:ab -n 5000 -c 200

上例表示總共訪問這個腳本5000次,200並發同時執行。

ab常用參數的介紹:

-n :總共的請求執行數,缺省是1;

-c: 並發數,缺省是1;

-t:測試所進行的總時間,秒為單位,缺省50000s

-p:post時的數據文件

-w: 以html表的格式輸出結果

執行測試用例:ab -n 1000 -c 100 -w c:\1.html

上面的測試用例表示100並發的情況下,共測試訪問index.php腳本1000次,並將測試結果保存到c:\1.html文件中。

測試報告如圖,可知在該100並發訪問的情況下,共測試訪問1000次,失敗了852次。可知該腳本在此環境無法滿足100並發訪問的要求。

修改參數繼續測試。測試並發50和30兩種情況,由測試報告得知,在並發訪問降到30時,錯誤的訪問數降為39。

步驟閱讀

用PHP 編寫支持高並發的網站,需要做什麼處理

一般來說,解決WEB高並發的有效手段都是採用可線性擴展的多層分布式架構,

我生產項目的架構是這樣的,就在這裡拋磚引玉一下。

Webserver (Nginx) :這一層是可以輕鬆分布式部署的,結合智能DNS解析可以簡易地防止單點故障、實現區域訪問加速,結合LVS很容易實現負載均衡。這一層主要是負責處理靜態請求和轉發PHP請求至第二層的PHP處理節點,至於靜態資源地址()可以單獨拿出來部署,或者直接使用商用的雲存儲服務(國內七牛不錯,國外有Amazon S3)

PHP處理節點:一個節點其實就是一個監聽特定端口的系統進程,webserver的請求通過負載均衡器(我用的AWS的loadbalancer)進行分發,很好實現分布式和負載均衡。我現在用的還是php自帶的php-fpm,其實facebook出的hhvm性能非常強悍,但是還不能100%通過我項目的單元測試,等hhvm成熟過後可以平滑替換

高速緩存:用的memcached,這一層的作用主要是減輕數據庫IO和加快熱數據訪問,緩存策略與程序耦合度較高,不贅述,但簡單地說有兩種方式,一種是在程序的全局層面加一個緩存處理,這種方法代碼耦合度低,但是有效命中率不高,有些項目不一定適應,另一種是在具體的數據存取處加緩存處理,這種辦法程序耦合度較高,但是緩存命中率非常高,幾乎沒有無效緩存存在,我用的是這種。

數據庫 :我現在的項目數據規模不大,暫時只用了單台數據庫,但是程序邏輯上已做好了數據庫線性擴展的準備。其實數據庫層的擴展是老生常談了,常用手段是分庫分表,這一塊需要在前期的代碼就打下基礎,另外更平滑地手段是使用中間件,比如360的Atlas,阿里巴巴的cobar,淘寶的TDDL,中間件可以在不大範圍變更代碼的情況下擴展,但是具體的使用場景還是有限的,具體項目還需單獨考察。

其他:根據不同的項目,架構還可以選擇性地使用隊列,我現在用的beantalkd,Redis也是一個很好的選擇。隊列常用的使用環境是郵件發送和站內消息推送上面,但是在某些場景下也可以作為核心數據庫的緩衝,對應對大並發或者突發性流量也是不錯的選擇

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/302859.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-12-31 11:48
下一篇 2024-12-31 11:48

相關推薦

  • Python官網中文版:解決你的編程問題

    Python是一種高級編程語言,它可以用於Web開發、科學計算、人工智能等領域。Python官網中文版提供了全面的資源和教程,可以幫助你入門學習和進一步提高編程技能。 一、Pyth…

    編程 2025-04-29
  • 如何解決WPS保存提示會導致宏不可用的問題

    如果您使用過WPS,可能會碰到在保存的時候提示“文件中含有宏,保存將導致宏不可用”的問題。這個問題是因為WPS在默認情況下不允許保存帶有宏的文件,為了解決這個問題,本篇文章將從多個…

    編程 2025-04-29
  • Java Thread.start() 執行幾次的相關問題

    Java多線程編程作為Java開發中的重要內容,自然會有很多相關問題。在本篇文章中,我們將以Java Thread.start() 執行幾次為中心,為您介紹這方面的問題及其解決方案…

    編程 2025-04-29
  • JDK Flux 背壓測試

    本文將從多個方面對 JDK Flux 的背壓測試進行詳細闡述。 一、Flux 背景 Flux 是 JDK 9 對響應式編程的支持。它為響應式編程提供了一種基於推拉模型的方式,以支持…

    編程 2025-04-29
  • Python爬蟲亂碼問題

    在網絡爬蟲中,經常會遇到中文亂碼問題。雖然Python自帶了編碼轉換功能,但有時候會出現一些比較奇怪的情況。本文章將從多個方面對Python爬蟲亂碼問題進行詳細的闡述,並給出對應的…

    編程 2025-04-29
  • 如何通過jstack工具列出假死的java進程

    假死的java進程是指在運行過程中出現了某些問題導致進程停止響應,此時無法通過正常的方式關閉或者重啟該進程。在這種情況下,我們可以藉助jstack工具來獲取該進程的進程號和線程號,…

    編程 2025-04-29
  • NodeJS 建立TCP連接出現粘包問題

    在TCP/IP協議中,由於TCP是面向字節流的協議,發送方把需要傳輸的數據流按照MSS(Maximum Segment Size,最大報文段長度)來分割成若干個TCP分節,在接收端…

    編程 2025-04-29
  • 如何解決vuejs應用在nginx非根目錄下部署時訪問404的問題

    當我們使用Vue.js開發應用時,我們會發現將應用部署在nginx的非根目錄下時,訪問該應用時會出現404錯誤。這是因為Vue在刷新頁面或者直接訪問非根目錄的路由時,會認為服務器上…

    編程 2025-04-29
  • Python數據類型分為哪幾種

    Python作為一門非常靈活的編程語言,有着非常豐富的數據類型。Python的數據類型可以分為數字類型、字符串類型、列表類型、元組類型、字典類型和集合類型六種。 一、數字類型 Py…

    編程 2025-04-29
  • 如何解決egalaxtouch設備未找到的問題

    egalaxtouch設備未找到問題通常出現在Windows或Linux操作系統上。如果你遇到了這個問題,不要慌張,下面我們從多個方面進行詳細闡述解決方案。 一、檢查硬件連接 首先…

    編程 2025-04-29

發表回復

登錄後才能評論