而可以做到 Load Balancer 的工具也不少,但如果只是單純要做 Web 的 Load Balance 的話,用 Nginx 內建的 Load Balancer 就相當好用,而且設定上簡單。
既然這次是要用 Nginx 當 Load Balancer ,所以在 Load Balance 那台當然就一定是要先裝好 Nginx 囉,Web 1、Web 2 要裝 Nginx 或 Apache 都可以,這邊還是以 Nginx 當設定範例,先假設三台都裝好 Nginx 了。
Nginx Load Balancer 有三種模式
以上三種模式也都可以自行設定權重(weight),讓效能較好的 Server 吃比較更多的負載。
依據自行的環境設定,這邊主要是 server_name 不能是對外的那一個,因為那個需要給 Load Balancer ,但如果此 Server 只會有一個 Web Service 那也可以不設定 server_name。
|
|
|
|
如果 Web Server 1 一樣,依據自行的環境設定。
|
|
|
|
|
|
|
|
使用 upstream 來設定要做分流的 Server Name、IP,而 weight 則是設定權重,以上面範列表示每五個 Request 裡會有三個跑去 Web 1,有兩個跑去 Web 2,使用此方式來讓效能較好的 Server 吃多一點流量。
而設定檔的 server 區段則跟一般設定 Web Server 幾乎一樣,不一樣的地方則是透過 proxy pass 的方式將 Request 導過去,而導向的網址則是在 upstream 所自訂的名稱 “myapp”。
這邊另外設定三個 proxy_set_header 是因為透過 Load Balancer 重導了,那對 Web 1 以及 Web 2 來說, Client IP 會是 Load Balancer 的 IP ,這樣對於需要抓 Client IP 是錯誤的,所以利用 proxy_set_header 將真正的 Client IP 設定在 Header 。
以上是使用 round-robin 這個預設的方式,如果要使用另外兩個機制的話只要在 upstream 裡面加上一行設定值即可。
least-connected
|
|
ip-hash
|
|
另外正常情況只會有 Load Balancer 那台有設定 DNS 且對外,所以同時需要在 Load Balancer 那台上設定 hosts ,這樣 Nginx 才會知道要導向哪邊,但如果做分流的 Server 只有一個 Web Service ,那也可以在 upstream 直接使用 IP 。
|
|
加入
|
|
經過以上簡單的設定後,一個 Load Balancer 機制就完成了,可以使用 ab test 來打 Load Balancer 那台,同時去 Web 1、Web 2 看 access log ,成功的話會發現兩台 Web 會一起分擔 ab 打過來的 Request 。
]]>而這邊來說一下如何直接在單一一個 Collection 下 Send 來取得 Token 並且呼叫 API 。
在 Postman 裡,每個 Collection 都有自己的 Pre-request Script ,而這個 Script 執行的時間點顧名思義就是在此 Collection Send 之前會先處理的 Script ,因此現在主要想要先取得 Token 後再做 Send ,所以就要把取得 Token 的動作放在 Pre-request Script 來處理了。
首先要先確認 Token API 的呼叫方式以及回傳格式。
此範列以 form-data 方式 呼叫 signin ,並傳送 user、password ,回傳 JSON 資料,且有 token 的參數。
此 API 將取得會員資料,但必需要先有 Token 才能取得,會判斷 Token 是否有效並回傳該會員資料。
我們可以先手動將 Token Copy 到 Headers 的 Authorization ,並且送出確認 API 是可以正常
Postman 提供了 sendRequest 這個方法,讓我們可以在利用這個方法來先呼叫 Token API 來取得 Token 。
開始在 Pre-request Script 撰寫 Script 來自動取得 Token 並讓 Authorization 自動取讀。
|
|
sendRequest 的使用方式蠻簡單的,跟 jQuery 的 $.ajax 有點像。
而回傳為 JSON 格式,所以在 response 後以 .json() 的方法解析 JSON ,並將回傳的 Token 儲存到 Postman 的環境變數裡。
上面 Pre-request Script 裡已經將取得的 Token 以 signin_token 名稱儲存到環境變數裡,現在可以先設定讓 Authorization 取讀環境變數。
以雙大刮號包著變數名稱,這樣在 Send 出去時 Postman 會去讀取環境變數。
這邊故意將傳送的 Token 以 signin_token 變數回傳,來表示每次有取得到新的 Token 。
先透過 Pre-request Script 呼叫可以取得 Token 的 API ,並且將 Token 存到環境變數,然後在需要傳送 Token 的地方去設定讀取環境變數,這樣就可以達到在單一一個 Collection 裡做到達要 Token 才能呼叫的 API 了。
]]>雖然黑白也是可以,但建議你在運行測試時啟用彩色輸出,與交通號誌類似,簡單的綠色、紅色輸出可以幫助加快你的開發工作流程,我們對顏色的反應比文字快。
|
|
有時你需要在執行測試之前要載入某些檔案,一個完美的例子在執行任何測試之前確保載入 Composer 的 autoload 腳本,雖然可以在每個 Test Class 開頭手動載入,但最好還是利過 PHPUnit 的 bootstrap 設定,如下:
|
|
除了預設的測試報告,PHPUnit 還提供兩個選項 –tap 以及 –testdox 。
TAP 是 Test Anything Protocol 的縮寫
|
|
TestDox 格式以稍微不同的方式,它會讀取測試 Methods 名稱,並將依照 camelCase 名稱轉換為可讀的句子,例如 testRedirectsToHomePageOnSave 會轉換為 Redirects To Home Page On Save 。
這有助於了解哪些測試成功的俯視圖以及提供文件,這是寫測試的一個優點:免費文件。
如果你以為每次使用 PHPUnit 都要輸入這麼多選項,那麼你錯了,並不需要這樣:
|
|
相反的,利用 PHPUnit 讀取配置檔的功能,讓我們回顧一下最簡單的例子,在專案的根目錄中,建立一個 phpunit.xml 的檔案並輸入:
|
|
使用這句,就可以不需要在執行測試時使用 –colors 這個 tag ,讓我們更加利用這個配置檔,使用一些其它的 option
|
|
前兩個屬性已經是你所熟悉的,其餘看個人的選擇,我傾向將所有錯誤、通知、警告轉換為異常,此外,如果一個測試失敗,那麼我想取消剩餘的測試,有些人可能不喜歡,但如果你只關心修復第一個錯誤,那也不需要執行之後數以百計的測試。
依據目前的情況,我們仍然要手動指定路徑,這樣不太好,設置自定義目錄,使用一個
|
|
當你只想測試你所有測試套件裡的某個子集,這種方式可以大大增加靈活度,增加一個專門用於整合測試的測試套件
|
|
當你只想執行 “Integration” 這個測試套件時
|
|
在本書太多數章節,我們只使用一個主測試套件,但在實務上,一定要有系統的建立測試,你不會希望在存檔進行單元測試時執行了驗收測試。
如果你想執行上面所列出來的所有測試,你只需要執行 phpunit 即可。
每次儲存檔案時自動執行測試是一個好的方式,像 Sublime Text 這樣的輕量級編輯器不提供這種功能,但可以安裝一些工具來完成這件事
本書作者介紹是安裝 Ruby 的套件來達到儲檔自動執行測試,但我覺得過程有點麻煩,所以這邊介紹一下 PhpStorm 的 File Watchers 來達到自動執行測試
要自動執行測試之前,先安裝個測試通知套件,方便在自動執行測試後,可以直接通知測試結果
這邊使用 PHPUnit Notifier 這個套件
|
|
安裝完之後,在 phpunit.xml 裡加上監聽
|
|
之後只要再這個專案底下執行測試就會跳出測試結果通知
已經安裝完通知套件後,再來設定 PhpStorm File Watchers 來達到存檔自動執行測試
Name:自訂名稱
File type:選擇 PHP
Scope:選擇監聽範圍
Program:這邊使用 vendor 底下的 phpunit
以上設定完畢之後,PhpStorm 就會依據剛設定的目錄來監聽檔案存檔後是否有異動,有異動則會自動執行剛所設定的 phpunit
]]>在測試 Token Based Authentication API 時,有個麻煩的地方是 Token 是需要透過 API 取得,然後其它 API 使用,但 Token 可能會有 時效性 或 一次性,所以需要手動去取得 Token ,再 Copy Paste 到其他 API 使用,相當的麻煩。
取得 Token
貼上 Token
利用 Postman 提供的 Runner、Pre-request Script、Tests 三個功能搭配,可以解決手動 Copy & Paste 麻煩的問題。
1.在 Login API 的 Tests 寫個簡單的測試,確定此 API 正常回傳 HTTP CODE 200
2.測試是否有回傳 token
3.將 token 丟給 Postman 提供的物件來儲存
到這些 Login API 要處理的動作就完成
1.帶入在 Login API Tests 所設定的變數
2.一樣寫個簡單的測試來確定 API 是可以正常的
到此為止可以手動去 Send Login API,然後不需要自己去 Copy Token,直接再 Send User API,這樣可以吃到 token,但這樣如果遇到一次性 Token 的情況還是有點麻煩,所以可以利用 Runner 的功能。
1.使用 Runner 的前題,需要把一次要跑完的 Request 放在同一個 Collection 或 Folder,並且順序要調整好,Runner 會依序執行。
2.開啟 Runner
3.選擇 Collection 或 Folder
4.執行結果
如果 Login、User 兩隻 API 的 Tests 都有寫正確的話,Runner 結果如果都全部 PASS,那就表示 Token 取得正常、API 回傳值如預期。
]]>PHPUnit 是一個單元測試框架,由 Sebastian Bergmann 所開發。
有幾種方式可以安裝 PHPUnit
可以自由選擇你希望的方式來安裝,不過在本書中會大量利用 Laravel 以及 Composer ,會使用最簡單的途徑,在 Laravel 透過 composer.json 來進行安裝 PHPUnit
什麼是 Composer 呢?Composer 是一個 PHP 的套件管理工具,作為 Laravel 開發人員之前,需要基本了解 Composer 是什麼以及如何使用它
在深入了解 Laravel 之前,讓我們從最基礎開始
建立一個新的資料夾練習,在資料夾裡新增一個 composer.json 的檔案並加入以下
|
|
注意我們並沒有加到 require 中,PHPUnit 只有在開發過程中所需要,我們不需要擔心會在正式服務器上。
下一步是安裝以及任何其它依賴的套件,使用 command line
假設已將 Composer 進行 global 安裝
|
|
如果一切順利安裝,你可以查看 vendor/bin/phpunit 、 vendor/phpunit ,試試查詢 PHPUnit 的命令列表
|
|
在前一章節使用的方法是需要在每一個項目下透過 Composer 進行安裝 PHPUnit,你也可以將 PHPUnit 做 Global 安裝。
在你的 Home 目錄(或任何地方)建立一個新的資料夾,在資料夾裡新增一個 composer.json 的檔案加入你希望 Global require-dev 的套件並安裝
|
|
接下來將這個資料夾下 vendor/bin 的完整路徑加入到 ~/.bash_profile 或 ~/.zshrc (有使用 oh-my-zsh)
|
|
透過這個方式,PHPUnit 就可以在任何地方所呼叫
前面需要手動建立資料夾、composer.json ,Composer 有提供 global 安裝的方式
|
|
安裝完會在 Home 目錄下建立 .composer 的資料夾,並在 ~/.bash_profile 或 ~/.zshrc (有使用 oh-my-zsh)加入以下
|
|
開始來測試 “hello world”,在這章節,將介紹你第一個 PHPunit assertion,assertTrue
在你的專案下建立 tests 資料夾,並在資料夾下建立一個新檔叫 PracticeTest.php
|
|
執行測試來看它是否可以正常運行
因為我們還沒配置任何設定,所以必需指定一個路徑來進行測試,PHPUnit 會在指定的路徑下尋找測試檔案。
首先,請注意最後一行
這表示一個測試成功了,如果測試失敗,你會看到大寫 F
你將會時常看到測試失敗,所以要去適應它,幸運的是,這個失敗顯示被證明是非常有用的。
以上我們可以看到一個 testHellowWorld 測試失敗,並且是在第八行。
為什麼會有顏色?在下一章會更深入介紹 PHPUnit 的配置選項,在那之前,使用 –colors 就會有顏色顯示
|
|
僅管這是一個簡單的 Class,但有幾個重要並要注意的地方,以下又是一個測試程式
|
|
|
|
希望你會發現 PHPUnit 的 test assertions 相當有可讀性,即使不了解具體細節,也很容易知道在做什麼,所有的 assertions 在 test class 都可使用,在這個例子,我們希望 $greeting 等於 “Hello, World.”
這個 assertTure method 接受兩個參數
|
|
你會發現在 PHPUnit 裡,反向 methods 幾乎可以用,如果你要 assert 這個值為 false,那你可以使用 assertFalse
|
|
在前面的例子中,我們唯一的目標是 assert 一個變數一直等於指定的字串,雖然 assertTrue 可以使用,但在這種情況下,它不是一個最佳可讀的方式,不要忽略測試的可讀性。
這種介紹另一個更適合這個例子的 assertion:assertEquals
|
|
這樣可讀性更好,與大多數的 PHPUnit assertions 一樣,assertEquals 接受三個參數
|
|
assertNotEquals 是一個反向 assertion,並接受相同的參數
如果你想證明兩個值是相等的,那麼明顯的使用 assertEquals 比 assertTrue 更好的選擇,即使兩個都可以使用。
assertEquals 在需要更嚴格的相等比較時會失敗,例如 assert 變數等於 0?
你可以嘗試:
|
|
這樣是可以通過測試,但如果讓變數為 null ,這個測試還是會通過測試
|
|
這這種情況下,當你需要更嚴格的比較(或有效的 ===),那 assertSame 可以做到
|
|
|
|
本書的目的不是教每個 assertion ,但重要的是覆蓋到要點,雖然 PHPUnit 提供了幾十個 assertions ,但你可能會發現,少數幾個就能滿足大多數的測試需求。
假設你有一個名字列表,需要証明該陣列包含一個特定的值,assertTrue 可以處理這個任務,但最好選擇更有可讀性的選項:assertContains 。
|
|
assertContains 的參數值是:
|
|
正如你所知道的,反向 assertion 也是可用的
|
|
有時你需要 assert 陣列裡的 key,而不是 value
|
|
在這個例子中,假設我們需要驗證 $family 裡有包含 “parents”,在這樣的情況下, assertContains 不是正確的選擇
|
|
我們所需要 assert 指定陣列中的一個 key 值,解決方案是 assertArrayHasKey 。
|
|
assertInternalType 用來測試變數的型態
|
|
繼續上一個例子,要 assert 這個 $family 裡 parents 為字串或陣列,我們可以這樣做
|
|
|
|
或是要 assert 的型態是整數
|
|
時常你需要確保變數值是某個 Class 的 Instance(實體),這在 PHPUnit 中透過 assertInstanceOf 很容易做到
|
|
範例
|
|
要確保 $stamp 是 PHP DateTime Class 的 Instance ,我們可以使用以下測試方式
|
|
在單元測試時,重要的是測試你的程式碼中每一個可能的路徑,如果使用太多條件,會讓一個 Class 或 Method 難以測試。
這樣的例子中可能會拋出一個異常,在 PHPUnit 我們使用 doc-blocks 來 assert exceptions .
|
|
這個 doc-blocks 宣告 PHPUnit 應該期望拋出異常,如果沒有,那麼測試就會失敗。
假設一個 Method 如果非數字值傳入應該拋出異常
|
|
請注意,這種情況下,沒有使用 assert ,我們只是加上必要的程式碼,讓這個 Class 發生異常。
雖然可以繼續介面每個 PHPUnit assertion ,但這是不明智的,本章涵蓋少數的 assertions 應該足夠你進行測試了,當你還需要其它功能時,再去查詢文件即可。
接下來在我們開始進行 Laravel 特定的測試之前,我們應該花一些時間來更全面的設定 PHPUnit 配置來滿足我們的需求
]]>http://pecl.php.net/package/oci8
https://pecl.php.net/package/pdo_oci
|
|
or
|
|
|
|
確認
|
|
|
|
最後一行加上
|
|
如為 64bit 版本的則改為 client64,以下全都是
64bit 版本需再設定 link
|
|
|
|
最後加入
|
|
讀取設定
|
|
|
|
|
|
最後一行加上
|
|
讀取設定
|
|
|
|
|
|
建立 ini
|
|
加入
|
|
存檔,查詢
|
|
|
|
|
|
第 10~11 行
|
|
復制改為 11.2
|
|
第 121~123 行
|
|
復制改為 11.2
|
|
存檔
|
|
第 34~36 行
|
|
改為
|
|
|
|
|
|
建立 ini
|
|
加入
|
|
存檔,查詢
|
|
目的是將 project 底下的 .git 備份出去
有時會想要測試一些 git 指令,卻又怕把 repo 搞亂、搞壞
所以可以先把 .git 備份起來
語法裡有使用 rm -rf 指令,請小心使用
語法裡有使用 rm -rf 指令,請小心使用
語法裡有使用 rm -rf 指令,請小心使用
檔案路徑:~/SourceTree_Actions/backupGitFolder.sh
$1 → 在 SourceTree 使用時,設定讓它帶入 repo path,為了區別不同 product 下的 .git
|
|
|
|
開啟設定介面 SourceTree → Preferences 或 快速鍵 CMD + ,
切換至 Custom Actions
新增 Add
Menu Caption → backupGitFolder
(自訂)
Script to run → bash
(使用 bash 來執行 script)
Parameters → /SourceTree_Actions/backupGitFolder.sh $REPO
script 路徑,且帶入參數 $REPO
新增完後會看到剛新增的項目
因為此 Script 是針對 Repo 來做處理,所以只要在任一個 Commit 上按右鍵即可
右鍵 → Custom Actions → Repository Actions → backupGitFolder
執行完畢後,會出現在 Script 所設定的備份路徑
目的是將先前備份的 .git 還原回 product 裡
測試一些指令後想把先前備份的 .git 還原回來
語法裡有使用 rm -rf 指令,請小心使用
語法裡有使用 rm -rf 指令,請小心使用
語法裡有使用 rm -rf 指令,請小心使用
檔案路徑:~/SourceTree_Actions/restoreGitFolder.sh
$1 → 在 SourceTree 使用時,設定讓它帶入 repo path,為了區別不同 product 下的 .git
|
|
|
|
開啟設定介面 SourceTree → Preferences 或 快速鍵 CMD + ,
切換至 Custom Actions
新增 Add
Menu Caption → restoreGitFolder
(自訂)
Script to run → bash
(使用 bash 來執行 script)
Parameters → /SourceTree_Actions/restoreGitFolder.sh $REPO
script 路徑,且帶入參數 $REPO
新增完後會看到剛新增的項目
|
|
因為此 Script 是針對 Repo 來做處理,所以要在指定的 Repo 上按右鍵
右鍵 → Custom Actions → Repository Actions → restoreGitFolder
這個是報錯的畫面,意思是找不到 git log
目日是將 HEAD 與某個 commit 做差異打包
有時在功能完成後要放到其它環境下時,該環境可能不沒有 GIT,這時會需要做差異打包上傳
檔案路徑:~/SourceTree_Actions/archiveCustomCommit.sh
$1 → 在 SourceTree 使用時,設定讓它帶入自行選擇的 Commit SHA
|
|
|
|
開啟設定介面 SourceTree → Preferences 或 快速鍵 CMD + ,
切換至 Custom Actions
新增 Add
Menu Caption → restoreGitFolder
(自訂)
Script to run → bash
(使用 bash 來執行 script)
Parameters → /SourceTree_Actions/archiveCustomCommit.sh $REPO $SHA
Script 路徑,且帶入參數 \$REPO、\$SHA
新增完後會看到剛新增的項目
因為此 Script 是針對 HEAD 與指定 Commit 來做處理,所以要在指定的 Commit 上按右鍵
右鍵 → Custom Actions → archiveCustomDiffCommit
此範例是要將 ad1e0aa 與 b5fefac 兩個 Commit 的差異做打包
執行完後,會在指定的目錄下看到差異打包檔
如果 Commit 上是有 Tag 的話
此範例是要將 ad1e0aa 與 b5fefac(TestTag) 兩個 Commit 的差異做打包
執行完後,會在指定的目錄下看到差異打包檔,並且使用 Tag 來當檔名
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
可能要執行兩次
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Observium 不接受 IP,所要被被監控主機的IP要先去 /etc/hosts 設定假的 Domain
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
在 [mysqld] 底下設定參數
|
|
|
|
|
|
|
|
|
|
記下 File、Position,要設定到 Slave 主機
在 [mysqld] 底下設定參數
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Slave_IO_Running、Slave_SQL_Running 需為 Yes 才是正常
當 Master or Slave 有做重啟動作時,需回到 Slave 查看 Slave 狀態
|
|