淺談PHP組件、框架以及Composer

来源:https://www.cnblogs.com/a609251438/archive/2019/12/30/12121933.html
-Advertisement-
Play Games

本篇文章主要介紹了PHP組件、框架以及Composer,具有一定的學習價值,感興趣的朋友可以瞭解一下。 什麼是組件 組件是一組打包的代碼,是一系列相關的類、介面和Trait,用於幫助我們解決PHP應用中某個具體問題。例如,你的PHP應用需要收發HTTP請求,可以使用現成的組件如guzzle/guzz ...


本篇文章主要介紹了PHP組件、框架以及Composer,具有一定的學習價值,感興趣的朋友可以瞭解一下。

 

什麼是組件

組件是一組打包的代碼,是一系列相關的類、介面和Trait,用於幫助我們解決PHP應用中某個具體問題。例如,你的PHP應用需要收發HTTP請求,可以使用現成的組件如guzzle/guzzle實現。我們使用組件不是為了重新實現已經實現的功能,而是把更多時間花在實現項目的長遠目標上。

優秀的PHP組件具備以下特性:

  • 作用單一:專註於解決一個問題,而且使用簡單的介面封裝功能
  • 小型:小巧玲瓏,只包含解決某個問題所需的最少代碼
  • 合作:PHP組件之間可以良好合作,組合在一起實現大型項目
  • 測試良好:本身提供測試,而且有充足的測試覆蓋度
  • 文檔完善:應該提供完善的文檔,能讓開發者輕易安裝、理解和使用

組件 vs 框架

我們選擇框架時,要為這個框架的工具投入很多,框架通常會提供大量工具,但卻沒有提供我們所需的某個工具時,痛苦就轉嫁到我們頭上,我們要尋找並集成自定義的PHP庫。把第三方代碼集成到框架中是件難事,因為第三方代碼和框架可能沒有使用相同的介面。

選擇框架時,我們看中的是框架的未來,但是誰又能保證某個框架始終是完成某項工作最好的工具呢?存在多年的大型項目必須有好的表現,而且要時刻做好調整,如果選錯了PHP框架,可能無法做到這一點。較舊的PHP框架可能由於缺乏社區支持而變慢或過時,這些舊框架通常使用過程式代碼編寫,而沒有使用新式的面向對象代碼以及PHP的一些新特性,總之,決定是否使用PHP框架時,要考慮的事情很多。

慶幸的是,Laravel在這些擔憂方面表現良好,因此才能在眾多PHP框架中脫穎而出,從某種意義上來說,Laravel也是個基於組件開發的框架(核心組件是自身的Illuminate庫,功能實現上則大量依賴第三方組件),相比Symfony而言,上手又比較簡單,所以兼具了擴展性和易用性。但是,Laravel也存在一些不足,比如Laravel自身的組件不能輕易解耦,用於Laravel框架之外(但是相信這種狀況會有好轉,比如其資料庫和隊列組件就可以解耦出去)。綜合來看,Laravel仍是一個出色的框架,能幫組我們快速創建強大的應用。

那我們應該使用組件還是框架呢?答案是,使用正確的工具做正確的事,如果能通過一些PHP組件快速實現小型項目,那就使用組件,如果有多個團隊成員開發大型項目,而且能從框架提供的約定准則和結構中受益,那就使用框架(如果是在糾結使用什麼框架,那麼選擇Laravel吧,它不會讓你失望),使用框架能夠引導並加速項目的開發。

使用組件

Packagist

我們在Packagist中查找PHP組件,這個網站用於收集PHP組件,最好的PHP組件在Packagist中都能找到。

比如我們想使用一個http組件用於收發HTTP消息,在搜索框中搜索http,得到的第一個結果就是Guzzle,就用它吧。

Composer

Packagist是查找PHP組件的社區,Composer則是安裝PHP組件的工具。Composer是PHP的依賴管理器,運行在命令行中,你告訴Composer需要哪些組件,Composer會下載並把這些組件自動載入到你的項目中,就這麼簡單。

Composer和Packagist緊密合作,如果你告訴Composer想要使用guzzlehttp/guzzle組件,Composer會從Packagist中獲取guzzlehttp/guzzle組件,找到這個組件的倉庫地址,確定要使用哪個版本,還能找出這個組件的依賴,然後把guzzlehttp/guzzle組件及其依賴下載到你的項目中。

此外,Composer會為項目中的所有PHP組件自動生成符合PSR標準的自動載入器,有效地抽象了依賴管理和自動載入,所以,對PHP社區來說,Composer是最重要的附加工具,沒有之一,想想之前我們要使用諸如include、require、spl_autoload_register來手動實現自動載入的痛苦日子,這一點也不為過。

關於Composer的安裝和使用,這裡不贅述,請參考Composer中文網。

示例項目

下麵我們通過一個示例項目來演示如何使用Composer和組件來開發一個PHP應用,這個應用的作用是掃描一個CSV文件中的URL,找出死鏈,該應用會向每個URL發HTTP請求,如果返回的HTTP狀態碼大於等於400,就把這個死鏈發給標準輸出。這是一個命令行應用,開發好之後,我們會執行這個腳本,傳入csv文件的路徑,在標準輸出中顯示死鏈列表。

安裝組件

開始之前,先看看哪些任務可以使用現有的PHP組件解決:我們需要一個可以迭代處理csv文件數據的組件,此外還要向csv文件中的每個URL發送HTTP請求,因此還需要一個可以發送HTTP請求並檢查HTTP響應的組件。

瀏覽Packagist後,我們找到guzzlehttp/guzzleleague/csv兩個組件,前者用於處理HTTP消息,後者用於處理CSV數據。下麵我們在項目最頂層運行如下命令:

composer require guzzlehttp/guzzle

composer require league/csv

Composer會將依賴安裝到根目錄的vendor目錄下,安裝完成後,會在根目錄下生成composer.jsoncomposer.lock文件:

composer.lock文件中會列出項目使用的所有PHP組件,以及組件的具體版本號,這其實是鎖定了項目,讓項目只能使用具體版本的PHP組件。這樣的好處是,composer會下載這個文件中列出的具體版本,而不管Packagist中可用的最新版本是多少,你應該把composer.lock文件納入版本控制,這樣讓團隊成員使用的PHP版本和你一樣,如果本地開發和伺服器使用的PHP組件版本相同,可以儘量降低由組件版本不同導致的bug。

如果確實要下載最新版本的組件並更新composer.lock,可以使用composer update命令。

自動載入

接下來我們來編寫應用代碼,在根目錄下創建一個scan.php文件,然後在該文件頂部使用require導入Composer創建的自動載入器:

require 'vendor/autoload.php';

Composer創建的自動載入器其實就是個名為autoload.php的文件,保存在vendor目錄中,Composer下載各個PHP組件時,會檢查每個組件的composer.json文件,確定如何載入該組件,得到這個信息後,Composer會在本地為該組件創建一個符合PSR標準的自動載入器。這樣我們就可以實例化項目中的任何PHP組件,這些組件按需自動載入。

編寫代碼

下麵我們正式使用Guzzle和CSV組件編寫scan.php代碼:

//使用composer自動載入器

require 'vendor/autoload.php';

 

//實例Guzzle Http客戶端

$client = new GuzzleHttp\Client();

 

//打開並迭代處理CSV

$csv = League\Csv\Reader::createFromPath($argv[1]);

foreach ($csv as $csvRow) {

    try {

        //發送HTTP GET請求

        $httpResponse = $client->get($csvRow[0]);

 

        //檢查HTTP響應的狀態碼

        if($httpResponse->getStatusCode() >= 400) {

            throw new Exception();

        }

    } catch (Exception $e) {

            //把死鏈發給標準輸出

            echo $csvRow[0] . PHP_EOL;

    }

}

下麵我們在urls.csv中添加一些URL,一行一個,而且至少有一個是死鏈:

然後打開終端,執行scan.php腳本:

php scan.php urls.csv

我們傳入了兩個參數,第一個是腳本文件scan.php的路徑,另一個是CSV文件的路徑。輸出如下:

更多PHP相關知識請關註我的專欄PHP​zhuanlan.zhihu.com


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • Redis安裝(單機及各類集群,阿裡雲) 前言 上周,我朋友突然悄悄咪咪地指著手機上的一篇博客說,這是你的博客吧。我看了一眼,是之前發佈的《Rabbit安裝(單機及集群,阿裡雲》。我朋友很哈皮地告訴我,我的博客被某個Java平臺進行了微信推送。看到許多人閱讀,並認同了我的博客,心理還是很開心的。 好 ...
  • HTTP 協議全稱是超文本傳輸協議(Hypertext Transfer Protocol),這裡面需要理解三個地方:超文本、傳輸、協議,下麵就從 HTTP 協議的歷史講起。 20 世紀 60 年代,美國國防部高等研究計劃署(ARPA)建立了 ARPA 網,它有四個分佈在世界各地的節點,被認為是互聯 ...
  • 通過Java日期時間API系列10 Jdk8中java.time包中的新的日期時間API類的DateTimeFormatter, 可以看出java8的DateTimeFormatter完美解決了SimpleDateFormat線程安全問題。下麵是關於DateTimeFormatter的使用實例,包括 ...
  • 系統自身的error處理一般是 errors.New()或fmt.Errorf()等,對一些需要複雜顯示的,不太友好,我們可以擴展下error。 error在標準庫中被定義為一個介面類型,該介面只有一個Error()方法 那麼,自定義error只要擁有Error()方法,就實現了error介面,這裡 ...
  • 場景 Dubbo環境搭建-管理控制台dubbo-admin實現服務監控: https://blog.csdn.net/BADAO_LIUMANG_QIZHI/article/details/103624846 Dubbo搭建HelloWorld-搭建服務提供者與服務消費者並完成遠程調用(附代碼下載) ...
  • 本系列筆記主要基於《深入理解Java虛擬機:JVM高級特性與最佳實踐 第2版》,是這本書的讀書筆記。 在 Java 虛擬機記憶體區域中,除了程式計數器外,其他幾個記憶體區域都可能會發生OutOfMemoryError,這次通過一些代碼來驗證虛擬機各個記憶體區域存儲的內容。 在實際工作中遇到記憶體溢出異常時, ...
  • 一、add 將傳進來的參數添加到原來的值上面。這個過濾器會嘗試將“值”和“參數”轉換成整形然後進行相加。如果轉換成整形過程中失敗了,那麼將會將“值”和“參數”進行拼接。如果是字元串,那麼會拼接成字元串,如果是列表,那麼會拼接成一個列表。實例代碼如下: {{ value|add:"2"}} 如果val ...
  • Composer 是新一代的PHP依賴管理工具。本文介紹使用Composer的五個小技巧,希望能給你的PHP開髮帶來方便。 1. 僅更新單個庫 只想更新某個特定的庫,不想更新它的所有依賴,很簡單 composer update foo/bar 此外,這個技巧還可以用來解決“警告信息問題”。你一定見過 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...