tag:crieit.net,2005:https://crieit.net/tags/Composer/feed 「Composer」の記事 - Crieit Crieitでタグ「Composer」に投稿された最近の記事 2022-05-10T22:39:48+09:00 https://crieit.net/tags/Composer/feed tag:crieit.net,2005:PublicArticle/18186 2022-05-10T22:39:48+09:00 2022-05-10T22:39:48+09:00 https://crieit.net/posts/docker-php-7-alpine-use-composer-and-xdebug-20220510 Docker の php:7-alpine イメージで Composer と Xdebug を使えるようにする <h2 id="経緯"><a href="#%E7%B5%8C%E7%B7%AF">経緯</a></h2> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/slimphp/Slim-Skeleton">slimphp/Slim-Skeleton</a> を利用したいと考えました。</p> <p>手元の端末で開発しようとしたところ、 XAMPP に Xdebug を入れ忘れていたことに気付きました。しかも、 XAMPP の PHP のバージョンで Xdebug のインストールが止まってしまいました。</p> <p>そこで、スケルトンプロジェクトに付随している Docker Compose での開発を試みましたが、この Docker Compose 内で pull してくるイメージは Composer も Xdebug もないので入れることにしました。</p> <h2 id="コード"><a href="#%E3%82%B3%E3%83%BC%E3%83%89">コード</a></h2> <h3 id="ディレクトリ構造"><a href="#%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E6%A7%8B%E9%80%A0">ディレクトリ構造</a></h3> <pre><code>root/ ├ _docker/ // Dockerに関する設定置き場 │ ├ dockerfiles/ │ │ ├ settings/ │ │ │ └ php.ini // PHPの設定 (Xdebug 有効化) │ │ │ │ │ └ Dockerfile │ │ │ ├ mysql/ // MariaDB 用ディレクトリ │ │ └ .gitkeep │ │ │ └ phpmyadmin/ │ ├ conf/ │ │ └ phpmyadmin-misc.ini // phpMyAdmin の設定 (メモリ上限など) │ │ │ └ sessions/ │ └ .gitkeep │ └ docker-compose.yml </code></pre> <p>Docker に関する部分のみ列挙。</p> <h3 id="docker-compose.yml"><a href="#docker-compose.yml">docker-compose.yml</a></h3> <pre><code class="yml">version: '3.7' volumes: logs: driver: local services: slim: build: context: ./_docker/dockerfiles/ dockerfile: Dockerfile working_dir: /var/www command: php -S 0.0.0.0:8080 -t public environment: docker: "true" ports: - 8080:8080 volumes: - .:/var/www - ./logs:/var/www/logs db: image: mariadb restart: always ports: - 3306:3306 volumes: - ./_docker/mysql/mysql:/var/lib/mysql - ./_docker/mysql/initdb.d:/docker-entrypoint-initdb.d environment: - MYSQL_ROOT_PASSWORD=pwd - MYSQL_DATABASE=test - MYSQL_USER=user - MYSQL_PASSWORD=pwd phpmyadmin: image: phpmyadmin/phpmyadmin volumes: - ./_docker/phpmyadmin/sessions:/sessions - ./_docker/phpmyadmin/conf/phpmyadmin-misc.ini:/usr/local/etc/php/conf.d/phpmyadmin-misc.ini environment: - PMA_ARBITRARY=1 - PMA_HOST=db - PMA_USER=user - PMA_PASSWORD=pwd ports: - 8081:80 </code></pre> <p>変更点は以下。</p> <ul> <li>PHP 用環境: <code>Dockerfile</code> を使ったイメージにカスタマイズ</li> <li>DB: MariaDB のイメージをそのまま利用 <ul> <li><code>environment</code> のパラメータはそのまま使用。アプリケーションや phpMyAdmin 側と動機は取れていないですがひとまずはこれで……</li> </ul></li> <li>phpMyAdmin: これも phpMyAdmin 公式イメージを流用</li> </ul> <h3 id="_docker/dockerfiles/Dockerfile"><a href="#_docker%2Fdockerfiles%2FDockerfile">_docker/dockerfiles/Dockerfile</a></h3> <pre><code class="Dockerfile">FROM php:7-alpine RUN apk --update add curl RUN set -ex \ && apk --no-cache add \ autoconf build-base RUN pecl install xdebug RUN docker-php-ext-enable xdebug RUN docker-php-ext-install pdo_mysql COPY settings/php.ini /usr/local/etc/php/conf.d RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/bin --filename=composer </code></pre> <p><code>php:7-alpine</code> をベースに Xdebug と Composer を追加。</p> <h3 id="_docker/dockerfiles/settings/php.ini"><a href="#_docker%2Fdockerfiles%2Fsettings%2Fphp.ini">_docker/dockerfiles/settings/php.ini</a></h3> <pre><code class="ini">xdebug.mode=coverage </code></pre> <p>Xdebug でカバレッジを有効化するための設定を追加するため。なお、 <code>Dockerfile</code> で <code>COPY</code> する際のホストマシンでのパスは <strong><code>Dockerfile</code> の存在するディレクトリから下でないと参照できない</strong> という地味な制約があるので <code>dockerfiles</code> ディレクトリをわざわざ掘りました。</p> <h3 id="_docker/phpmyadmin/conf/phpmyadmin-misc.ini"><a href="#_docker%2Fphpmyadmin%2Fconf%2Fphpmyadmin-misc.ini">_docker/phpmyadmin/conf/phpmyadmin-misc.ini</a></h3> <pre><code class="ini">allow_url_fopen = Off max_execution_time = 600 memory_limit = 64M post_max_size = 64M upload_max_filesize = 64M </code></pre> <p>メモリ上限等のカスタマイズ。</p> <hr /> <p>これで今回はカバレッジ出力まで動作することを確認しました。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <h3 id="Xdebug"><a href="#Xdebug">Xdebug</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/sachiko-kame/items/bf5480f4d7c751ab28aa">PHPUnitでHTMLコードカバレッジを出すまで(Docker使用) - Qiita</a></li> </ul> <blockquote> <p>Warning: XDEBUG_MODE=coverage or xdebug.mode=coverage has to be set</p> </blockquote> <p>が出たので step3 について実施。</p> <p>なお、今回のケースでは</p> <pre><code>extension=xdebug.so </code></pre> <p>は不要だった。</p> <h2 id="Dockerfile"><a href="#Dockerfile">Dockerfile</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://crudzoo.com/blog/php-docker">Dockerで作るNginx + PHP7 + Xdebug環境 | Crudzoo</a></li> </ul> <p>ほぼこれでOK.</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/ucan-lab/items/fbf021bf69896538e515">php-alpineコンテナにxdebugをインストールする時にハマったメモ - Qiita</a></li> </ul> <p>こちらも参照。 <code>php -v</code> で <code>with Xdebug</code> と付いていればOK。</p> <h4 id="Dockerfile の COPY"><a href="#Dockerfile+%E3%81%AE+COPY">Dockerfile の COPY</a></h4> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://scrapbox.io/taka521-tech-notes/%E3%80%90Docker%E3%80%91COPY%E3%81%A7%E6%8C%87%E5%AE%9A%E3%81%95%E3%82%8C%E3%81%9F%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%81%AF%E3%80%81Dockerfile%E3%81%8C%E5%AD%98%E5%9C%A8%E3%81%99%E3%82%8B%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%81%8B%E3%82%89%E3%81%AE%E7%9B%B8%E5%AF%BE%E3%83%91%E3%82%B9%E3%81%A7%E3%80%81%E8%A6%AA%E3%83%87%E3%82%A3%E3%83%AC%E3%82%AF%E3%83%88%E3%83%AA%E3%82%92%E8%A6%8B%E3%82%8C%E3%81%AA%E3%81%84">【Docker】COPYで指定されたファイルは、Dockerfileが存在するディレクトリからの相対パスで、親ディレクトリを見れない - タカの技術ノート</a></li> </ul> <h3 id="Mariadb"><a href="#Mariadb">Mariadb</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://mebee.info/2020/04/07/post-8227/">dockerを使用してmariadbを構築する | mebee</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/tarch710/items/1236a23f7ffde4c512f2">開発環境をDockerにしたら、PDOでcould not find driverが出た - Qiita</a></li> </ul> <blockquote> <p>could not find driver</p> </blockquote> <p>普通に考えたら確かにドライバがないので追加して解決。</p> <h3 id="シェル"><a href="#%E3%82%B7%E3%82%A7%E3%83%AB">シェル</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/yutachaos/items/56dd7ea09d7e2b0d9173">dockerでalpine linux ベースのcontainerに入って、shellを使いたいとき。 - Qiita</a></li> </ul> <p>bash ではなく ash 。 <code>bin/ash</code> 指定。</p> <h3 id="sr -c"><a href="#sr+-c">sr -c</a></h3> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://genzouw.com/entry/2020/01/28/120014/1910/">docker-compose.ymlのcommandプロパティに複数コマンドを設定する方法 | ゲンゾウ用ポストイット</a></li> </ul> <p>最終的には使わずに済みましたが念のためメモ。</p> arm-band tag:crieit.net,2005:PublicArticle/18167 2022-04-11T23:53:09+09:00 2022-04-11T23:53:09+09:00 https://crieit.net/posts/prevent-timeout-in-composer-process-20220412 Composer で処理中にタイムアウトになるのを防ぐ <h2 id="現象"><a href="#%E7%8F%BE%E8%B1%A1">現象</a></h2> <p>Composer で処理させたところ</p> <blockquote> <p>The process "'/usr/bin/unzip' -qq '/PATH/TO/PROJECT/vendor/composer/tmp-XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX' -d '/var<br /> /PATH/TO/PROJECT/vendor/composer/XXXXXXXX'" exceeded the timeout of 300 seconds.</p> </blockquote> <p>でタイムアウトになってしまったのでこれを防ぐ方法をメモ。</p> <h2 id="対処"><a href="#%E5%AF%BE%E5%87%A6">対処</a></h2> <p>いくつか方法はあるようですが、今回は <code>composer.json</code> に以下の記述を追記することでタイムアウト判定の時間を 300秒(5分) から無制限に変更しました。</p> <pre><code class="json">"config": { "process-timeout": 0 }, </code></pre> <p>これでOK。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/YuK1Game/items/d7e993d6f210d250e157">composerでタイムアウトが発生する問題 - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://www.ninton.co.jp/archives/6314">[php] composerが300秒でタイムアウトしてしまう | Ninton</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/17517 2021-07-14T20:39:52+09:00 2021-07-14T20:39:52+09:00 https://crieit.net/posts/composer-lcobucci-jwt-require-ext-sodium-20210714 lcobucci/jwt を Composer でインストールしようとしたら Your requirements could not be resolved to an installable set of packages. のエラーメッセージ <p><a target="_blank" rel="nofollow noopener" href="https://packagist.org/packages/lcobucci/jwt">lcobucci/jwt</a> を Composer でインストールしようとしたら以下のエラーメッセージが表示されました。</p> <pre><code class="bash">> composer require Search for a package: ./composer.json has been updated Running composer update Loading composer repositories with package information Updating dependencies Your requirements could not be resolved to an installable set of packages. Problem 1 - Root composer.json requires lcobucci/jwt 4.1.4 -> satisfiable by lcobucci/jwt[4.1.4]. - lcobucci/jwt 4.1.4 requires ext-sodium * -> it is missing from your system. Install or enable PHP's sodium extension. To enable extensions, verify that they are enabled in your .ini files: - PATH\TO\xampp\php\php.ini You can also run `php --ini` inside terminal to see which files are used by PHP in CLI mode. Installation failed, reverting ./composer.json to its original content. </code></pre> <p>XAMPP (PHP 7.4.3) に <code>ext-sodium</code> の拡張機能がない、と。 Docker を使っても良いのですが、今回はサクッと試したいだけなのでもう少し見てみます。試しに <code>php.ini</code> を確認すると</p> <pre><code class="ini">;extension=soap ;extension=sockets ;extension=sodium ;extension=sqlite3 ;extension=tidy ;extension=xmlrpc ;extension=xsl </code></pre> <p>何かそれらしきものがコメントアウトされているのを発見。</p> <pre><code class="ini">;extension=soap ;extension=sockets extension=sodium ;extension=sqlite3 ;extension=tidy ;extension=xmlrpc ;extension=xsl </code></pre> <p>コメントアウトを外し、 XAMPP のコントロールパネルから Apache を再起動。</p> <p>それから再度 Composer でインストールをかけると、正常に完了しました。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://packagist.org/packages/lcobucci/jwt">lcobucci/jwt - Packagist</a></li> <li>同種のエラーメッセージへの対処: <a target="_blank" rel="nofollow noopener" href="https://qiita.com/wallkickers/items/e895495172b5e7371f38">【PHP】「〜requires ext-gd * -> the requested PHP extension gd is missing from your system.」でパッケージがインストールできない時の解決法。 - Qiita</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/17501 2021-07-12T20:48:00+09:00 2021-07-12T20:48:00+09:00 https://crieit.net/posts/composer-upgrade-20210712 Windows XAMPP 環境で Composer をアップグレードする <p>去年の10月に Composer 2 がリリースされましたが、アップグレードをしてこなかったのでやってみることにしました。</p> <p>検索して出てきた方法としてコマンドですぐに完了するとのことだったのでコマンドを実行。</p> <pre><code class="bash">> composer self-update --2 [Symfony\Component\Console\Exception\RuntimeException] The "--2" option does not exist. self-update [-r|--rollback] [--clean-backups] [--no-progress] [--update-keys] [--stable] [--preview] [--snapshot] [--set-channel-only] [--] [<version>] </code></pre> <p>あれ?</p> <blockquote> <p>[Symfony\Component\Console\Exception\RuntimeException] The "--2" option does not exist.</p> </blockquote> <p>エラーになってしまいました。</p> <p>エラー文で検索したところ以下の記事がヒットしたので、そのコマンド実行。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://imwz.io/composer-2-update/">Composer 2 Update | IMWZ - Bespoke DevOps Work</a></li> </ul> <pre><code class="bash">> composer global update Changed current directory to C:/Users/USERNAME/AppData/Roaming/Composer Composer could not find a composer.json file in C:\Users\USERNAME\AppData\Roaming\Composer To initialize a project, please create a composer.json file as described in the https://getcomposer.org/ "Getting Started" section </code></pre> <p>自身のユーザ名の下の <code>AppData\Roaming\Composer</code> に <code>composer.json</code> がないと? Composer の大本の設定のディレクトリですね。</p> <p>とはいえ、 <code>composer.json</code> の中身をどうすれば良いのか……と思っていたところ、そういえばこの環境はインストーラからインストールしたことを思い出しました。</p> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://getcomposer.org/download/">Composer</a></li> </ul> <p>ということでおとなしくインストーラをダウンロードし直して実行。</p> <p>「1つのPCに入れられる Composer は1バージョンのみなので、既存の Composer をアンインストールして」と言われました。</p> <p>コンパネからアンインストール。 Roaming の設定は一応残しておきます。キャッシュは削除。</p> <p>アンインストール完了直前に <code>C:\Users\USERNAME\AppData\Local\Composer</code> を手動で削除して、というメッセージが出たので手動削除。先程指定したキャッシュのようですが、アンインストーラから削除できなかったのか……。</p> <p>アンインストール完了後、再度ダウンロードしたインストーラを実行。後はポチポチしていくだけ。</p> <pre><code class="bash">>composer -v ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/ Composer version 2.1.3 2021-06-09 16:31:20 </code></pre> <p>インストール完了しました。ひとまずOKそうです。</p> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/rana_kualu/items/8be56a5a20b71710e7ca">Composer2.0ついにリリース! - Qiita</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://imwz.io/composer-2-update/">Composer 2 Update | IMWZ - Bespoke DevOps Work</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://github.com/composer/composer/issues/8325">Composer can not find composer.json file ・ Issue #8325 ・ composer/composer ・ GitHub</a></li> <li><a target="_blank" rel="nofollow noopener" href="https://getcomposer.org/download/">Composer</a></li> </ul> arm-band tag:crieit.net,2005:PublicArticle/17397 2021-06-14T04:20:03+09:00 2021-06-14T04:20:03+09:00 https://crieit.net/posts/Composer-classmap [Composer] classmapの使い方 <h1 id="composerとは"><a href="#composer%E3%81%A8%E3%81%AF">composerとは</a></h1> <p>いわずもがな、PHPの標準と言ってもいいパッケージ管理ツールです。インストール方法や使い方はこちらを参照してください。</p> <p><a target="_blank" rel="nofollow noopener" href="https://weblabo.oscasierra.net/php-composer-1/">PHPのライブラリ管理ツール「Composer」入門</a><br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/atwata/items/d6f1cf95ce96ebe58010">composerとは</a></p> <h1 id="こういう人向けの記事です"><a href="#%E3%81%93%E3%81%86%E3%81%84%E3%81%86%E4%BA%BA%E5%90%91%E3%81%91%E3%81%AE%E8%A8%98%E4%BA%8B%E3%81%A7%E3%81%99">こういう人向けの記事です</a></h1> <p>composer.jsonを書いてライブラリ等を公開したい人向け。利用するだけの人はあまり関係ないかも。</p> <h1 id="classmapが分からなかった"><a href="#classmap%E3%81%8C%E5%88%86%E3%81%8B%E3%82%89%E3%81%AA%E3%81%8B%E3%81%A3%E3%81%9F">classmapが分からなかった</a></h1> <p>composerにクラスマップ作ってくれそうな機能ないかなと思って探したらあった。でも使い方がいまいちわからなかったので調査。</p> <h1 id="classmapの書式"><a href="#classmap%E3%81%AE%E6%9B%B8%E5%BC%8F">classmapの書式</a></h1> <pre><code class="json">{ "autoload":{ "classmap": ["src/", "something.php"] } } </code></pre> <h1 id="試しにクラスを置いてみる"><a href="#%E8%A9%A6%E3%81%97%E3%81%AB%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%92%E7%BD%AE%E3%81%84%E3%81%A6%E3%81%BF%E3%82%8B">試しにクラスを置いてみる</a></h1> <pre><code class="cmd">--- proj_root ├ src │ ├ MyClassA.php │ └ MyClassB.php └ MyClassC.php </code></pre> <p>各クラスの中身はこんな感じ。</p> <pre><code class="php"><?php class MyClassA {} </code></pre> <p>composer.jsonはこんな感じ。</p> <pre><code class="json">{ ...(省略)... "autoload":{ "classmap": ["src/", "MyClassC.php"] } } </code></pre> <p>以下のコマンド実行するとオートローダーのクラスマップが生成されます。</p> <pre><code class="cmd">composer update </code></pre> <p>オートローダーのクラスマップ出力先はvendor/composerディレクトリ以下の「autoload_classmap.php」です。</p> <pre><code class="cmd">-vendor └ composer ├ autoload_classmap.php └ ... </code></pre> <p>このファイルの中身はコマンド実行後以下のようになっています。</p> <pre><code class="php"><?php ...(省略)... return array( ... 'MyClassA' => $baseDir . '/src/MyClassA.php', 'MyClassB' => $baseDir . '/src/MyClassB.php', 'MyClassC' => $baseDir . '/MyClassC.php', ); </code></pre> <p>$baseDirの中身はプロジェクトのルートディレクトリになります。つまり、クラス名からクラスファイルへのマップ配列(クラスマップ)が設定されたことになります。</p> <h1 id="classmapはコマンド実行時に生成される固定マップである"><a href="#classmap%E3%81%AF%E3%82%B3%E3%83%9E%E3%83%B3%E3%83%89%E5%AE%9F%E8%A1%8C%E6%99%82%E3%81%AB%E7%94%9F%E6%88%90%E3%81%95%E3%82%8C%E3%82%8B%E5%9B%BA%E5%AE%9A%E3%83%9E%E3%83%83%E3%83%97%E3%81%A7%E3%81%82%E3%82%8B">classmapはコマンド実行時に生成される固定マップである</a></h1> <p>クラスマップは対象ディレクトリへクラスファイルを配置した後、composer updateする必要があることがわかります。つまり動的ではありません。</p> <p>コマンドライブラリやプラグインライブラリのような実行時にならないとクラスファイルが確定しないライブラリの場合上記composerクラスマップでは対応できません。もしくはクラスファイルを配置後、毎回composer updateを実行する必要があるでしょう。</p> <p>そのような場合は別途自前のクラスローダーを実装するとよいでしょう。</p> <p>以上、composerのclassmapについてのメモでした。</p> stk2k tag:crieit.net,2005:PublicArticle/14565 2018-10-10T19:35:48+09:00 2018-10-26T08:28:47+09:00 https://crieit.net/posts/Wordpress-S3-SendGrid-Heroku-Composer Wordpressを無料でS3、SendGrid、Heroku、Composerでデプロイする <p><a href="https://crieit.now.sh/upload_images/3e0a99d4c9d3bf6999aa40837f8a26475bbdd5cd82288.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/3e0a99d4c9d3bf6999aa40837f8a26475bbdd5cd82288.png?mw=700" alt="logo-composer-transparent5.png" /></a></p> <p><a target="_blank" rel="nofollow noopener" href="https://github.com/PhilippHeuer/wordpress-heroku">https://github.com/PhilippHeuer/wordpress-heroku</a></p> <p>こちらのGithubにある「Deploy to heroku」ボタンをクリックすることでも構築できるのですが、画像やプラグインを永続的に維持するためにはローカルに構築してcomposer updateしてから差分をgit pushし、同じソースコードをherokuにデプロイする必要があるのでした。</p> <p>いろいろいじってやってみたところ、なんとかできたので、この後もいろいろ試したいと思う。</p> <p>一番苦労した点は、英語版Wordpressを日本語化する方法だった。</p> <p>ローカルでWP CLIを使って日本語化ファイルをダウンロードし、git pushしたらできた。</p> <p><code>wp core language install ja --activate</code></p> <p>参考URL<br /> <a target="_blank" rel="nofollow noopener" href="https://upd.world/wordpress-cloud9/">https://upd.world/wordpress-cloud9/</a><br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/miya0001/items/96a684e2f819f9d8b4a4">https://qiita.com/miya0001/items/96a684e2f819f9d8b4a4</a><br /> <a target="_blank" rel="nofollow noopener" href="https://qiita.com/fuwamaki/items/8684003bb47197336645">https://qiita.com/fuwamaki/items/8684003bb47197336645</a></p> fk2000 tag:crieit.net,2005:PublicArticle/14466 2018-06-07T09:13:48+09:00 2019-02-28T14:24:27+09:00 https://crieit.net/posts/PHP5-3-PHP7-2 PHP5.3のプロジェクトをPHP7.2にした時の流れ <p>誰かが作っていたものを10年くらい前に引き継いで今も継続している案件がある。何度かサーバーは変わったが、とはいえかなり古いものなのでPHP5.3で動作していた。<br /> ただ、お客さんの依頼で使用したいパッケージで5.3では動かないものが出てきたので、サーバー移転ついでにPHP7.2にした話。</p> <h2 id="環境"><a href="#%E7%92%B0%E5%A2%83">環境</a></h2> <ul> <li>フレームワークなし</li> <li>composerあり</li> </ul> <h2 id="やり方"><a href="#%E3%82%84%E3%82%8A%E6%96%B9">やり方</a></h2> <p>基本的にはとりあえずPHP7.2の環境で動作させてひたすら修正していくだけ。ローカルでも一時的に借りたVPSとかでも何でも良い。自分の場合はDockerを使った。Dockerの詳細は興味ない人もいると思うので最後の方に書く。</p> <p>PHP5.3というのがわりと微妙なところで、結構面倒な部分が出てくる。大きな山となったのは下記2つだった。</p> <h3 id="register_globals"><a href="#register_globals">register_globals</a></h3> <p>古いプロジェクトなのでregister_globalsが有効化されており、しっかりとこの機能を利用して作られてしまっている。今の人は知らないかもしれないが、<code>$_GET</code>とか<code>$_POST</code>とかで受け取る値が自動的に変数となってしまう機能。例えば<code>$_GET['mode']</code>とかがあったら<code>$mode</code>変数として使える便利機能。</p> <p><a target="_blank" rel="nofollow noopener" href="http://php.net/manual/ja/security.globals.php">http://php.net/manual/ja/security.globals.php</a></p> <p>これはPHP5.4で削除されているので当然プロジェクト全体でエラーになる。(特にガッツリ時間をもらっているプロジェクトでもないので、新規機能追加とかは行っているがこの辺のリファクタリングは行われていない)</p> <h4 id="対処方法"><a href="#%E5%AF%BE%E5%87%A6%E6%96%B9%E6%B3%95">対処方法</a></h4> <pre><code class="php">extract($_POST, EXTR_SKIP); extract($_GET, EXTR_SKIP); </code></pre> <p>解決方法としては一番ひどい方法だと思うが、動かなくなるよりはまし。というか元々ひどすぎるのでそれほど変わらない。そもそも今後フレームワーク化してこういった処理は全部消したいので、とりあえず段階的な対応。</p> <h3 id="MySQL接続"><a href="#MySQL%E6%8E%A5%E7%B6%9A">MySQL接続</a></h3> <p>mysql_connectと関連関数が使われていた。これはPHP7では削除されるので、PDOに置き換える必要がある。</p> <p>しかし、前述したとおりフレームワークが使われていないのでmysql_queryをラップした関数が色々と作成されており、ほとんどのページでその関数群が使われている。基本的にはPHP7にするとほとんどのページが動かなくなる。徐々にEloquentに置き換えてはいたが、そんなに少ない量でもないため全部をすぐ置き換えるのには無理がある。</p> <p>そのため、消えたmysql_*関数を全部用意することにした。</p> <pre><code class="php">define('MYSQL_ASSOC', 'assoc'); $conn = new PDO("mysql:host={$host};dbname={$dbname};charset=utf8", $user, $pass); function mysql_query($query) { global $conn; return $conn->query($query); } function mysql_fetch_assoc($statement) { return $statement->fetch(PDO::FETCH_ASSOC); } function mysql_fetch_array($statement, $mode) { return mysql_fetch_assoc($statement); } function mysql_numrows($statement) { return $statement->rowCount(); } function mysql_insert_id() { global $conn; return $conn->lastInsertId(); } function mysql_free_result($statement) { $statement->closeCursor(); } function mysql_error() { global $conn; $info = $conn->errorInfo(); if (isset($info[1])) { return $info[2]; } return null; } function mysql_errno() { global $conn; $info = $conn->errorInfo(); if (isset($info[1])) { return $info[1]; } return null; } function mysql_close($link = null) { } </code></pre> <p>解決方法としては一番ひどい方法だと思うが、動かなくなるよりはまし。というか元々ひどすぎるのでそれほど変わらない。そもそも今後フレームワーク化してこういった処理は全部消したいので、とりあえず段階的な対応。</p> <p>ちなみに今回は使っていないので詳しくは知らないが<br /> <a target="_blank" rel="nofollow noopener" href="https://github.com/dshafik/php7-mysql-shim">dshafik/php7-mysql-shim: A shim for ext/mysql in PHP 7+</a><br /> というのもあるらしい。</p> <h3 id="PEAR"><a href="#PEAR">PEAR</a></h3> <p>PEARは古いプログラムもあるので、下記の様な処理があると全部エラーになる。</p> <pre><code class="php">$var =& Foo::factory(); </code></pre> <p>上記の&がエラーになるので削除していく。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>基本的な対応は上記だが、あとはバージョンの違いでちょっとしたエラーとかも出るので見つけ次第修正していく。本当はテストである程度網羅されている事が望ましいが、古いスクラッチプロジェクトなので当然テストもない。(最近はちょこちょこCI含め追加しているが全く足りない)</p> <p>一通り確認したので先日PHP7.2が走っているサーバーに移転を完了した。</p> <p>ただし、プロジェクトがひどすぎる関係でこれは完成でなくあくまでも分岐点なので、最終的にはLaravelを入れて全部そちらに移行などしたい。既に一部の完全に分離できるバッチ処理等はこのプロジェクトに組み込まずGoで書いていたりする。</p> <p>マイクロサービス化は色々とメリットデメリットがあげられているが、こういった古すぎるプロジェクトに関しては可能なところを分離していくと要らない部分を捨てやすくて良い。(もちろんやり過ぎはよくないと思う)</p> <h2 id="おまけでDocker"><a href="#%E3%81%8A%E3%81%BE%E3%81%91%E3%81%A7Docker">おまけでDocker</a></h2> <pre><code class="dockerfile:Dockerfile">FROM php:7.2-apache RUN apt-get update && apt-get install -y git zlib1g-dev RUN curl -sS https://getcomposer.org/installer | php RUN mv composer.phar /usr/local/bin/composer RUN a2enmod rewrite RUN docker-php-ext-install pdo_mysql mbstring zip </code></pre> <p>```yml:docker-compose.yml<br /> version: '2'<br /> volumes:<br /> mysql_data:<br /> driver: 'local'<br /> services:<br /> mysql:<br /> image: mysql:5.7.19<br /> volumes:<br /> - mysql_data:/var/lib/mysql<br /> - ./mysql:/etc/mysql/conf.d<br /> environment:<br /> - MYSQL_ALLOW_EMPTY_PASSWORD=true</p> <p>phpmyadmin:<br /> image: phpmyadmin/phpmyadmin<br /> environment:<br /> - PMA_ARBITRARY=1<br /> - PMA_HOST=mysql<br /> - PMA_USER=root<br /> - PMA_PASSWORD=<br /> ports:<br /> - 8201:80</p> <p>app:<br /> image: myapp/php:7.2<br /> depends_on:<br /> - mysql<br /> working_dir: /var/www/html<br /> volumes:<br /> - .:/var/www/html<br /> - ./php/php.ini:/usr/local/etc/php/conf.d/myphp.ini<br /> ports:<br /> - "8200:80"<br /> tty: true<br /> stdin_open: true</p> <pre><code><br />```ini:php.ini log_errors = On error_log = /dev/stderr date.timezone = "Asia/Tokyo" </code></pre> <p><code>conf:config.cnf [mysqld] sql_mode=''</code></p> だら@Crieit開発者