LoginSignup
1
0

PHP + VSCode + Docker + Xdebugでコーディングテストor競技プログラミング用の環境構築

Last updated at Posted at 2023-01-31

概要

転職活動の際、コーディングテストを受ける機会があるかと思われます。その際、デバッグしながらアルゴリズムを作成した方が、変数内の動きが分かりやすくなり、アルゴリズムの作成もスムーズになると思ったので作成しました。今回は、その構築手順について簡単に説明します。

開発環境

Docker version 20.10.17, build 100c701
Docker Compose version v2.7.0

ディレクリー構造

ディレクトリーの構成は下記の構造となっています。

.
├── .vscode/
│   └── launch.json
├── conf/
│   └── php-xdebug.ini
├── src/
│   └── index.php
├── .gitigrone
├── docker-compose.yml
├── Dockerfile
└── README.md

VScodeの設定

VScodeの拡張機能で、PHP Debugをインストールしておいて下さい。
説明.png

Dockerfile

phpのバージョンに関しては、ご使用したいバージョンに変更して頂いて大丈夫です。

FROM php:8.2-cli

RUN apt-get update && apt-get install -y \
    vim \
    && apt-get clean \
    && rm -rf /var/lib/apt/lists/*

# xdebugの処理追加
RUN pecl install xdebug \
    && docker-php-ext-enable xdebug

docker-compose.yml

必要な物があれば、追加して頂いて大丈夫です。

docker-compose.yml
version: "3.9"
services:
  web:
    build: .
    working_dir: /var/www/html
    container_name: web
    stdin_open: true
    tty: true
    ports:
      - 8080:80
    volumes:
      - ./src:/var/www/html/
      - ./conf/:/usr/local/etc/php/conf.d/

.iniファイル

拡張子が.iniであれば何でも大丈夫です。著者は、php-xdebug.iniと言うファイル名にしてます。

php-xdebug.ini
[xdebug]
; Xdebug内、ステップデバッグを有効化
xdebug.mode = debug

; Xdebugの実行ファイルのパスの設定項目。zend_extension=xdebugがデフォルト設定らしい
; xdebug.soのpath: /usr/local/lib/php/extensions/no-debug-non-zts-xxxxxxxx/xdebug.so
zend_extension = xdebug

; PHPの実行時にデバッグを自動的に開始する
xdebug.start_with_request = yes

; 接続先のホスト
xdebug.client_host = host.docker.internal

; 接続先のポート(Xdebug 3は 9003番のportを推奨している)
xdebug.client_port = 9003

; ログを表示するディレクトリの指定(コンテナー内に入れば確認可能)
xdebug.log=/var/log/xdebug.log

launch.json

VScodeのサイドバーに実行とデバッグの項目があるので、launch.jsonの作成を行います。
追加する内容は、pathMappingsの項目だけで大丈夫です。

launch.json
 "version": "0.2.0",
  "configurations": [
    {
      "name": "PHP debug",
      "type": "php",
      "request": "launch",
      "hostname": "0.0.0.0",
      "port": 9003,
      "pathMappings": {
        "/var/www/html": "${workspaceRoot}/src"
      }
    },
   
     // 省略

  ]

index.php

index.phpに下記のコードを記載する事で、コマンドラインからの入力値を受けることができます。
foreachを使用している理由として、コマンドラインから入力値をコード側に渡す際、ファイルパスが変数の最初に必ず入る為、それを取り除くべく、foreachを使っています。

index.php
<?php
// $argv コマンドラインから実行したときに、 現在のスクリプトに渡されたすべての引数の配列が含まれます
// $argc コマンドラインから実行したときに、 現在のスクリプトに渡された引数の数が含まれます

foreach ($argv as $key => $v) {
    if ($key == 0) {
        continue;
    }
    $array[] = $v;

}

var_dump($array);

デバッグの実行

サイドバーの、実行とデバッグを押下します。
実行とデバッグと記載された近くに、三角ボタンがあると思いので、それを押下してデバッグモードを起動させます。

スクリーンショット 2023-01-31 23.19.17.png

コマンドライン

下記のコマンドをターミナルに打つ事で、$argvに入力した値を渡す事ができます。

docker exec web php ファイル名 標準入力値を入力

# 例 docker exec web php index.php test1 test2 test3
# 今回の環境では、例の記入をターミナルに行う事で、指定した入力値を送ることができる

GitHub

コーディングテスト環境をgithubに記載していますので、詳細内容は確認して頂ければと思います。

感想

今まで、launch.jsonXdebug等の設定をなんとなくでやっていたので、今回は詳細に知れて凄く勉強にはなりました。
次は、pythonで同様の環境を作る予定です。競技プログラミングやコーディングテストは、pythonで書いた方が良い的な 記事を何処かで読んだので、pythonでアルゴリズムの勉強をゴリゴリやっていきたいと思います。

参考資料

【ディレクトリ構造を簡単に書けるツール】tree.nathanfriend.io

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0