前言
除了使用 PHP 內建的特性外,還可以用第三方套件擴展 PHP 的功能,以節省開發程式的時間。本文介紹 PHP 社群裡常見的第三方套件管理軟體。
對於初學 PHP 的讀者來說,本文的內容可能不會馬上用到。如果暫時用不到第三方套件,可以先略過本文,之後需要時再回頭讀即可。
常見的套件管理程式
以下是 PHP 常見的套件管理軟體:
Composer 是參考 Node.js 社群的 NPM 所做的套件管理程式。特色是每個 PHP 專案各自局部安裝套件,有獨立的相依套件清單,易於管理套件版本。之後要異地重建相依套件相對容易。
PEAR 則是早期使用的套件管理程式。這個軟體走傳統路線,採用全域安裝的方式來安裝套件。PECL 則是用來編譯及安裝延伸套件。這兩者皆為 PEAR 專案的套件管理程式。
GNU/Linux 的系統套件管理程式會預包好一些熱門的 PHP 套件,就可以繞過上述套件管理程式,直接安裝套件。但透過這種方式安裝的套件版本可能會略舊,而且僅限常見的套件才可用這種方式安裝。
安裝 Composer
Composer 提供官方腳本來安裝該程式。使用 curl(1)
或 wget(1)
下載該腳本後以 PHP 執行該腳本即可安裝 Composer。參考以下指令:
$ curl -o composer-setup.php https://getcomposer.org/installer
$ php composer-setup.php --install-dir=$HOME/bin --filename=composer
建立 Composer 專案
將工作目錄 (working directory) 移到專案所在的根目錄:
$ cd path/to/myapp
這時候專案目錄應該是空的。
使用以下指令來初始化專案:
$ composer init
這時候 Composer 會進入交互模式,詢問使用者數個問題。這裡來一一觀看這些問題。
設定該套件的名稱:
This command will guide you through creating your composer.json config.
Package name (<vendor>/<name>) [user/myapp]:
預設是 系統使用者/目錄
的組合,可再自行修改。
對套件做簡要的描述:
Description []: Next awesome Composer package
設定套件的主要作者:
Author [User <user@example.com>, n to skip]:
安裝套件時,用來過濾套件的穩定度:
Minimum Stability []:
常見的詞彙有 stable
、dev
等。可參考這裡的說明。
設定專案的形態:
Package Type (e.g. library, project, metapackage, composer-plugin) []: project
預設的專案形態是 library
(函式庫),因為 Composer 是用來寫套件的工具。如果要寫網頁程式,這時候專案不是 library
,可以用 project
來代替。
選擇專案的授權:
License []: MIT
除非有明確的理由,儘量不要選 GPL 系的授權,因為這類授權具有感染性。MIT 是個不錯的選擇。反正日後可以再改授權。
設置專案的相依套件:
Define your dependencies.
Would you like to define your dependencies (require) interactively [yes]? no
Would you like to define your dev dependencies (require-dev) interactively [yes]? no
若一開始還不確定會用到那些套件,先略過無妨。日後有需要時,可再逐一增加相依套件。
最後 Composer 會向使用者確認設置是否正確:
{
"name": "ec2-user/myapp",
"description": "Next awesome Composer package",
"type": "project",
"license": "MIT",
"authors": [
{
"name": "User",
"email": "user@example.com"
}
],
"require": {}
}
Do you confirm generation [yes]?
其實 Composer 的設定檔是 JSON 文件,事後手動編輯相當簡單,所以直接按確定即可。下一節會介紹 Composer 專案的架構。
Composer 專案的架構
PHP 是相當自由的語言,沒有什麼制式的專案架構。這裡用 tree(1)
來觀看一個假想的 Composer 專案架構:
$ tree . -a -L 1
.
├── .git
├── .gitignore
├── LICENSE
├── README.md
├── TODO
├── composer.json
├── composer.lock
├── scripts
├── src
├── vendor
└── www
composer.json 是 Composer 的主設定檔。除了專案的元資料 (metadata) 外,還有專案的相依套件清單。composer.lock 則是用來指定相依套件的版本,才不會因套件版本改變造成軟體運行出錯。
vendor 是放置 Composer 相依套件的目錄。使用者不應該去手動編輯該目錄內的東西。由於 vendor 內的東西可輕易地從網路上下載,不應將 vendor 存入軟體庫。使用 Git 等版本控制軟體會將該目錄設到忽略名單。
.git 是 Git 存放軟體庫 (repository) 的地方,使用者不需要去編輯其中的內容。.gitignore 是 Git 所用的忽略清單,可將不需要存在軟體庫的目錄或檔案排除。這裡有一份 Composer 專案所用的清單,有需要的讀者可以參考一下。
src 是儲存 PHP 腳本的目錄,網頁程式上線時不會對外公開的腳本會放在這個目錄。相對來說,www 則是用來儲存會對外公開的 PHP 腳本。網頁程式上線時,會將程式的根目錄設在 www 而非專案的根目錄。在寫 PHP 程式時,要有明確的意識,將對外公開及內部使用的腳本分開。
scripts 或 tools 存放一些工具程式。這些小工具不一定是 PHP 腳本,有可能是 shell 腳本或其他語言的腳本。這些工具僅為內部使用。
如果 PHP 專案的產出是命令列程式,可以把對外的程式放在 bin 。該目錄的腳本不一定要是 PHP 命令稿,可以用 shell 腳本,然後在此 shell 腳本內呼叫實際要執行的 PHP 命令稿。
由於 PHP 的專案架構相當自由,如果在網路上看到不同的專案架構不要太訝異。要試著去適應不同專案的架構,對追蹤程式碼會有所幫助。
新增 Composer 套件到專案
專案的相依套件分為生產環境用和開發環境用兩種。前者是 PHP 網頁程式在實際上線時會用到的套件。後者則是僅在開發時期會用到的套件。
以下範例指令安裝 Parsedown。這是將 Markdown 轉為等效 HTML 的套件:
$ composer require erusev/parsedown
在預設情境下,相依套件視為生產環境用。如同本例。
以下範例指令安裝 PHPMD。這是靜態程式碼檢查工具:
$ composer require phpmd/phpmd --dev
程式上線時,不會用到程式碼檢查工具,不應該把此套件劃分在生產環境。故加上額外的 --dev
參數,這時候套件視為開發環境用。
安裝 Composer 套件
使用以下指令即可安裝相依套件:
$ composer install
這個指令真正好用之處在於異地重建環境。在另一台電腦拷貝軟體庫後,用這行指令馬上可以安裝相同的相依套件。
若是在生產環境時,不需要開發環境用套件,則改用以下指令:
$ composer install --no-dev
在 PHP 程式中引入 Composer 套件
使用 Composer 安裝套件後,不需逐一引入個別套件,只要直接引入專案中的 vendor/autoload.php 命令稿,就會自動引入所有的 Composer 套件。以下是一個實例:
/* Change the path accordingly. */
require_once __DIR__ . "/../vendor/autoload.php";
實際上路徑會隨專案結構而改變,不要原封不動照抄本段程式碼。
安裝 PEAR
使用系統套件管理程式
在 Ubuntu 下執行此指令以安裝 PEAR:
$ sudo apt install php-pear
在 CentOS 下執行此指令以安裝 PEAR:
$ sudo dnf install php-pear
在 openSUSE 下執行此指令以安裝 PEAR:
$ sudo zypper install php7-pear
使用上游安裝程式
如果不想用系統提供的 PEAR,也可以直接從上游安裝。執行以下指令來安裝 PEAR:
$ wget https://pear.php.net/go-pear.phar
$ php go-pear.phar
設置 PEAR 的檔案階層:
Below is a suggested file layout for your new PEAR installation. To
change individual locations, type the number in front of the
directory. Type 'all' to change all of them or simply press Enter to
accept these locations.
1. Installation base ($prefix) : /home/user/pear
2. Temporary directory for processing : /tmp/pear/install
3. Temporary directory for downloads : /tmp/pear/install
4. Binaries directory : /home/user/pear/bin
5. PHP code directory ($php_dir) : /home/user/pear/share/pear
6. Documentation directory : /home/user/pear/docs
7. Data directory : /home/user/pear/data
8. User-modifiable configuration files directory : /home/user/pear/cfg
9. Public Web Files directory : /home/user/pear/www
10. System manual pages directory : /home/user/pear/man
11. Tests directory : /home/user/pear/tests
12. Name of configuration file : /home/user/.pearrc
1-12, 'all' or Enter to continue:
沒有特別理由的話,使用預設的階層即可。
詢問是否要修改 php.ini :
WARNING! The include_path defined in the currently used php.ini does not
contain the PEAR PHP directory you just specified:
</home/user/pear/share/pear>
If the specified directory is also not in the include_path used by
your scripts, you will have problems getting any PEAR packages working.
Would you like to alter php.ini </etc/php7/cli/php.ini>? [Y/n] :
實際上,我們在安裝 PEAR 時,是使用一般使用者安裝,所以無法更動系統檔案。之後要再手動修改 php.ini :
WARNING: Cannot write to /etc/php7/cli/php.ini, but php.ini was successfully created
at </home/user/pear/php.ini-gopear>. Please replace the file </etc/php7/cli/php.ini> with
</home/user/pear/php.ini-gopear> or modify your php.ini by adding:
include_path=".:/home/user/pear/share/pear:/usr/share/php7:/usr/share/php7/PEAR"
安裝 PEAR 套件
使用 pear install
指令即可安裝 PEAR 套件。像是以下指令:
$ pear install Math_BigInteger
Install PECL
PECL 是 PEAR 的一部分,在安裝 PEAR 時就會一併安裝。但 openSUSE 套件切比較細,要另行安裝:
$ sudo zypper php7-pecl
安裝 PECL 套件
使用 pecl install
指令即可安裝延伸套件。像是以下指令:
$ sudo pecl install ast
還要在 php.ini 中加入相對應的設置:
extension=ast.so
以系統管理程式安裝 PHP 套件
常見的延伸套件,GNU/Linux 系統的官方團隊會另行打包,就不需要透過前述方式來安裝。像是以下指令:
$ sudo apt install php-mbstring
但系統套件所提供的 PHP 套件的版本可能會略舊,安裝前要確認一下是否符合專案需求。