2018 五月 Packagist 看到的 PHP 版本分佈

在「PHP Versions Stats - 2018.1 Edition」這邊看到這次的統計資料了,可以看到會使用 Composer (以及 Packagist) 的 PHP 版本中,7.0+ 已經是 78% 了,半年前是 67% 左右...

除了 PHP 5.x 以外,PHP 7.0 也是 12 月要停止支援 (2018/12/3),比 PHP 5.6 的支援期還早一個月左右 XD

用 Composer 的 require 限制,擋掉有安全漏洞的 library...

查資料的時候查到的,在 GitHub 上的 Roave/SecurityAdvisories 這個專案利用 Composerrequire 條件限制,擋掉有安全漏洞的 library:

This package ensures that your application doesn't have installed dependencies with known security vulnerabilities.

看一下 composer.json 就知道作法了,裡面的 description 也說明了這個專案的用法:

Prevents installation of composer packages with known security vulnerabilities: no API, simply require it

這方法頗不賴的 XDDD

PHP {7.1,7.0,5.6} 總算成為主流了...

PHP {7.1,7.0,5.6} (至少有安全性支援的版本) 佔了 90% 以上的量... 至少是有用 Composer 族群的主流了:「PHP Versions Stats - 2017.2 Edition」。

All versions                    Grouped
PHP 7.1.10      11.63%          PHP 7.1	36.63% (+18.99)
PHP 7.0.22      7.95%           PHP 7.0	30.76% (-5.36)
PHP 5.6.31      7.38%           PHP 5.6	23.28% (-8.16)
PHP 5.6.30      7.23%           PHP 5.5	6.11% (-4.5)
PHP 7.0.24      5.45%           PHP 5.4	1.51% (-1.6)
PHP 7.1.11      4.55%           PHP 5.3	0.76% (-0.22)

可以看出大家都在往 PHP 7.1 推了...

用乾淨的環境跑 Composer

Composer 包太多 module 進去跑會變慢不少 (像是把 xdebug 包進去時),所以自己寫了個小 script 只包必要的東西進去:

#!/bin/sh
exec php \
    -n \
    -d 'extension=curl.so' \
    -d 'extension=filter.so' \
    -d 'extension=hash.so' \
    -d 'extension=iconv.so' \
    -d 'extension=json.so' \
    -d 'extension=openssl.so' \
    -d 'extension=phar.so' \
    -d 'extension=posix.so' \
    -d 'zend_extension=opcache.so' \
    "$(dirname $0)/composer.phar" $*

用 -n 忽略掉 php.ini 裡面的東西 (這包括了 extension 設定) 後再開始自己加 extension 設定。

其中 opcache.so 是加速用的,posix.so 是因為想要有輸出的色彩,這兩個 so 檔不加進去還是可以動,而其他的都是必要的 extension。

PHP 的 Composer 推出 1.0 版

目前 PHP 上最重量級的軟體,Composer,推出 1.0 版了:「Composer goes Gold」。

然後作者女朋友想到奇怪的點子:

My girlfriend had a brilliant idea, and a few days and a couple express deliveries later here we are. We made an actual Composer gold master copy of the 1.0 release, on a floppy!

這張黃金磁片在 eBay 上競標中 XDDD

用 prestissimo 加速 PHP Composer 的下載速度

在「碼天狗週刊 #33」上看到的「prestissimo」這個軟體,可以平行下載 Composer 所需要的軟體而讓速度變快。作者測試 Laravel 的安裝:

$ composer create-project laravel/laravel laravel1 --no-progress --profile --prefer-dist

從 288 秒變成 26 秒:(這種 benchmark 跟地點應該有關係,看作者似乎是日本人?不知道是不是在日本測的...)

感覺應該要變成 Composer 的內建功能才對?

Composer 出現 lock file out of date 的解法

之前也有遇到,結果 Lorna Jane Mitchell 寫了一篇「Handling Composer "lock file out of date" Warning」給了不少解法。

第一種是 composer upgrade,直接全部升級。

第二種是先用 composer update --dry-run 看看是不是有人加到 composer.json 後忘記更新,如果是的話再用 composer update [package] 處理。

第三種是用 composer update nothing 閉上眼睛更新 hash 值,當作什麼都沒看到 XDDD

Sometimes this is the right answer so it's a handy trick to know!. I seem to see these kinds of issues in people's projects quite often (I'm a consultant, I see a lot of projects) so I thought I'd share my usual tactics for getting things sorted - if you have any tricks of your own to share, I'd love to hear them :)

該說很「實用」嗎 XDDD

PHP 的生命週期

PHP 網站上的「Supported Versions」與「Unsupported Branches」可以看到今年九月初 PHP 5.4 就已經停止維護了 (包括安全性更新也停了)。

在「PHP Versions Stats - 2015 Edition」這邊利用 Packagist 的資料分析,還是可以看到很多人用 PHP 5.3 與 PHP 5.4:

唔,很符合 PHP 社群以及各家 hosting 萬年不更新的使用習慣...?

增加一行程式碼讓 PHP Composer 效率爆增

可以直接看 GitHub 上的 commit log:「Disable GC when computing deps, refs #3482」。

      */
     public function run()
     {
+        gc_disable();
+
         if ($this->dryRun) {
             $this->verbose = true;
             $this->runScripts = false;

下面變成祭典了 XDDD

然後依照「Avoid generating duplicate conflict rules by naderman · Pull Request #3482 · composer/composer」這邊的測試 (要看下面的討論),設 zend.enable_gc=0 會省的更多,效率用倍數在跳的...

因為 Composer 的效率為人詬病很久了,這次有人暴發出來,會讓一群人投入資源找更多 optimization... XD

Composer 的版本選擇方式

Composer 是目前 PHP 世界裡比較紅的套件管理工具,內建了一些 autoload 模組,以及 Packagist 這個巨大的 ecosystem。

在「Installing Composer Packages」這篇文章裡提到要如何在 Composer 裡指定套件的版本。在這之前,你需要先知道什麼是 Semantic Versioning,然後再來看作者的論述。

直接講結論,文章裡推薦用 ~ 的方式指定版本,這通常會是你要的結果:用 ~1.2 表示 >=1.2.0,<2.0.0;而用 ~1.2.3 則可以表示 >=1.2.3, <1.3

在對付 compatibility 問題時還蠻常見的情況。