《現代 PHP》學習筆記(十一):使用元件

前言

本文為《現代 PHP》一書的學習筆記。

環境

  • Windows 10
  • XAMPP 3.2.2

使用元件

  1. Packagist 是使用者可以找到 PHP 元件的地方,而 Composer 是使用者安裝 PHP 元件的方法。
  2. Composer 是 PHP 元件的相依性管理者,在命令列環境下使用。
  3. PHP Framework Interoperability Group 建立了 PSR-0 標準(已被 PSR-4 取代),建議了組織程式碼到名稱空間和檔案系統目錄的方式,讓程式碼可以兼容於一個標準的自動載入器實作方式。

Composer

至官方網站手動下載安裝,或輸入指令下載安裝。

1
2
3
4
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

元件版本

每個元件都可以有多個版本開放使用。

現代的 PHP 元件使用語意化版本命名方式(Semantic Versioning),包含三個編號,並以「.」字元區隔,例如 5.6.21

  • 第一個數字 5 代表主要發行編號,一旦 PHP 元件的更新破壞了跟從前版本的相容性,主要發行編號就會增加。
  • 第二個數字 6 代表次要發行編號,一旦 PHP 元件的更新兼容於從前版本,次要發行編號就會增加。
  • 第三個數字 21 代表補丁發行編號,一旦 PHP 元件的更新修復版本的相容性問題,補丁發行編號就會增加。

Composer 會自行判斷每個元件的最穩定版本編號,舉例來說,如果要安裝 Flysystem 元件,只需執行以下命令:

1
composer require league/flysystem

版本鎖定

composer.lock 檔會列出專案中使用的所有 PHP 元件以及版本編號,將專案有效鎖定在特定的 PHP 元件版本中。

使用 composer install 命令安裝元件時,Composer 會先依照 composer.lock 檔列出的版本編號進行下載,如果不存在 composer.lock 檔,Composer 會通過composer.json 檔去下載最新的穩定版本的元件。

如果需要更新元件的版本,使用 composer update 命令。

自動載入元件

Composer 下載元件的同時,也為專案相依性元件建立了兼容於 PSR 的自動載入器。

Composer 的自動載入器是 vendor 目錄中的 autoload.php 檔,當 Composer 下載每個 PHP 元件時,Composer 會解析每個元件自身的 composer.json 檔,判斷該元件要如何被自動載入。

實作

接下來,實際建立一個使用元件的 PHP 應用程式,這個應用程式會從 CSV 檔中掃描 URL 並回報所有可使用的 URL。

這個應用程式需要發送一個 HTTP 請求到每個 URL,如果 URL 回傳的 HTTP 回應狀態碼大於 400,將發送這些不良的 URL 到標準輸出。

此專案將是一個命令列應用程式,CSV 檔的路徑是唯一的命令列參數。

1
php scan.php /path/to/urls.csv

當要開始一個新的 PHP 專案時,先決定可以由哪些現存的原件來完成。

scan.php 腳本會用來開啟並疊代 CSV 檔,所以可以使用 league/csv 元件,還需要傳送 HTTP 請求給 CSV 檔中的每個 URL,因此可以使用 guzzle/guzzle 元件。

1
2
composer require league/csv
composer require guzzle/guzzle

這些指令會下載元件至專案最上層目錄的 vendor 目錄,同時建立 composer.jsoncomposer.lock 檔。

範例:4-1:URL 掃描器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
require 'vendor/autoload.php'; // 使用 Composer 自動載入器

$client = new \GuzzleHttp\Client(); // 實例化 Guzzle HTTP 客戶端

$csv = \League\Csv\Reader::createFromPath($argv[1]); // 打開 CSV 檔

// 疊代 CSV 檔
foreach ($csv as $csvRow) {
try {
// 發送 HTTP 請求
$httpResponse = $client->get($csvRow[0]);

// 確認回應狀態碼是否大於 400
if ($httpResponse->getStatusCode() >= 400) {
throw new \Exception();
}
} catch (\Exception $e) {
// 印出回應狀態碼大於 400 的 URL
echo $csvRow[0] . PHP_EOL;
}
}
  • $argv 是傳遞給腳本的參數陣列。

執行 scan.php 腳本。

1
php scan.php /path/to/urls.csv
  • 第一個參數是腳本文件名。
  • 第二個參數是 CSV 檔的路徑。

Composer 與私人儲存庫

Composer 同時也管理儲存庫(repository)需要認證的私人 PHP 元件。當執行 composer installcomposer update 命令時,如果元件的儲存庫需要認證,Composer 會要求使用者憑證安裝,同時詢問是否要將此證明儲存至本地的 auth.json 檔。

一個 auth.json 檔的範例如下:

1
2
3
4
5
6
7
8
{
"http-basic": {
"example.org": {
"username": "your-username",
"password": "your-password"
}
}
}
  • 此檔不該被版本控制。

如果不要 Composer 主動詢問認證,可以使用以下命令:

1
composer config http-basic.example.org your-username your-password
  • http-basic 是讓 Composer 知道使用者給定一個領域名稱作為認證的目標。
  • example.org 主機名稱指定了包含私有元件的遠端機器。

可以利用 --global 來儲存全域性證明,會使本地機器的所有專案都以此認證。

1
composer config --global http-basic.example.org your-username your-password
  • 全域性證明儲存在 ~/.composer 中,如果是 Windows 環境,則儲存在 %APPDATA%/Composer 中。

參考資料

  • Josh Lockhart(2015)。現代 PHP。台北市:碁峯資訊。