Skip to content

chore(composer): 本体が使用する PHP 拡張を composer.json に宣言する (refs #6940) - #7081

Draft
ttokoro20240902 wants to merge 1 commit into
4.4from
fix/issue-6940-declare-php-extensions
Draft

chore(composer): 本体が使用する PHP 拡張を composer.json に宣言する (refs #6940)#7081
ttokoro20240902 wants to merge 1 commit into
4.4from
fix/issue-6940-declare-php-extensions

Conversation

@ttokoro20240902

@ttokoro20240902 ttokoro20240902 commented Aug 26, 2026

Copy link
Copy Markdown
Contributor

概要(Overview・Refs Issue)

refs #6940項目 2「PHP 拡張の宣言漏れ」の一部を対応します。項目 1・3・4・5 が残るため Issue は閉じません)

本体が使用しているのに composer.json に無く、直接依存として宣言されていない PHP 拡張のうち、宣言しても既存環境を弾かない 4 件を宣言します。

draft で出している理由

#7052(同じ #6940 の項目 3)が 8/10 から未レビューで止まっています。 同一 Issue に PR を積むよりそちらを先に進めたいので、レビュー待ちには載せていません。内容は検証済みなので、ご判断があればすぐ Ready にできます。

方針(Policy)

拡張 本体での使用箇所(実測)
ext-pdo TransactionListener.php:93-95,116-119 / PluginService.php:635-637,801-809getNativeConnection() の戻りを \PDO として inTransaction() を呼ぶ
ext-session app/config/eccube/packages/framework.yaml:12handler_id: 'session.handler.native_file'
ext-ctype ctype_digit() / ctype_xdigit()UcpCatalogController.php:304 / ScopeFilteringRegistry.php:104 / AcpMessageSigner.php:90,92
ext-fileinfo UploadedFile::getMimeType()ProductController.php:300 / PaymentController.php:181 / RefundRequestService.php:73)。symfony/mime は finfo を優先して使う

制約はいずれも "*" です(ext-ctypesymfony/polyfill-ctypeprovide: {"ext-ctype": "..."} を満たす必要があるため)。

#6940 が挙げた 4 件のうち ext-phar だけ入れていない理由

Issue の項目 2 は ext-pdo / ext-session / ext-phar / ext-fileinfo の 4 件を挙げています。本 PR は ext-phar を外し、代わりに Issue 本文が「polyfill が provide するので追加可能」と書いている ext-ctype を入れています。

require への宣言は「拡張が無い環境を弾く」効果を持ちます。 宣言済みの ext-zip を conf.d から外して実測しました。

$ PHP_INI_SCAN_DIR=<zip の ini を除いた dir> composer install --dry-run
  Problem 1
    - Root composer.json requires PHP extension ext-zip * but it is missing from your system.

弾かれる場面は composer が動くときで、管理画面からのプラグイン導入も含みますComposerApiService::execRequire():86-98)は --ignore-platform-reqs を渡していません(削除の execRemove():122-125)は渡しています)。

そして #6827 / #6874 が、まさにこれで踏んだ前例です。ext-sodium をハード要求する推移的依存のせいで sodium 非搭載の共有レンタルサーバーが API プラグインを導入できず、config.platform で緩める対処が入りました。#6827 の指摘のとおり、この層の利用者は SSH / CLI を持たないため自力で回避できません

そのうえで拡張ごとに整理すると次のとおりです。

拡張 欠けている環境で新たに困るか 根拠
ext-pdo 困らない 無ければ EC-CUBE が起動しない
ext-session 困らない 同上
ext-ctype 困らない symfony/polyfill-ctype が provide し、非搭載環境でも解決が通る
ext-phar 困る 本番側に要求元が無い(lock で ext-phar を require するのは dev の phar-io/manifest のみ)。宣言すると、これまで導入できていた環境のプラグイン導入が止まる
ext-fileinfo 困らない mcp/sdk v0.7.0 が本番側で ext-fileinfo をハード要求済みsymfony/mcp-bundle ^0.12 → mcp/sdk ^0.7)。fileinfo 非搭載環境は現状の 4.4 をそもそも導入できないので、宣言しても弾かれる環境は増えません

ext-fileinfo については Issue 本文の「現在の要求元: なし」が古くなっていますsymfony/mcp-bundle の追加後は本番依存として要求済みです。

それでも直接依存として宣言するのは、担保が第三者の 0.x 頼みだからです。symfony/mcp-bundle ^0.12mcp/sdk ^0.7 はいずれも 0.x で、composer のキャレットはマイナーを拾いません。次に上げるときに mcp/sdkext-fileinfo の要求をやめても、本体は UploadedFile::getMimeType() で finfo を使い続けているのに担保だけ消えます。エラーメッセージが mcp/sdk v0.7.0 requires ext-fileinfo になり原因が第三者パッケージのように読める点も同じ理由です。

これは #6939phpseclib/phpseclibnanasess/bcmath-polyfill 経由)・justinrainbow/json-schemacomposer/composer 経由)・ezyang/htmlpurifierexercise/htmlpurifier-bundle 経由)を、推移的に入っていたにもかかわらず明示化したのと同じ判断です。

スコープ外

テスト(Test)

宣言の追加のみで、実行時の挙動は変わりません。composer 側の検証を実測しました。

実行 結果
composer validate --no-check-publish ./composer.json is valid(lock 警告なし)
composer install --no-scripts --no-interaction --optimize-autoloader --dry-run(CI と同じ) Nothing to install, update or remove
composer check-platform-reqs 追加 4 件すべて successext-ctypeprovided by symfony/polyfill-ctype
ComposerApiServiceTest OK (1 test, 1 assertion)

composer.lockplatform セクションと content-hash のみを更新し、パッケージのバージョンは 1 つも変えていません。これがないと composer install が hash 不一致の警告を出し、かつ 追加した宣言が検証されませんcomposer install は composer.json ではなく lock の platform を検証します)。

実装に関する補足(Appendix)

  • 追加した 4 件はいずれも PHP 本体に既定で組み込まれる拡張です(本 PR の検証環境でも conf.d に ini が無い状態で有効)。ext-zip のように別パッケージの導入を要するものとは性質が異なります
  • CI の shivammathur/setup-phpextensions: :xdebug, redis 指定のみですが、既に宣言済みでコンパイル既定に含まれない ext-zip が現状の CI で通っていることから、既定で組み込まれる 4 件は問題にならない見込みです。最終確認は本 PR の CI に委ねます
  • 4.3 へのバックポートは想定していません

マイナーバージョン互換性保持のための制限事項チェックリスト

  • 既存機能の仕様変更はありません
  • フックポイントの呼び出しタイミングの変更はありません
  • フックポイントのパラメータの削除・データ型の変更はありません
  • twigファイルに渡しているパラメータの削除・データ型の変更はありません
  • Serviceクラスの公開関数の、引数の削除・データ型の変更はありません
  • 入出力ファイル(CSVなど)のフォーマット変更はありません

4 件はいずれも「無ければ EC-CUBE が動かない」「polyfill が代替する」「既に推移的に必須」のいずれかなので、実際に弾かれる環境は想定していません。

レビュワー確認項目

  • 動作確認
  • コードレビュー
  • E2E/Unit テスト確認(テストの追加・変更が必要かどうか)
  • 互換性が保持されているか
  • セキュリティ上の問題がないか
    • 権限を超えた操作が可能にならないか
    • 不要なファイルアップロードがないか
    • 外部へ公開されるファイルや機能の追加ではないか
    • テンプレートでのエスケープ漏れがないか

🤖 Generated with Claude Code

@ttokoro20240902 ttokoro20240902 added this to the 4.4.0 milestone Aug 26, 2026
@coderabbitai

coderabbitai Bot commented Aug 26, 2026

Copy link
Copy Markdown

Important

Draft PR not reviewed

Draft PRs are not automatically reviewed by default.

  • Trigger a manual review

To automatically review draft PRs, update your CodeRabbit configuration:

reviews:
  auto_review:
    drafts: true

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@codecov

codecov Bot commented Aug 26, 2026

Copy link
Copy Markdown

Codecov Report

✅ All modified and coverable lines are covered by tests.
✅ Project coverage is 77.75%. Comparing base (f03d0da) to head (8281936).

Additional details and impacted files
@@            Coverage Diff             @@
##              4.4    #7081      +/-   ##
==========================================
+ Coverage   77.67%   77.75%   +0.07%     
==========================================
  Files         597      597              
  Lines       29333    29333              
==========================================
+ Hits        22785    22808      +23     
+ Misses       6548     6525      -23     
Flag Coverage Δ
Unit 77.75% <ø> (+0.07%) ⬆️

Flags with carried forward coverage won't be shown. Click here to find out more.

☔ View full report in Codecov by Harness.
📢 Have feedback on the report? Share it here.

🚀 New features to boost your workflow:
  • ❄️ Test Analytics: Detect flaky tests, report on failures, and find test suite problems.
  • 📦 JS Bundle Analysis: Save yourself from yourself by tracking and limiting bundle sizes in JS merges.

@ttokoro20240902
ttokoro20240902 force-pushed the fix/issue-6940-declare-php-extensions branch from 9bb2f48 to dc139e9 Compare August 26, 2026 02:10
本体が使っているのに composer.json に無く、直接依存として宣言されていない
拡張を宣言する。

- ext-pdo … TransactionListener / PluginService が getNativeConnection() の
  戻りを \PDO として inTransaction() を呼ぶ。無ければ EC-CUBE が動かない
- ext-session … framework.yaml が session.handler.native_file を指定する。
  同様に無ければ動かない
- ext-ctype … ctype_digit / ctype_xdigit を使用。symfony/polyfill-ctype が
  provide するため非搭載環境でも依存解決は通る
- ext-fileinfo … UploadedFile::getMimeType() が finfo を使う。現状は
  symfony/mcp-bundle -> mcp/sdk 経由で本番側の要求が入っているが、いずれも
  0.x で担保が第三者頼みなので直接依存として宣言する

ext-phar は本番の要求元が無く(dev の phar-io/manifest のみ)、宣言すると
これまで導入できていた環境のプラグイン導入を止める。#6827 の sodium と同じ
「CLI を持たない共有レンタルサーバーでは利用者が回避できない」問題を
作るため宣言しない。ext-libxml も直接使用が無いため見送る。

制約は polyfill の provide を満たせるよう "*" とする。composer.lock は
platform セクションと content-hash のみ更新し、パッケージ版は変更しない。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
@ttokoro20240902
ttokoro20240902 force-pushed the fix/issue-6940-declare-php-extensions branch from dc139e9 to 8281936 Compare August 26, 2026 02:20
ttokoro20240902 added a commit that referenced this pull request Sep 1, 2026
レビューでのご提案 (#7052) に対応する。sodium とは分類の理由が逆なので
コメントで書き分けた。

- sodium … コアが一切使わない。 一部プラグインのみが要求する
- bcmath … コアが 127 箇所 / 29 ファイルで使う (Order.php 17 /
  PurchaseFlow.php 9 / StockDiffProcessor.php 8 / TaxRuleService.php 6 等の
  金額計算) が, nanasess/bcmath-polyfill が同名関数を提供するため
  拡張が無くても動作する

polyfill は関数を定義するだけで拡張は登録しないので, 正常に動作する環境でも
extension_loaded('bcmath') は false を返す。必須にすると polyfill で動いている
環境に danger が出てしまうため推奨に置く。

composer.json への ext-bcmath の宣言は #6940 の項目 2 の範囲なので #7081 で扱う。

Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant