tag:crieit.net,2005:https://crieit.net/tags/Xdebug/feed 「Xdebug」の記事 - Crieit Crieitでタグ「Xdebug」に投稿された最近の記事 2022-05-10T22:39:48+09:00 https://crieit.net/tags/Xdebug/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/15748 2020-03-04T22:44:48+09:00 2020-03-04T22:44:48+09:00 https://crieit.net/posts/Docker-Xdebug DockerでXdebugのインストールを失敗した場合 <p>DockerのコンテナにXdebugをインストールしようとして失敗した。<br /> 発生したエラーは以下の2点。</p> <ul> <li>autoconfがインストールされていなかった</li> <li>Cコンパイラがインストールされていなかった</li> </ul> <h2 id="実行環境"><a href="#%E5%AE%9F%E8%A1%8C%E7%92%B0%E5%A2%83">実行環境</a></h2> <ul> <li>Docker 2.2.0.0</li> <li>PHP 7.4 <ul> <li><a target="_blank" rel="nofollow noopener" href="https://hub.docker.com/_/php">php:7.4-fpm-alpine</a></li> </ul></li> <li>Xdebug 2.9.2</li> </ul> <h2 id="その1 autoconfがインストールされていない"><a href="#%E3%81%9D%E3%81%AE1+autoconf%E3%81%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84">その1 autoconfがインストールされていない</a></h2> <p>以下のようなエラーが表示された場合はautoconfがインストールされていない。</p> <pre><code>downloading xdebug-2.9.2.tgz ... Starting to download xdebug-2.9.2.tgz (242,959 bytes) ..................................................done: 242,959 bytes 90 source files, building running: phpize Configuring for: PHP Api Version: 20190902 Zend Module Api No: 20190902 Zend Extension Api No: 320190902 Cannot find autoconf. Please check your autoconf installation and the $PHP_AUTOCONF environment variable. Then, rerun this script. ERROR: `phpize' failed </code></pre> <p>この場合は<code>apk add autoconf</code>を実行してインストールすればよい。</p> <h2 id="その2 コンパイラがインストールされていない"><a href="#%E3%81%9D%E3%81%AE2+%E3%82%B3%E3%83%B3%E3%83%91%E3%82%A4%E3%83%A9%E3%81%8C%E3%82%A4%E3%83%B3%E3%82%B9%E3%83%88%E3%83%BC%E3%83%AB%E3%81%95%E3%82%8C%E3%81%A6%E3%81%84%E3%81%AA%E3%81%84">その2 コンパイラがインストールされていない</a></h2> <p>以下のようなエラーが表示された場合はコンパイラのインストールがされていない。</p> <pre><code>downloading xdebug-2.9.2.tgz ... Starting to download xdebug-2.9.2.tgz (242,959 bytes) ..................................................done: 242,959 bytes 90 source files, building running: phpize Configuring for: PHP Api Version: 20190902 Zend Module Api No: 20190902 Zend Extension Api No: 320190902 building in /tmp/pear/temp/pear-build-defaultuserhmhpmF/xdebug-2.9.2 running: /tmp/pear/temp/xdebug/configure --with-php-config=/usr/local/bin/php-config checking for grep that handles long lines and -e... /bin/grep checking for egrep... /bin/grep -E checking for a sed that does not truncate output... /bin/sed checking for pkg-config... no checking for cc... no checking for gcc... no configure: error: in `/tmp/pear/temp/pear-build-defaultuserhmhpmF/xdebug-2.9.2': configure: error: no acceptable C compiler found in $PATH See `config.log' for more details ERROR: `/tmp/pear/temp/xdebug/configure --with-php-config=/usr/local/bin/php-config' failed </code></pre> <p>この場合は<code>apk add gcc g++ make</code>を実行してインストールすればコンパイルが可能になる。</p> <p>また、<code>apk add build-base</code>の実行でも必要なパッケージのインストールが行える。<br /> <a target="_blank" rel="nofollow noopener" href="https://pkgs.alpinelinux.org/package/edge/main/x86_64/build-base">build-base</a>は以下7つのパッケージをインストールする。</p> <ul> <li>binutils</li> <li>file</li> <li>fortify-headers</li> <li>g++</li> <li>gcc</li> <li>libc-dev</li> <li>make</li> </ul> <h2 id="参考"><a href="#%E5%8F%82%E8%80%83">参考</a></h2> <ul> <li><a target="_blank" rel="nofollow noopener" href="https://qiita.com/ucan-lab/items/fbf021bf69896538e515">php-alpineコンテナにxdebugをインストールする時にハマったメモ - Qiita</a></li> </ul> choco tag:crieit.net,2005:PublicArticle/15075 2019-06-08T10:30:51+09:00 2019-06-08T16:56:35+09:00 https://crieit.net/posts/VSCode-Remote-Development-Docker-PHP VSCodeのRemote DevelopmentでDocker内のPHPでデバッグしてみた <p>VSCodeのStable版でRemote Developmentのプレビュー版が使えるようになったので先日Node.jsで試してみましたが、PHPのXdebugによるデバッグも試してみました。</p> <p>Remote Developmentの拡張機能のインストールは下記の記事と同じです。</p> <p><a href="https://crieit.net/posts/VSCode-Remote-Development-Docker-Node">VSCodeのRemote DevelopmentでDocker内のNodeでデバッグしてみた</a></p> <h2 id="サンプルのプロジェクトをclone"><a href="#%E3%82%B5%E3%83%B3%E3%83%97%E3%83%AB%E3%81%AE%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92clone">サンプルのプロジェクトをclone</a></h2> <p>PHPにもサンプルのプロジェクトがありますので、そちらをcloneしてきます。</p> <pre><code class="bash">git clone https://github.com/microsoft/vscode-remote-try-php.git </code></pre> <h2 id="プロジェクトを開く"><a href="#%E3%83%97%E3%83%AD%E3%82%B8%E3%82%A7%E3%82%AF%E3%83%88%E3%82%92%E9%96%8B%E3%81%8F">プロジェクトを開く</a></h2> <p>cloneしてきたフォルダを開いたら、下記のボタンをクリックして<code>Remote-Containers: Open Folder in Container...</code>を選択します。フォルダを指定するとDockerイメージがビルドされ、コンテナの中でVSCodeが開き直され準備完了です。</p> <p><a href="https://crieit.now.sh/upload_images/28e24fe765e2a0dbb6e3e89900d3918e5cf91706ae5be.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/28e24fe765e2a0dbb6e3e89900d3918e5cf91706ae5be.png?mw=700" alt="" /></a></p> <h2 id="デバッグする"><a href="#%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%99%E3%82%8B">デバッグする</a></h2> <p>基本的な準備はできたのでデバッグしてみます。下記のように、適当な箇所にブレークポイントを設置します。</p> <p><a href="https://crieit.now.sh/upload_images/4ecfb0ac2503416ad07f4c7d9620ef8d5cfb0c4807a61.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/4ecfb0ac2503416ad07f4c7d9620ef8d5cfb0c4807a61.png?mw=700" alt="" /></a></p> <p>デバッグをスタートするためF5を押すか、下記のようにデバッグメニューの実行ボタンをクリックします。</p> <p><a href="https://crieit.now.sh/upload_images/f3db7426d5d8684f8112eb66c62da5885cf91773d62fa.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/f3db7426d5d8684f8112eb66c62da5885cf91773d62fa.png?mw=700" alt="" /></a></p> <p>問題なければ下記のように停止し、変数の中身を見ることができます。</p> <p><a href="https://crieit.now.sh/upload_images/36e18a1d895be4a3b29aef373ded02a85cfb0d08565d8.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/36e18a1d895be4a3b29aef373ded02a85cfb0d08565d8.png?mw=700" alt="" /></a></p> <h2 id="ブラウザアクセスでデバッグする"><a href="#%E3%83%96%E3%83%A9%E3%82%A6%E3%82%B6%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9%E3%81%A7%E3%83%87%E3%83%90%E3%83%83%E3%82%B0%E3%81%99%E3%82%8B">ブラウザアクセスでデバッグする</a></h2> <p>上記の方法だと、コマンドラインでの実行としてのデバッグになりますので、ブラウザでアクセスしてもブレークポイントで停止できません。そのため、サーバーとしての動作でも止められるように<code>.vscode/launch.json</code>のconfigurationsに下記のような設定を追加します。</p> <pre><code class="json"> { "name": "Listen for XDebug", "type": "php", "request": "launch", "port": 9000 }, </code></pre> <p>次にデバッグメニューでその設定を選択して起動します。するとXdebugのListenがスタートします。</p> <p><a href="https://crieit.now.sh/upload_images/64713afd46590527e2d2ed510d190e425cfb0df87ec71.png" target="_blank" rel="nofollow noopener"><img src="https://crieit.now.sh/upload_images/64713afd46590527e2d2ed510d190e425cfb0df87ec71.png?mw=700" alt="" /></a></p> <p>次に、プログラムをサーバー起動させます。これでブラウザからアクセスできるようになります。</p> <pre><code class="bash">php -S localhost:8000 </code></pre> <p>これで<code>http://localhost:8000</code>にブラウザアクセスすると先程の同様にブレークポイントで止まります。</p> <h2 id="まとめ"><a href="#%E3%81%BE%E3%81%A8%E3%82%81">まとめ</a></h2> <p>通常の開発にはあまり使わないかもしれませんが、フレームワークの中の処理を追いたいとか、APIやテストの開発時には便利そうですね。また他の言語も試してみたいと思います。</p> だら@Crieit開発者