[英]how to hotpatch phar package?
你如何熱補丁一個phar包? 例如,如果我想熱補丁
if (function_exists('posix_getuid') && posix_getuid() === 0) {
if ($commandName !== 'self-update' && $commandName !== 'selfupdate') {
$io->writeError('<warning>Do not run Composer as root/super user! See https://getcomposer.org/root for details</warning>');
從作曲家到
if (false && posix_getuid() === 0) {
if ($commandName !== 'self-update' && $commandName !== 'selfupdate') {
$io->writeError('<warning>Do not run Composer as root/super user! See https://getcomposer.org/root for details</warning>');
我該怎么做? 只需編輯代碼通常會導致
PHP Fatal error: Uncaught PharException: phar "/usr/local/bin/composer" has a broken signature in /usr/local/bin/composer:28
Stack trace:
#0 /usr/local/bin/composer(28): Phar::mapPhar()
#1 {main}
thrown in /usr/local/bin/composer on line 28
您可以配置 php 以告訴 phars 在運行時不要使用導致該錯誤的簽名檢查。
將以下配置為false https://www.php.net/manual/en/phar.configuration.php#ini.phar.require-hash
此選項將強制所有打開的 Phar 存檔包含某種簽名(目前支持 MD5、SHA1、SHA256、SHA512 和 OpenSSL),並且將拒絕處理任何不包含簽名的 Phar 存檔。
編輯:
下載作曲家源碼: https ://github.com/composer/composer
您需要使用 compile 命令重新編譯 composer 並使用 phar.require-hash=0 運行
首先解壓phar:
rm -rfv unpacked;
mkdir unpacked;
php --define open_basedir= --define phar.readonly=0 -r '(new Phar("composer.phar"))->convertToExecutable(Phar::TAR,Phar::NONE)->extractTo("unpacked/");'
然后在未打包的目錄中進行修補,在您的情況下為unpacked/src/Composer/Console/Application.php
,然后重新打包 phar:
rm -f hotpatched.phar;
php --define open_basedir= --define phar.readonly=0 -r '$phar=new Phar("hotpatched.phar");$phar->buildFromDirectory("unpacked");$phar->setStub("#!/usr/bin/env php\n".$phar->createDefaultStub("bin/composer"));'
但是將bin/composer
替換為 phar 包的真實入口點(在 composer 的情況下,它是bin/composer
),然后使熱補丁 phar 可執行:
chmod +x hotpached.phar
瞧,您的 phar 已修補 :) phar 甚至可以與 php.ini phar.require_hash=1
一起使用
提示:您可以添加$phar->compress(Phar::BZ2);
如果你想要 phar 壓縮/更小
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.