Community研究&データ分析github.com

dbravoan/opencode-skills

レガシーなPHP 5.x/7.xコードベース(独自CMS、TemplatePower、mysql_*、ereg、ショートタグ、PHP4コンストラクタ)をPHP 8.3/8.4で動作するようインプレースアップグレードし、その後Dockerを使わずに.env設定とFTP/rsyncのdeploy.shでデプロイします。レガシーなPHP CMS/サイトや関連レガシープロジェクトの近代化、またはFTP経由で共有ホスティング(cPanel/Plesk)に移行する必要がある場合に使用します。

opencode-skills とは?

このスキルは、レガシーなPHP 5.x/7.xコードベースをPHP 8.3/8.4向けに段階的に近代化するための包括的なツールセットと手順を提供します。mysql_*関数やereg、ショートタグ、PHP4スタイルのコンストラクタといった非推奨機能の互換レイヤー、構文修正スクリプト、静的チェッカー、テストツールを含みます。主な特徴は、大規模な書き換えをせずに互換性を確保しつつ、Dockerを使わずに共有ホスティングへFTPデプロイできる点です。手順はGitベースライン作成から始まり、互換シムの導入、機械的な修正、シグネチャチェック、実際のデータベースでの動作確認、セキュリティ対策、そして.envベースの設定とdeploy.shによるデプロイまでをカバーします。このスキルはClaude CodeやClineなど、ターミナル操作が可能なAIエージェント向けに設計されており、レガシープロジェクトのモダナイゼーションを効率的に進めるのに役立ちます。

対応~Claude Code~Codex CLI~Cursor✓OpenCode
npx skills add https://github.com/dbravoan/opencode-skills/tree/HEAD/skills/legacy-php8-modernizer

Installed? Explore more 研究&データ分析 skills: affaan-m/uspto-database, affaan-m/scholar-evaluation, affaan-m/literature-review · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

レガシーPHP → PHP 8.3/8.4 モダナイザー

いつ使うか

このスキルは、レガシーなPHPプロジェクト(通常はPHP 5.x用に書かれた独自CMS)が以下の条件を満たす必要がある場合に使用します:

  • PHP 8.3 / 8.4 でフルリライトせずに動作する必要がある、かつ/または
  • FTP経由で共有ホスティング(cPanel/Plesk) にデプロイする必要がある(Dockerなし)。

典型的な症状:mysql_*、ereg/eregi、<? ショートタグ、PHP4スタイルのコンストラクタ、 裸の配列キー($row[Id])、$$var['key']、sizeof(null)、MyISAMダンプ、 TemplatePowerテンプレート、config/defines*.php 内の平文認証情報。

このスキルが提供するもの

アセット目的
scripts/compat.php互換シム:mysql_*→mysqli、ereg*/split→preg、userErrorHandler
scripts/fix_barewords.phpトークナイザーを使用した裸の配列キーの安全な引用符付け
scripts/fix_variable_variables.phpPHP 8の $$var['key'] 統一変数構文の破損を修正
scripts/check_signatures.php静的LSPメソッドシグネチャチェッカー
scripts/lint-all.shphp -l スイープ
scripts/smoke-test.shURLリストに対するHTTPスモークテスト
templates/defines.php.env ローダー + DB定数(Dockerあり/なし両対応)
templates/env.example.env テンプレート(DB_* + FTP_*)
templates/htaccessモダンなApache/PHP-FPM用 .htaccess
templates/user.ini共有ホスティング用PHP-FPMオーバーライド
templates/timthumb.php安全なGDサムネイル生成(脆弱なTimThumbの置き換え)
deploy/deploy.shFTPまたはrsyncデプロイ、開発ファイルを除外、リモート .env を書き込み

黄金律

  1. 安全第一:何かに触れる前に git init + ベースラインコミット。DBのバックアップを取る。
  2. リファクタリングより先に動作を確保:シムによりコードベース全体がすぐに動作するようになる。
  3. 一元化されたDBレイヤー:まず dbClass を置き換え/制限する。シムは生の mysql_* 呼び出しをカバーする。
  4. セキュリティは早期に:サイトがレンダリングされたらすぐに危険なツールやTimThumbを削除する。
  5. 継続的に検証:バッチごとに php -l を実行し、その後すべてのURLをスモークテストする。

手順

0. ベースライン

git init -q && git add -A && git commit -qm "baseline: legacy PHP"
find . -name '*.php' -not -path './node_modules/*' | wc -l

scripts/smoke-test.sh 用に、実際の公開URLのリストを(DB/サイトマップから)保存します。

1. 互換シムのインストール

  • scripts/compat.php を例えば includes/compat.php にコピーします。
  • ブートストラップの一番上で、レガシーコードの前に読み込みます:
    include_once(__DIR__.'/../includes/compat.php');
    
  • これにより、mysql_*、ereg/eregi/ereg_replace/eregi_replace/split、 mysqli_report(MYSQLI_REPORT_OFF)(SQLエラーはスローされず false を返す)、 および userErrorHandler()(PHP 5の古いE_NOTICE「undefined index/variable」を抑制)が提供されます。
  • ハンドラを一度登録します:
    if (function_exists('userErrorHandler')) set_error_handler('userErrorHandler');
    

2. 機械的な修正(スクリプト)

php scripts/fix_barewords.php            # ドライラン
php scripts/fix_barewords.php --apply
php scripts/fix_variable_variables.php   # ドライラン
php scripts/fix_variable_variables.php --apply
scripts/lint-all.sh

その後、lintでまだ報告されるものを修正します:

  • ショートタグ:<? → <?php(grep <\(?!php|=|xml\))
  • PHP4コンストラクタ:function ClassName() → function __construct()
  • 中括弧による文字列オフセット:$s{0} → $s[0]
  • ループ/switch外の break(PHP 8では致命的エラー)
  • ${...} 内の可変変数:裸のワードを引用符付け/${$var['k']} を使用

3. シグネチャ、静的、ヌルセーフティ

php scripts/check_signatures.php

各 MISMATCH について、子メソッドにデフォルトパラメータを追加します(例:$tabla = null)。 その後、実行時に現れる致命的エラーを修正します:

エラー修正
ArgumentCountError: too few arguments末尾のパラメータにデフォルト値を設定
静的メソッド内の $thisself::/static:: を使用するか、アプリコンテキストを渡す
method_exists(null, ...)is_object($x) && method_exists($x, ...)
Cannot access offset of type string on string$x['k'] の前に is_array($x) を配置
Undefined constant "X"裸のワードキー/定数を引用符付け
sizeof/count/array_keys(null)is_array($x) ? ... : ...、(array)$x
foreach(null)foreach ((array)$x as ...)
Accessing static property X as non static$this->prop → self::$prop

4. 実際のDBに対して実行し繰り返す

設定をDBに向け、すべてのURLをリクエストします。scripts/smoke-test.sh がゼロ失敗を報告し、ログに警告がなくなるまで、テストごとに1つの致命的エラーを修正します。

5. セキュリティ(早めに行う)

  • TimThumbを templates/timthumb.php で置き換えます。
  • scanner.php、chmod777.php、info.php、不要なデバッグスクリプトを削除します。
  • .htaccess で .env、.git、config/defines.php、ドットファイルへのアクセスを拒否します。
  • コミットされたDBパスワードを変更し、秘密を .env に移動します。
  • CSRFトークン、CSP/HSTS、レート制限、プリペアドステートメントを推奨します。

6. 設定 + デプロイ

  • templates/defines.php(.env ローダー)と templates/env.example を使用します。
  • templates/htaccess と templates/user.ini を使用します。
  • deploy/deploy.sh でデプロイします。

.env システム

config/defines.php はプロジェクトルートから .env を読み込み、getenv() にフォールバックし、最後に安全なデフォルト値にフォールバックします。これにより、Dockerでも同じ DB_* キーで動作し続け、FTPデプロイは1ファイルの編集で済みます。

.env(コミットしない):

DB_HOST=localhost
DB_NAME=cpaneluser_termospa
DB_USER=cpaneluser_termospa
DB_PASS=super-secret
DB_SUBDIRECTORIO=

デプロイ(Dockerなし)

共有ホスティング(cPanel/Plesk)チェックリスト

  1. PHP:8.3(または8.1以上)を選択し、mysqli、gd、mbstring、pdo_mysql を有効化。
  2. DB:DB + ユーザを作成し、ダンプをインポート。MySQL 8の場合:
    SET SESSION sql_mode='NO_ENGINE_SUBSTITUTION';
    
    utf8_spanish_ci → utf8mb3_spanish_ci の警告が想定される(またはutf8mb4移行を実行)。
  3. ファイル:public_html/ にアップロード(docker/、tools/、router.php、_DOCS/、.git/ は除外)。
  4. パーミッション:ディレクトリ 755、ファイル 644;recursos/cache/、.cache/、upload/ は書き込み可能(775/777)。
  5. 設定:リモート .env を作成(deploy.shが実行)し、DB_* を確認。
  6. .htaccess で .env へのアクセスを拒否。

deploy.sh

./deploy.sh ftp          # lftp リバースミラー
./deploy.sh ftp --dry-run
./deploy.sh rsync        # SSH経由のrsync

.env(FTP_HOST/USER/PASS/PATH/TLS または SSH_*)を読み込み、ランタイムファイルのみをステージングし、リモート専用の DB_* のみを含む.env(FTP認証情報がサーバーに保存されないように)を書き込み、アップロードし、パーミッションとDBの手順を表示します。


検証チェックリスト

  • scripts/lint-all.sh → すべてクリーン
  • scripts/smoke-test.sh urls.txt → 失敗0
  • ホーム / 商品 / プロジェクト / ニュース / お問い合わせページが表示される
  • /sitemap.xml と /rss が有効なXMLを返す
  • /imagenes/thumbnail/... が画像を返す(GD + リライト)
  • /administracion/login/ が読み込まれ、ログイン + コンテンツマネージャが動作する
  • お問い合わせフォームが送信される
  • 管理者の画像アップロードが upload/ に書き込まれる
  • エラーログに PHP Warning/Fatal がない

よくある落とし穴

  • mysqli_query はPHP 8.1以上ではデフォルトでスローする。mysqli_report(MYSQLI_REPORT_OFF) を呼び出して、従来の or die() / if($q=...) が動作し続けるようにする。
  • .htaccess 内の php_flag / php_value は PHP-FPM環境下でHTTP 500を引き起こす – .user.ini を使用する。
  • PHP 8の統一変数構文は $$var['key'] を静かに壊す(間違った変数に書き込む) – fix_variable_variables.php を実行する。
  • include() の相対パスはスクリプトディレクトリ/CWDに対して解決される。__DIR__ を優先して使用する。
  • PHP 8で削除されたもの:mysql_*、ereg*、split、create_function、each、マジッククォート。
  • OPcacheは古いファイルをキャッシュする。編集後はFPM/Apacheを再起動する。
  • UTF-8:SET NAMES utf8mb4;新しい作業ではInnoDB + utf8mb4_unicode_ci を推奨。

関連プロジェクト

これらのCMSプロジェクトは同じアーキテクチャを共有しています。ブートストラップパスとサムネイルリライトターゲットのみを調整して、同じ手順を実行します。scripts/ を対象の tools/ にコピーし、プロジェクトルートから実行します。

関連スキル