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開発者