PHP | さゆフィクション http://it.kensan.net/it aws wordpress などなどゆるーく書いてます Sat, 12 Oct 2024 03:36:51 +0000 ja hourly 1 https://wordpress.org/?v=6.5.2 https://it.kensan.net/wp-content/uploads/2023/03/cropped-icon-32x32.png PHP | さゆフィクション http://it.kensan.net/it 32 32 PHPバージョンアップの際はPHPComptibilityで静的解析をしてエラーと警告を見つけよう https://it.kensan.net/php%e3%83%90%e3%83%bc%e3%82%b8%e3%83%a7%e3%83%b3%e3%82%a2%e3%83%83%e3%83%97%e3%81%ae%e9%9a%9b%e3%81%afphpcomptibility%e3%81%a7%e9%9d%99%e7%9a%84%e8%a7%a3%e6%9e%90%e3%82%92%e3%81%97%e3%81%a6%e3%82%a8.html Sat, 12 Oct 2024 03:33:03 +0000 http://18.183.115.78/it/?p=2156 PHPバージョンアップの際はPHPComptibilityで静的解析をしてエラーと警告を見つけられるそうです。全部見つけられるわけではないと思いますが、PHPComptibilityで静的解析した方が安心かと思います。

ということでPHPComptibilityを試しにやってみます。

ローカルのPHP実行環境で、PHPComptibilityを動かす感じになりますが、ローカル環境がない場合は、以下のURLをご参照ください。

 

PHPプログラムのコンテナローカル開発環境を最短で立ち上げる簡単な方法(apache×php×mysql)
PHPプログラムのコンテナローカル開発環境を簡単に最短で立ち上げます! 以下を使います! apache htaccess有効な状態 ドキュメントルートの設定は.htaccessで行います! php バージョン8.3 mysql バージョン8...

PHPComptibilityで静的解析してみる

PHPComptibilityのインストール

以下のコマンドでインストールできます。

composer require --dev phpcompatibility/php-compatibility dev-develop

実際に静的解析してみる!!

以下の警告・エラーが出ない想定のプログラムに対して、静的解析してみます!


<?php
print"aaaa";
静的解析実行コマンドは以下です。「/index.php」で解析対象のファイルを指定します。
上記の解析対象のプログラムをindex.phpで作成したので、今回は「/index.php」を指定しています。
現在のディレクトリ配下全てを解析したい場合は「.」を指定することで、ディレクトリ配下全ての解析ができます。
./vendor/bin/phpcs -p ./index.php --standard=PHPCompatibility --runtime-set testVersion 8.3 -d memory_limit=1024M --report-full=8.3_report.txt

解析結果は「8.3_report.txt」に吐き出すようにしています。

上記実行結果、エラー・警告はないため、「8.3_report.txt」はカラでした。

次に警告が出るPHPファイルを上記と同様、index.phpというファイルに作成して解析してみます。

<?php
print"aaaa";

# 8.3非推奨
class foo {
    function name()
    {
        echo "My name is " , get_class() , "\n";
    }
}

以下のコマンドで再度、静的解析してみます。

./vendor/bin/phpcs -p ./index.php --standard=PHPCompatibility --runtime-set testVersion 8.3 -d memory_limit=1024M --report-full=8.3_report.txt

解析結果は以下です。

想定通り、1つ警告が出ました。


FILE: /var/www/html/index.php
--------------------------------------------------------------------------------
FOUND 0 ERRORS AND 1 WARNING AFFECTING 1 LINE
--------------------------------------------------------------------------------
 8 | WARNING | Calling get_class() without the $object argument is deprecated
   |         | since PHP 8.3.
--------------------------------------------------------------------------------


 

今度はさらにエラーが出るPHPソースをindex.phpに追加して、解析してみます。

解析対象のソースは以下です。

<?php
print"aaaa";

# 8.3非推奨
class foo {
    function name()
    {
        echo "My name is " , get_class() , "\n";
    }
}

# 8.0削除
implode([1,2,3], ',');

以下のコマンドで解析します。

./vendor/bin/phpcs -p ./index.php --standard=PHPCompatibility --runtime-set testVersion 8.3 -d memory_limit=1024M --report-full=8.3_report.txt

解析結果は以下の通りになりました。


FILE: /var/www/html/index.php
--------------------------------------------------------------------------------
FOUND 1 ERROR AND 1 WARNING AFFECTING 2 LINES
--------------------------------------------------------------------------------
  8 | WARNING | Calling get_class() without the $object argument is deprecated
    |         | since PHP 8.3.
 13 | ERROR   | Passing the $glue and $pieces parameters in reverse order to
    |         | implode has been deprecated since PHP 7.4 and is removed since
    |         | PHP 8.0; $glue should be the first parameter and $pieces the
    |         | second
--------------------------------------------------------------------------------

想定通り、1つエラーがつかされましたが出ました。

まとめ

簡単にPHPComptibilityで静的解析ができました。

PHPバージョンアップの際はPHPComptibilityで静的解析した方が安心かと思います!!

]]>
PHPプログラムのコンテナローカル開発環境を最短で立ち上げる簡単な方法(apache×php×mysql) https://it.kensan.net/php_container_apache_mysql.html Thu, 10 Oct 2024 05:40:50 +0000 http://13.231.168.135/it/?p=2139 PHPプログラムのコンテナローカル開発環境を簡単に最短で立ち上げます!

以下を使います!

  • apache
    • htaccess有効な状態
      • ドキュメントルートの設定は.htaccessで行います!
  • php
    • バージョン8.3
  • mysql
    • バージョン8

必要なファイル作成

以下のファイルをphpファイルが格納されているフォルダの直下に作成します。

  • docker-compose
  • Dockerfile
  • .htaccess

docker-composeファイル

<ファイル名>

docker-compose.yml

<ファイルの中身>

version: '3'

services:
    php:
        build:
            # Dockerfileを格納するフォルダのパス
            context: .
            # Dockerfileのファイル名
            dockerfile: Dockerfile
        volumes:
            - .:/var/www/html
        ports:
            - 8000:80
        container_name: php8.3
    mysql:
        image: mysql:8.0
        volumes:
            - /var/lib/mysql
        environment:
            - MYSQL_ROOT_PASSWORD=root
            - MYSQL_DATABASE=test
            - MYSQL_USER=test
            - MYSQL_PASSWORD=test
        container_name: mysql8.0

mysqlはimageの指定箇所のバージョン変更することで別バージョンで立ち上げることも可能です。

Dockerfile

<ファイル名>

Dockerfile

<ファイルの中身>


FROM php:8.3-apache
# htaccess有効化
RUN  a2enmod rewrite
#composer install
COPY --from=composer /usr/bin/composer /usr/bin/composer

Fromの後のバージョンをいじることで、8.3以外のPHPを入れることも可能です。

composerは一応入れておきます。なくてもOK

.htaccess

<ファイル名>

.htaccess

<ファイルの中身>


RewriteEngine on
RewriteBase /
RewriteRule ^$ {ドキュメンルートへのパス} [L]
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^(.+)$ {ドキュメンルートへのパス}$1 [L]

{ドキュメンルートへのパス}はご自身の環境に合わせてくださいー

動作確認

以下のコマンドでコンテナを立ち上げます。

docker compose up

以下のURLでPHPプログラムが想定通り動いていれば成功です!

http://localhost:8000/

ちなみに以下のコマンドでコンテナに入れます

docker compose exec php bash

まとめ

簡単に、PHPプログラムのコンテナローカル開発環境ができましたー

ちょっと動かしてみたい場合に使えると思います!

]]>
Laravel11をEC2で動かす https://it.kensan.net/ec2-laravel11.html Tue, 14 May 2024 22:56:28 +0000 http://43.207.159.108/it/?p=1917 Laravel11をEC2で動かしてみます。

なるべくお金をかけずに、かつ、高速なLaravel環境を構築したいので、CPUはArm、WEBサーバはNginxを使っていきます

まずは具体的な構成を記載していきます!

構成

  • EC2を使用
    • インスタンスはt4g.mediumを使用
      • t4gは、Arm ベースの AWS Graviton2 のインスタンスです
      • T3 インスタンスよりも価格パフォーマンスが最大で 40% 高いようです
Amazon EC2 T4g インスタンス – Amazon Web Services
AWS Graviton2 プロセッサを搭載した T4g インスタンスは、Amazon EC2 のバースト可能な汎用ワークロードとしては最高のコストパフォーマンスを提供します。
  • OS
    • Amazon Linux 2023
  •  Webサーバ
    • Nginxを使用
    • Apacheより高速
  • PHP
    • バージョン:8.2.15
    • Laravelを動かすのに必要なもの
  • Webサーバで動かすもの
    • Laravel

では実際にEC2起動からLaravelインストールまでやっていきます!

EC2起動

  • 以下の設定でEC2を起動します
    • Amazon マシンイメージ (AMI)でAmazon Linux 2023を指定する
    • アーキテクチャで64ビット(Arm)を指定する
    • インスタンスタイプでt4g.mediumを指定する
    • ネットワーク設定で「からの SSH トラフィックを許可」「インターネットからの HTTP トラフィックを許可」を指定する
      • セキュリティを考慮して、アクセス元は絞った方がいい
    • EC2へはEC2 Instance Connectで接続するため、キーペアはなしでOK

EC2の中に入る

  • 諸々設定するため、以下の流れで起動したEC2の中に入ります
    • AWSコンソールのEC2の一覧で、該当のEC2を選択して、接続を押下
      • EC2 Instance Connectタブの接続を押下

もろもろインストール

パッケージ最新化

  • パッケージ最新化
sudo dnf update -y

Nginxインストール〜設定

  • Nginxインストール
sudo dnf -y install nginx
  • Nginx設定変更
sudo vi /etc/nginx/nginx.conf

serverの箇所を以下通り修正


    server {
        listen       80;
        listen       [::]:80;
        server_name  _;
        root         /usr/share/nginx/html/public;

        # Load configuration files for the default server block.
        include /etc/nginx/default.d/*.conf;

        index index.php;
        location / {
            try_files $uri $uri/ /index.php?$query_string;
        }
        location ~ \.php$ {
            fastcgi_pass unix:/var/run/php-fpm/www.sock;
            fastcgi_index index.php;
            fastcgi_param SCRIPT_FILENAME $realpath_root$fastcgi_script_name;
            include        fastcgi_params;

       }
    }
  • Nginx起動
sudo systemctl start nginx
  • Nginx自動起動をON
sudo systemctl enable nginx
  • ブラウザでNginxが正常に動作していることを確認
    • EC2に割り当てられているパブリックIPにhttpでアクセスする
      • Welcome to nginx!」が出れば、Nginxが起動できているので問題なし

PHPインストール

  • PHPをインストールする
sudo dnf install -y php-fpm php-mysqli php-json php php-devel

php-fpm起動

  • php-fpmを起動します
sudo systemctl start php-fpm.service

 

composerをインストールする

    • composerインストールします
    php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
    php composer-setup.php
    php -r "unlink('composer-setup.php');"
    sudo mv composer.phar /usr/local/bin/composer

     

    Laravel11をインストール

    • Laravel11をインストールします。
    composer create-project --prefer-dist laravel/laravel laravel-project "11.*"
    • 出来上がったファイルをNginxのルートディレクトリにコピー
    sudo cp -r laravel-project/* /usr/share/nginx/html/
    • storageディレクトリの権限設定
    cd /usr/share/nginx/html/
    chmod -R 777 storage
    • .envファイルの作成
    
    vi .env
    
    <ファイルの中身>
    APP_KEY={APIキー}
    DB_CONNECTION=sqlite
    
    APIキーは
    php artisan key:generate
    で発行可能
    •  以下のコマンドでsqlite用ファイルを作成し権限を付与します。
    
    touch database/database.sqlite
    chmod 777 database/database.sqlite
    

    動作確認

    • 動作確認
      • 「http://{EC2のIPアドレス}」にアクセスして、以下の画面表示されればOK〜〜

      ]]>
      Laravel11をECS-Fagateにデプロイする https://it.kensan.net/laravel11-ecs-fagate-deploy.html Sun, 12 May 2024 07:14:00 +0000 http://13.231.204.68/it/?p=1888 Laravel11をECS(Amazon Elastic Container Service)-Fagateにデプロイします!!!

      以下の順で進めていきます。今回はとりあえずFargate上で動くことをゴールにしますので、MySQLは使いません。

      1. ローカルでLaravel11を立ち上げる
      2. ECR(Amazon Elastic Container Registry)にLaravelイメージをpushする
      3. ECRのイメージを使って、ECS(Amazon Elastic Container Service)-Fagateにデプロイ

      まずは、ローカルでLaravel11を起動していきます。

      ローカルでLaravel11を起動する

      まずは、完成系のディレクトリ構成から記載します。

      ディレクトリ構成

      以下のような構成となります。

      
      ├── docker
      │   ├── nginx
      │   │   ├── Dockerfile
      │   │   └── default.conf
      │   └── php
      │       └── Dockerfile
      └── docker-compose.yml

      ディレクトリの作成

      上記ディレクトリ構成を作成するためのディレクトリを作成します。

      mkdir fargate_laravel
      cd fargate_laravel/

      準備はできましたので、ディレクトリ構成に記載のディレクトリとファイルを作成していきます。

      docker-compose.ymlの作成

      docker-compose.ymlを作成します。

      vi docker-compose.yml

      <ファイルの中身>

      
      version: '3'
      services:
        app:
          build:
            context: .
            dockerfile: ./docker/php/Dockerfile
          container_name: app_laravel
          volumes:
            - .:/var/www
        nginx:
          build:
            context: .
            dockerfile: ./docker/nginx/Dockerfile
          container_name: nginx_laravel
          ports:
            - 8000:80
          working_dir: /var/www
          depends_on:
            - app

      nginxのdefault.confを作成

      nginxのdefault.confを作成します。

      mkdir -p docker/nginx
      
      vi docker/nginx/default.conf

      <ファイルの中身>

      
      server {
        listen 80;
        root /var/www/laravel-project/public;
        index index.php;
        location / {
          try_files $uri $uri/ /index.php?$query_string;
        }
        location ~ \.php$ {
          fastcgi_pass 127.0.0.1:9000;   # 正常に動作しない場合は、app:9000に書き換える
          fastcgi_index index.php;
          include fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        }
      }
      

      nginxのDockerfileの作成

      nginxのDockerfileを作成します。

      vi docker/nginx/Dockerfile

      <ファイルの中身>

      FROM nginx:1.25
      COPY  docker/nginx/default.conf /etc/nginx/conf.d/

      アプリコンテナのDockerfile作成

      アプリコンテナのDockerfile作成を作成します。

      mkdir docker/php
      
      vi docker/php/Dockerfile

      <ファイルの中身>

      
      FROM php:8.3-fpm
      
      RUN apt-get update \
        && apt-get install -y zlib1g-dev mariadb-client vim libzip-dev \
        && docker-php-ext-install zip pdo_mysql
      
      #Composer install
      RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
      RUN php composer-setup.php
      RUN php -r "unlink('composer-setup.php');"
      RUN mv composer.phar /usr/local/bin/composer
      
      ENV COMPOSER_ALLOW_SUPERUSER 1
      
      ENV COMPOSER_HOME /composer
      
      ENV PATH $PATH:/composer/vendor/bin
      
      COPY ./ /var/www/
      
      RUN chmod -R 777 /var/www/
      
      WORKDIR /var/www
      
      
      RUN composer global require "laravel/installer"
      

      必要なファイル作成が終わりましたので、コンテナ立ち上げてLaravel11をインストールしていきます。

      コンテナ立ち上げ

      以下のコマンドでコンテナを立ち上げます。

      docker compose up -d

      Laravel 11のインストール

      アプリコンテナの中に入りLaravel11をインストールします。

      # アプリコンテナに入るコマンド
      docker compose exec app bash
      # Laravel11インストールコマンド
      composer create-project --prefer-dist laravel/laravel laravel-project "11.*"

      ブラウザで「http://localhost:8000/」 へアクセスして以下の画面が表示されればOK!

       

       

      次は、ECRにイメージをpushして行きます。

      ECR(Amazon Elastic Container Registry)にLaravelイメージをpush

      以下のコマンドで、AWSの接続設定をしておきます。

      aws configure

      次にECRログインします。

      
      aws ecr get-login-password --region ap-northeast-1 | docker login --username AWS --password-stdin {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com

      以下のコマンドでリポジトリを作成します。

      
      aws ecr create-repository \
              --repository-name laravel.test \
              --image-scanning-configuration scanOnPush=true \
              --region ap-northeast-1 
      
      aws ecr create-repository \
              --repository-name nginx \
              --image-scanning-configuration scanOnPush=true \
              --region ap-northeast-1 

      以下のコマンドでビルドします。

      docker compose up --build 

      Laravelアプリのタグ作成します

      docker tag fargate_laravel-app:latest {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/laravel.test:latest

      Laravelアプリのpushです

      docker push {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/laravel.test:latest

      Nginxのタグ作成します

      docker tag nginx:latest {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest

      Nginxのpushです

      docker push {AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest

      次に、Fagateにデプロイします!

      ECS(Amazon Elastic Container Service)-Fagateにデプロイ

      クラスターの作成

      以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。

      • インフラストラクチャ:AWS Fargate (サーバーレス)

      タスク定義の作成

      以下の設定で作成します。指定箇所以外は任意の値で大丈夫です。

      • インフラストラクチャの要件
        • 起動タイプ:AWS Fargate
        • オペレーティングシステム/アーキテクチャ:自分のPCと一致するもの(基本はx86_64でOK、M1/M2 MacはARM64を選択)
          • この設定に誤りがあると「exec /usr/local/bin/start-container: exec format error」エラーになります。
        • タスクサイズ
          • CPU:.5 vCPU
          • メモリ:1GB
      • コンテナ – 1
        • 名前:app
        • イメージURI:{AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/laravel.test:latest
      • コンテナ – 2
        • 名前:nginx
        • イメージURI:{AWSアカウントID}.dkr.ecr.ap-northeast-1.amazonaws.com/nginx:latest
        • コンテナポート:80
        • アプリケーションプロトコル:HTTP

      タスク起動

      作成したクラスターのタスクタブにある「新しいタスクの実行」を押下

      • コンピューティング設定:起動タイプ
      • デプロイ設定
        • ファミリー:先ほど作成したタスクを設定
        • リビジョン:最新
      • ネットワーキング
        • セキュリティグループ:ポート80の許可を追加

      動作確認

      作成したクラスターのタスクタブの任意のタスクの詳細を開きます。

      パブリックIPが表示されるので、パブリックIPでブラウザからアクセスします。

      以下の画面が表示されればOKです。

      コンテナ利用時のログ出力に関する記事もありますので、気になる方は以下をクリックくださーい

      Laravelをコンテナで運用する際のログ出力は、JSON形式で標準出力した方が良い
      Laravelをコンテナで運用する際のログ出力は、JSON形式で標準出力した方が良いということを書いていきます。 Laravelに限らず、コンテナでは、JSON形式で標準出力が良いと思いますが、Laravelでは簡単にログをJSON形式で標...
      ]]>
      DockerでLaravel 11のローカル開発環境を構築する。ついでにphpmyadminも入れてみる。 https://it.kensan.net/docker-laravel-11-phpmyadmin.html Mon, 06 May 2024 02:07:18 +0000 http://13.112.45.21/it/?p=1844 DockerでLaravel 11のローカル開発環境を構築していきます。

      DB確認用に、phpmyadminもインストールします。

      コンテナは以下のような構成です。本番環境に応用できるように、あえてSailは使いません。

      • アプリコンテナ
        • PHP:8.3をインストールして、Laravel 11をインストールする
      • Nginxコンテナ
        • 最新のNginxをインストール
      • DBコンテナ
        • MySQL:8.0.36をインストール
      • phpmyadminコンテナ
        • 最新のphpmyadminをインストール(現時点の最新バージョン5.2.1をインストール)

      では実際にローカル開発環境を構築していきます。

      各コマンドをコピペで環境構築できます!

      Laravelのローカル開発環境構築

      まずは、完成系のディレクトリ構成から記載します。

      ディレクトリ構成

      以下のような構成となります。

      
      ├── docker
      │   ├── db  # MySQL(DB)コンテナの設定ファイル等を入れるディレクトリ
      │   │   └── my.cnf
      │   ├── nginx  # nginxコンテナの設定ファイル等を入れるディレクトリ
      │   │   └── default.conf
      │   └── php  # アプリ(PHP)コンテナの設定ファイル等を入れるディレクトリ
      │       └── Dockerfile
      └── docker-compose.yml

      ディレクトリの作成

      上記ディレクトリ構成を作成するためのディレクトリを作成します。

      mkdir test_laravel
      cd test_laravel/

      準備はできましたので、ディレクトリ構成に記載のディレクトリとファイルを作成していきます。

      docker-compose.ymlの作成

      docker-compose.ymlを作成します。

      vi docker-compose.yml

      <ファイルの中身>

      
      version: '3'
      services:
        app:
          container_name: app_laravel  
          build: ./docker/php
          volumes:
            - .:/var/www
        nginx:
          image: nginx 
          container_name: nginx
          ports:
            - 8000:80 
          volumes:
            - .:/var/www
            - ./docker/nginx/default.conf:/etc/nginx/conf.d/default.conf
          working_dir: /var/www
          depends_on:
            - app
        db:
          image: mysql:8.0.36
          container_name: db
          environment: 
            MYSQL_ROOT_PASSWORD: password
            MYSQL_DATABASE: database 
          command: mysqld --character-set-server=utf8mb4 --collation-server=utf8mb4_unicode_ci
          volumes:  
            - ./docker/db/data:/var/lib/mysql
            - ./docker/db/my.cnf:/etc/mysql/conf.d/my.cnf 
            - ./docker/db/sql:/docker-entrypoint-initdb.d
          ports:
            - 3306:3306
        # phpMyAdmin
        phpmyadmin:
          container_name: test_phpmyadmin
          image: phpmyadmin
          environment:
          - PMA_USER=root
          - PMA_PASSWORD=password
          ports:
          - 8080:80

      MySQLのmy.confを作成

      MySQLのmy.confを作成します。

      mkdir docker
      
      mkdir docker/db
      
      vi docker/db/my.conf

      <ファイルの中身>

      
      [mysqld]
      character-set-server=utf8mb4
      collation-server=utf8mb4_unicode_ci
      default_authentication_plugin=mysql_native_password
      
      [client]
      default-character-set=utf8mb4

      nginxのdefault.confを作成

      nginxのdefault.confを作成します。

      mkdir docker/nginx
      
      vi docker/nginx/default.conf

      <ファイルの中身>

      
      server {
        listen 80;
        root /var/www/laravel-project/public;
        index index.php;
        location / {
          try_files $uri $uri/ /index.php?$query_string;
        }
        location ~ \.php$ {
          try_files $uri =404;
          fastcgi_split_path_info ^(.+\.php)(/.+)$;
          fastcgi_pass app:9000; 
          fastcgi_index index.php;
          include fastcgi_params;
          fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
          fastcgi_param PATH_INFO $fastcgi_path_info;
        }
      }
      

      アプリコンテナのDockerfile作成

      アプリコンテナのDockerfile作成を作成します。

      mkdir docker/php
      
      vi docker/php/Dockerfile

      <ファイルの中身>

      
      FROM php:8.3-fpm
      
      RUN apt-get update \
        && apt-get install -y zlib1g-dev mariadb-client vim libzip-dev \
        && docker-php-ext-install zip pdo_mysql
      
      #Composer install
      RUN php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
      RUN php composer-setup.php
      RUN php -r "unlink('composer-setup.php');"
      RUN mv composer.phar /usr/local/bin/composer
      
      ENV COMPOSER_ALLOW_SUPERUSER 1
      
      ENV COMPOSER_HOME /composer
      
      ENV PATH $PATH:/composer/vendor/bin
      
      
      WORKDIR /var/www
      
      RUN composer global require "laravel/installer"
      

      必要なファイル作成が終わりましたので、コンテナ立ち上げてLaravel11をインストールしていきます。

      コンテナ立ち上げ

      以下のコマンドでコンテナを立ち上げます。

      docker compose up -d

      Laravel 11のインストール

      アプリコンテナの中に入りLaravel11をインストールします。

      # アプリコンテナに入るコマンド
      docker compose exec app bash
      # Laravel11インストールコマンド
      composer create-project --prefer-dist laravel/laravel laravel-project "11.*"

      DBの接続先をsqlliteからmysqlに変更します。

      vi laravel-project/.env

      <ファイルの中身(DB設定箇所を編集します)>

      DB_CONNECTION=mysql
      DB_HOST=db
      DB_PORT=3306
      DB_DATABASE=laravel
      DB_USERNAME=root
      DB_PASSWORD=password

      以下のコマンドでマイグレーションを実行します。

      cd laravel-project/
      php artisan migrate

      以上で環境が出来上がりましたので、最後に動作確認します!

      動作確認

      • http://localhost:8000/にアクセスして
        • 以下のLaravelの画面が見れればOK
      • http://localhost:8080/にアクセスして
        • phpmyadminが見れればOK

      sailを使う場合

      以下のコマンドでプロジェクトインストールします。

      curl -s "https://laravel.build/example-app" | bash

      以下のコマンドでコンテナを立ち上げます。

      cd プロジェクト名 && ./vendor/bin/sail up

      ブラウザで「http://localhost/」 へアクセスすると以下のエラーが出ます。

      SQLSTATE[42S02]: Base table or view not found: 1146 Table 'laravel.sessions' doesn't exist

      「RUN MIGRATIONS」をクリックした後、「Refresh now」をクリックするとLaravelのスタート画面が表示されます。成功〜〜

      ]]>
      try-catch-finallyの挙動を調べてみる(JavaScript、PHP) https://it.kensan.net/try-catch-finally%e3%81%ae%e6%8c%99%e5%8b%95%e3%82%92%e8%aa%bf%e3%81%b9%e3%81%a6%e3%81%bf%e3%82%8bjavascript%e3%80%81php.html Sat, 28 Mar 2020 05:18:11 +0000 https://verdy-it.xyz/itblog/?p=118 try-catch-finallyの挙動を調べてみる

      try-catch-finallyのcatchの中でreturnや例外発生をさせた場合の挙動を調べてみます。

      対象言語はJavaScript、PHPです。

      結論としては、JavaScriptとPHPで挙動は同じです。

      結論
      • catch内のreturn文は動作しない
      • catch内で例外発生した場合
        • finallyが実行される
        • 例外も発生される

      上記の動作となりました。

      JavaScript

      JavaScriptでcatchの中でreturnした場合

      ↓調査した際のプログラム↓

      function test() {
        try {
          throw 'error'
        }catch(e){
          console.log('catch');
          return 'catch return';
        }finally{
          console.log('finally');
          return 'finally return';
        }
      }
      console.log(test());

      ↓出力結果↓

      catch
      finally
      finally return

      catchのあとにfinallyが実行されていることが分かる

      →catch内のreturn文は動作していない。

      JavaScriptでcatchの中で例外発生した場合

      ↓調査した際のプログラム↓

      unction test() {
        try {
          try {
            throw 'error'
          }catch(e){
            console.log('catch');
            throw 'catch error'
          }finally{
            console.log('finally');
          }
        }catch(e){
          return 'catch error2'
        }
      }
      console.log(test());

      ↓出力結果↓

      catch
      finally
      catch error2

      catchのあとにfinallyが実行されていることが分かる。同時にcatchに投げ、例外も発生している。

      PHP

      PHPでcatchの中でreturnした場合

      ↓調査した際のプログラム↓

      <?php
      try {
          throw new Exception('error');
      } catch(Exception $error) {
          print "catch\n";
          return;
      } finally {
          print "finally\n";
          return;
      }

      ↓出力結果↓

      catch
      finally

      catchのあとにfinallyが実行されていることが分かる

      →JavaScript同様、catch内のreturn文は動作していない。

      PHPでcatchの中で例外発生した場合

      ↓調査した際のプログラム↓

      <?php
      try {
          try {
              throw new Exception('error');
          } catch(Exception $error) {
              print "catch\n";
              throw $error;
          } finally {
              print "finally\n";
          }
      } catch(Exception $error) {
          print "catch2\n";
      }

      ↓出力結果↓

      catch
      finally
      catch2

      JavaScriptと同様にcatchのあとにfinallyが実行されていることが分かる。同時にcatchに投げ、例外も発生している。

      ]]>