使用phar上線你的代碼包

在我前一陣子寫的一篇文章《新版 SegmentFault 重構之系統架構》中,不少人對其中提到的利用phar上線代碼比較感興趣,我就在這邊跟你們分享下我目前的作法。php

哪些項目適合phar打包上線?

其實這種方法沒有什麼特別的限制,只有一條,你的程序是單一入口的,對web項目也就是說,全部的http請求都只有一個php文件做爲處理方(大多數程序就是index.php)。css

若是你的程序結構是這樣的,那麼基本能夠無障礙切換到這種上線模式。實際上絕大多數現代的php框架構建的項目都是單一入口的結構了。git

現有代碼須要作何處理嗎?

若是你的代碼結構比較科學(好比採用大部分框架的推薦結構),那麼一行都不須要改變。只有幾個須要注意github

  1. 在項目裏用include或者require來引用其餘項目內文件時,最好不要直接用相對地址,而是在前面加上__DIR__常量
  2. 由於phar包只能解析代碼文件,因此建議靜態文件單獨部署

OK,準備工做作完後,咱們就能夠開始看看具體怎麼部署了。爲了方便你們瞭解,我在github上放了一個很是簡單的小例子,它的地址是web

https://github.com/SegmentFault/phar-samplesegmentfault

從一個簡單的例子提及

這個例子的代碼結構跟咱們大多數項目很像,實際上我就是刻意模擬這些項目的代碼結構
注意,運行這個項目最好在php 5.4以上的環境中瀏覽器

目錄結構

  • app存放主要的邏輯代碼,好比controller, model, service 等等
  • lib存放一些庫文件,包括第三方的
  • portal其實就是項目的主入口了,打開你回發現裏面只有一個文件index.php,這就是我前面提到的單一入口結構
  • static存放的是靜態文件,好比js, css, 圖片等等,這個目錄須要你單獨部署,咱們的phar包裏不會打包裏面的內容,放在這裏只是爲了完整地展現一個項目結構
  • build.php文件就是咱們的打包腳本了

若是你的項目須要模版文件,可能還須要一個template目錄,在這裏我就省略掉了php框架

在瀏覽器裏訪問你的項目地址/portal/index.php,便可看到熟悉的Hello World!字樣架構

這個項目中最重要的就是build.php這個文件了,它展現了一個通過簡化的打包過程,實際上,稍加修改它就能用在你的項目中,這個文件的代碼註釋很詳細,我就不重複說明了,如今咱們在終端下運行它app

phar1

啊哦,貌似出了點問題,不過沒關係,這是php的一個選項沒有設置致使的,打開php.ini文件,找到;phar.readonly = On這一行,把前面的分號;去掉,而後把後面的On改成Off,而後保存再執行這個命令

phar2

看來成功了,並且當前目錄下已經有了Sample.phar這個打包好的文件

如何部署phar文件

如今你必定對着這個phar文件感到新奇,可是又不知道如何用它,WTF!可是等等,請回到終端下執行命令

php Sample.phar

怎麼樣,如今你的整個項目就已經被包含在這個Sample.phar文件裏了,並且它還能直接被執行,很神奇吧,那麼咱們應該怎麼部署它呢?

如下是個人建議

首先爲每次打包的文件生成一個版本號,好比你能夠在build.php加上一行

rename('Sample.phar', 'Sample.' . date('Ymd.His') . '.phar');

這樣每次打包後的文件就變成了相似Sample.20141111.123456.phar,並且不會重複,生成不重複id的方法有不少種,我推薦這種是由於它能夠方便你看到打包時間,之後你作回滾的時候就能夠知道要回滾到那個時間的版本,固然你也能夠把這個版本跟你的SCM版本關聯起來

而後,在線上使用另一個入口文件引用這個包,好比線上的入口目錄/wwwroot下的index.php文件有以下代碼

require __DIR__ . '/../packages/Sample.20141111.123456.phar';

是的,只有一行就這麼簡單!packages就是你存放這些打包好文件的目錄,你能夠隨意放置。

我說的這些步驟均可以很方便的寫成腳本集成到你目前的自動化部署流程中。

以上的文字只是拋磚引玉,歡迎你們對這個方案提出意見,並對它作一些性能測試,若是你運行在5.5以上的版本(默認打開opcache),幾乎對性能沒有影響。

相關文章
相關標籤/搜索