Quantcast
Channel: PHP7.4タグが付けられた新着記事 - Qiita
Viewing all 113 articles
Browse latest View live

php7.4でnull合体演算子、からの〜「??=」構文追加

$
0
0

以前
php7.0からの新機能null合体演算子の使い方
で紹介しましたが、

2019/12/01(日)のPHPカンファレンス2019でphp7.4の改善として??=構文の追加が紹介されておりました。

php5
$a['user'] = isset($a['user']) ? $a['user'] : 'nobody';

↓

php7
$a['user'] = $a['user'] ?? 'nobody';

null合体演算子でこう実装できていたものが、
これがさらにphp7.4では

php7.4
$a['user'] ??= 'nobody';

と書けるようになったとさ。

あと、
ショートクロージャはまだしばらくは見慣れそうにないなぁ。。。


PHP7.4の新機能、FFIでGoを使ってみた

$
0
0

PHP7.4がリリースされた

今回のアップデートも目まぐるしい機能が多く追加されました
機能の紹介は既にあるたくさんの記事にお任せするとして、個人的に気になっていた新機能 FFIを試してみます

FFIとは

Foreign Function Interfaceの略でPHPで別の言語を動かせる機能です
Cなどで実装した共有ライブラリを読み込んで、利用することができます
メリットとしては実行速度が速くなることが大きいかと思われます

FFIでGoを利用する

本題です
Goを利用するにはGoで共有ライブラリを実装する必要があります

何故Goを利用するのか

Cより簡単だから

Goで共有ライブラリを作るには

  • packageをmainにする
  • main関数が必要
  • exportする関数に // export [function name]のコメントを書く
  • ビルド時は -buildmode=c-sharedを付ける

今回はフィボナッチ数を計算するプログラムを用意しました
再帰を使っていて数が大きくなるほど計算に時間がかかるサンプルです

packagemainimport"C"//export calcFibonaccifunccalcFibonacci(iuint)uint{ifi<2{returni}returncalcFibonacci(i-1)+calcFibonacci(i-2)}funcmain(){}

ビルド

説明通り -buildmode=c-sharedを付けてビルドします
出力ファイル名は、Windowsの場合は *.dll、macOSでは *.dylib、Linuxでは *.soでしょうか
今回はmacOSを使っているので、 fibonacci.dylibというファイル名を指定しました

ビルドを済ませると指定したファイル名のバイナリと同じ名前の *.hファイルが生成されているはずです
このヘッダーファイルを用いることで他のプログラムから利用することができます
(今回はこのヘッダーファイルを利用しない方法で説明します)

PHPからFFIでGoを利用する

準備が整ったのでいよいよFFIを利用します

cdef関数を利用します
一つ目の引数にC形式での関数定義
二つ目の引数に共有ライブラリへのパスを指定します

$ffi=FFI::cdef('extern unsigned int calcFibonacci(unsigned int p0);','[PATH]/fibonacci.dylib');

あとはこのように呼び出すことができます

echo($ffi->calcFibonacci(10));// 55

以上がFFIからGoを利用する方法です
では、続いてどれだけ実行速度に差が出るか比較してみます

FFIでPHPはどれだけ速くなるか

以下のような検証用プログラムを作成しました
FFIとPHPそれぞれでフィボナッチ数列を40番目まで求めるプログラムです
実行はCLIから行いました

constCOUNT=40;$ffi=FFI::cdef('extern unsigned int calcFibonacci(unsigned int p0);','[PATH]/fibonacci.dylib');// 比較対象のPHP実装サンプルfunctioncalcFibonacci(int$i):int{if($i<2){return$i;}returncalcFibonacci($i-1)+calcFibonacci($i-2);}// Go(FFI)実装の実行速度計測$startTime=microtime(true);for($i=1;$i<=COUNT;$i++){$ffi->calcFibonacci($i);}$time=microtime(true)-$startTime;echo"Go(FFI): {$time}\n";// PHP実装の実行速度計測$startTime=microtime(true);for($i=1;$i<=COUNT;$i++){calcFibonacci($i);}$time=microtime(true)-$startTime;echo"PHP: {$time}\n";

結果

Go(FFI): 1.5760109424591 秒
PHP: 33.616943836212 秒

かなり大きな差が出ていると思います
PHPで重い処理を行う場合に、FFIはかなり強みになると感じました

php7.4のLaravel環境をDockerでつくる

$
0
0

はじめに

DockerでLaravel環境作ってログインできるまでをハンズオン形式で進めます。
ローカル環境ちゃちゃっと作って開発したい人向けなので、詳細説明はありません。
せっかくなので最近リリースされたPHP7.4を使ってみます。

環境

  • php7.4
  • Apache2
  • MySQL5.7

0. 事前準備

0-1. Dockerインストール

Mac,Windows ProならDocker、Homeならdocker toolbox
dockerならHyper-V設定も忘れずに

会社でよくあるWindowsProなら↓を参考に
https://www.koreyome.com/web/docker-install-for-windows/
0. CPU仮想環境設定を確認
1. Hyper-V設定
2. Dockerインストール
3. docker-compose

インストール確認

$ docker-compose -v

0-2. VSCodeのターミナルを準備(任意)

初心者でもつまずかないよう統一して VSCode の Terminal を git bash にしています。
GitBashは入っている前提です。

  1. setting表示 (Ctl+,)
  2. terminal.integrated.shell.windows 入力
  3. Edit in settings.json 選択
  4. GitBash 選択
    (例) "terminal.integrated.shell.windows": "C:\\Program Files\\Git\\bin\\bash.exe"
  5. Terminal表示(Ctl+Shift+@)
  6. 1:bash になる

1. ディレクトリ構成とファイル作成

githubからcloneするか、ファイルを作成してください。

1-1. クローンする場合

git clone https://github.com/qvtec/laravel-docker-base.git

2-1. ファイルを作成する場合

ディレクトリ構成は下記のようになります

docker
├── db
│   └── my.conf
├── php-apache
│   ├── 000-default.conf
│   ├── default-ssl.conf
│   ├── php.ini
│   └── Dockerfile
├── .env
└── docker-compose.yml

Dockerfile 作成

composer も node もインストールしているので、別コンテナにしてもいいかもしれません

Dockerfile
FROM php:7.4.0-apacheCOPY ./php.ini /usr/local/etc/php/COPY ./sites/*.conf /etc/apache2/sites-available/ARG TZ=Asia/TokyoARG NODE_VERSION=8.xRUN set-xe;\
    apt-get update -yqq&&\
    apt-get install-yqq--no-install-recommends\
      apt-utils vim gettext git \
      default-mysql-client \
# for gd
      libfreetype6-dev \
      libjpeg62-turbo-dev \
      libpng-dev \
      libwebp-dev \
      libxpm-dev \
      # for ImageMagick
      libmagickwand-dev \
      # for zip
      libzip-dev zip unzip \
      # for oniguruma
      libonig-dev \
    && docker-php-ext-install bcmath gettext mbstring mysqli pdo pdo_mysql zip \
    && docker-php-ext-configure mbstring --disable-mbregex \
    && docker-php-ext-configure zip --with-libzip \
    # gd
    && docker-php-ext-install -j$(nproc) iconv \
    && docker-php-ext-configure gd --with-freetype-dir=/usr/include/ --with-jpeg-dir=/usr/include/ \
    && docker-php-ext-install -j$(nproc) gd \
    # imagick
    && pecl install imagick \
    && docker-php-ext-enable imagick \
    # enable mod_rewrite
    && a2enmod rewrite \
    # enable ssl
    && a2enmod ssl \
    # enable site
    && a2ensite default-ssl \
    # for ssl
    && apt-get update \
    && apt-get -y install ngrep \
    && openssl req -new -newkey rsa:4096 -days 365 -nodes -x509 -subj "/C=JP/CN=localhost" \
        -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt \
    # set timezone
    && ln -snf /usr/share/zoneinfo/$TZ /etc/localtime && echo $TZ > /etc/timezone \
    # node
    && curl -sL https://deb.nodesource.com/setup_$NODE_VERSION | bash - \
    && apt-get install -y nodejs npm \
    # install composer
    && cd '/' \
    && php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" \
    && php composer-setup.php \
    && php -r "unlink('composer-setup.php');" \
    && mv composer.phar /usr/local/bin/composer

ENV COMPOSER_ALLOW_SUPERUSER 1ENV COMPOSER_HOME /composerENV PATH $PATH:/composer/vendor/bin# laravel installerRUN composer global require "laravel/installer"\
&& composer global require "laravel/envoy"WORKDIR /var/www/html

docker-compose.yml 作成

docker-compose.yml
version:'3'services:work:build:context:./phpvolumes:-${PROJECT_PATH}:/var/www/html:cached-node_modules:/var/www/html/node_modulesports:-${WEB_PORT}:80-${WEB_SSL_PORT}:443depends_on:-mysqlmysql:image:mysql:5.7volumes:-mysql_data:/var/lib/mysqlenvironment:MYSQL_ROOT_PASSWORD:rootMYSQL_DATABASE:${DB_NAME}MYSQL_USER:${DB_USER}MYSQL_PASSWORD:${DB_PASS}TZ:${TZ}ports:-${DB_PORT}:3306phpmyadmin:image:phpmyadmin/phpmyadminenvironment:-PMA_ARBITRARY=1-PMA_HOST=mysql-PMA_USER=root-PMA_PASSWORD=rootports:-${PMA_PORT}:80redis:image:redis:latestports:-${REDIS_PORT}:6379volumes:-redis_data:/datacommand:redis-servervolumes:mysql_data:node_modules:redis_data:

.env 作成

COMPOSE_PROJECT_NAME はプロジェクト名に変更する
使っていないポートにする

.env
COMPOSE_PROJECT_NAME=laravel-docker-base
PROJECT_PATH=../src

WEB_PORT=80
WEB_SSL_PORT=443
DB_PORT=3306
PMA_PORT=8080
REDIS_PORT=6379

TZ=Asia/Tokyo
DB_NAME=docker
DB_USER=docker
DB_PASS=secret

apache conf 作成

httpとhttpsの両方を作成します

000-default.conf
<VirtualHost *:80>
  ServerName local.test.com
  DocumentRoot /var/www/html/public/

  <Directory /var/www/html/public>
    Options Indexes FollowSymLinks MultiViews
    AllowOverride All
    Require all granted
  </Directory>

  ErrorLog /var/log/apache2/error.log
  CustomLog /var/log/apache2/access.log combined
</VirtualHost>

ssl が不要の場合は、下記ファイルが不要で
Dockerfile の a2ensite default-sslと # for ssl の項目を削除する

default-ssl.conf
<IfModule mod_ssl.c>
    <VirtualHost _default_:443>
        ServerName local.test.com
        DocumentRoot /var/www/html/public
        ErrorLog /var/log/apache2/error.log
        CustomLog /var/log/apache2/access.log combined
        SSLEngine on
        SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
        SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
        <FilesMatch "\.(cgi|shtml|phtml|php)$">
            SSLOptions +StdEnvVars
        </FilesMatch>

        <Directory /usr/lib/cgi-bin>
            SSLOptions +StdEnvVars
        </Directory>
        Options Indexes FollowSymLinks

        <Directory "/var/www/html/public/">
            AllowOverride All
            Require all granted
        </Directory>
    </VirtualHost>
</IfModule>

php 設定ファイル

php.ini
[Date]date.timezone="Asia/Tokyo"[mbstring]mbstring.internal_encoding="UTF-8"mbstring.language="Japanese"

mysql 設定ファイル

my.conf
[mysqld]
character-set-server=utf8
datadir = /var/lib/mysql

2. Docker起動

2-1. docker設定ファイルの作成

cloneしている場合は.env.exampleをコピーして.envを修正する

cd docker/
cp .env.example .env

2-2. ビルドと起動

docker-compose up -d--build

2-3. コンテナ接続

docker-compose exec work bash

3. Laravelインストール

workコンテナで実行する

3-0. Laravelプロジェクト作成

laravel new

3-1. Laravel設定ファイル

cp .env.example .env
DB_HOST=mysql
DB_USSERNAME=root
DB_PASSWORD=root

CACHE_DRIVER=redis
REDIS_HOST=redis

MAIL_DRIVER=log

3-2. composer install

composer dump-autoload
composer install

3-3. マイグレーション

php artisan migrate

4. hosts設定と表示

127.0.0.1 local.admin.com

https://local.admin.com/

表示できましたか?

エラー対応

ハンズオンでエラーになった人がいたので対処法

ERROR: for web Cannot create container for service web: b'Drive sharing failed for an unknown reason'
ERROR: Encountered errors while bringing up the project.

bドライブ使ってないと思うので、dockerの設定変更が必要
http://kdnakt.hatenablog.com/entry/2019/09/12/080000

xamppでmysqlが接続できなくなった

ポート変更が必要
.envで3306→3316とか使ってないポートに変更する

さいごに

laradockを使っていましたが遅かったので、phpの公式のphp-apacheを使うようになりました。
まだdocker歴が短いので、ベストな状態かはわかりません。
なにかあれば教えてください。

Vagrant + VirtualBox で CentOS8 + Nginx + PHP7.4 + MySQL8.0環境を構築する

$
0
0

仕事上、掲題の開発環境を構築する必要があったので構築。
その時のメモを残す。

必要アプリケーション

バージョンは最新で問題ない。自分の環境にあったものを選んでローカルにインストールする。

フォルダ構成

以下のようなフォルダ構成で作成

フォルダ構成
作業フォルダ
 ├ src              // WEBルートにマウントするソースなどを格納
 └ vagrant          // vagrantfileを配置。
   └ Vagrantfile

Vagrantfileの作成

VagrantからVirtualBoxを起動するための設定ファイルを作成する。

CentOS8をマウント

後々配布できるように個別でダウンロードしないで済むようにvagrant cloud上にあるファイルを指定しておく。
https://app.vagrantup.com/generic/boxes/centos8

Vagrantfile
Vagrant.configure("2")do|config|# CentOS8config.vm.box="generic/centos8"end

ネットワーク設定

ネットワーク設定を追加。IPアドレスは適当。
とりあえずprivate指定。
スマホアクセスなどしたいないなら以下を参照。
https://qiita.com/kurkuru/items/4a4879e01944a7c08f1d

Vagrantfile
Vagrant.configure("2")do|config|# CentOS8config.vm.box="generic/centos8"# ネットワーク設定config.vm.network"private_network",ip: "192.168.50.11"end

CPU/メモリ設定

ここも設定は適当。小さすぎず大きすぎずでいいと思う

Vagrantfile
Vagrant.configure("2")do|config|# CentOS8config.vm.box="generic/centos8"# ネットワーク設定config.vm.network"private_network",ip: "192.168.50.11"# メモリ/CPUconfig.vm.provider"virtualbox"do|vb|vb.memory=1024vb.cpus=1endend

同期フォルダ設定

仮想環境上にマウントするソースフォルダの設定を入れる。
開発環境用なので、フルアクセス。
vagrantフォルダをマウントしているのは後々プロビジョンするため。しないなら必要ない。

Vagrantfile
Vagrant.configure("2")do|config|# CentOS8config.vm.box="generic/centos8"# ネットワーク設定config.vm.network"private_network",ip: "192.168.50.11"# メモリ/CPUconfig.vm.provider"virtualbox"do|vb|vb.memory=1024vb.cpus=1end# 同期フォルダconfig.vm.synced_folder"../src",/var/www/[任意の名前],:mount_options=>['dmode=777','fmode=777']config.vm.synced_folder".",'/vagrant',:mount_options=>['dmode=777','fmode=777']end

仮想環境起動確認

作成したVagrantfileを使って仮想環境を立ち上げる。
使用するターミナルツール(コマンドプロンプトやPowershellなど)はなんでもいい。
エラーなく立ち上がてばOK。

cd 作業フォルダ/vagrant
vagrant up

仮想環境にアクセス

vagrantのSSH転送機能を使って楽にアクセス。

vagrant ssh

仮想環境の設定 ※省略可

いよいよnginx,php,mysqlなどをインストールしていくのだが、その前に色々下地を整えておく。
ここで詳細を書くと長くなるので、参考リンクやコマンド単体を記載。

sudo timedatectl set-timezone Asia/Tokyo
  • firewall設定 ※offにしてもいい。
sudo firewall-cmd --add-service=http --permanent# HTTPアクセスの許可sudo firewall-cmd --add-service=https --permanent# HTTPSアクセスの許可sudo firewall-cmd --add-port=9000/tcp --permanent# PHP Xdebug用にポート開放sudo firewall-cmd --reload# offにするならsudo systemctl stop firewalld

設定後vagrantを再起動

vagrant halt
vagrant up

PHP7.4とNginxのインストールと設定

設定ファイルやらなんやらが関係しているので1つの章でまとめる。

Nginxのインストール

sudo dnf install-y nginx

php7.4のインストール

CentOS8の標準は7.2のためリポジトリを先に落とす。

sudo dnf install-y https://dl.fedoraproject.org/pub/epel/epel-release-latest-8.noarch.rpm
sudo dnf install-y https://rpms.remirepo.net/enterprise/remi-release-8.rpm

デフォルトのphpモジュールを切る。
切らないと毎回リポジトリ指定をしてインストールしないといけないため。

sudo dnf module disable -y php 

php7.4をremiからインストール

sudo dnf module install-y php:remi-7.4 
# 関連して php-fpm,php-mbstring,php-json もインストールされる

他必要関連パッケージをインストール。

sudo dnf install-y php-mysqlnd php-pecl-xdebug php-intl php-zip

xdebug設定

開発しやすいように設定を入れる。

/etc/php.d/15-xdebug.ini
#追加
xdebug.default_enable = 1xdebug.remote_enable = Onxdebug.remote_autostart = Onxdebug.remote_connect_back = Onxdebug.remote_port = 9000

php-fpmの設定

nginxでphpを使うために動作ユーザをnginxにしてやる。
他の細かい設定など今回は割愛。
興味がある人は以下を参照。めっちゃ詳しい。
https://qiita.com/kotarella1110/items/634f6fafeb33ae0f51dc

/etc/php-fpm.d/www.conf
# ~~省略
# 追加
listen.owner = nginxlisten.group = nginx#修正
user = nginx#apache から変更
group = nginx#apache から変更
# ~~省略

nginxの設定

今後、いくつか同じ環境上に別サイトを構築する必要があったので、
デフォルトのまま、httpブロックの末尾にconf.dの読み込みを追記

/etc/nginx/nginx.conf
#~~省略
http {
・・・

    include /etc/nginx/conf.d/*.conf;
}

構築サイトの設定を追加
他変なファイルにアクセスさせないなどの設定はあるが割愛。

/etc/nginx/conf.d/default.conf
server {
    listen80;
    server_name  [任意のアクセスドメイン名];
    root    /var/www/[Vagrantfileで設定したルート名];
    indexindex.php;

    charsetutf-8;
    access_log  /var/log/nginx/access.logmain;
    error_log  /var/log/nginx/error.logmain;

    location / {
        try_files $uri $uri/ /index.php$is_args$args;
    }

    # redirect server error pages to the static page /50x.html
error_page500502503504  /50x.html;
    location = /50x.html {
        root   /usr/share/nginx/html;
    }

    # pass the PHP scripts to FastCGI server listening on php-fpm.sock;
location ~ \.php$ {
        includefastcgi_params;
        fastcgi_paramSCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_passunix:/run/php-fpm/php-fpm.sock;
        try_files $uri =404;
    }
}

プロセス再起動。ついでにOS起動時に動くように設定。

sudo systemctl restart nginx
sudo systemctl restart php-fpm
sudo systemctl enable nginx
sudo systemctl enable php-fpm

ブラウザからアクセス確認

ローカルのhostsファイルにローカルのドメインを追加

\Windows\System32\drivers\etc\hosts
# 追記
192.168.50.11 [/etc/nginx/conf.d/default.confで設定したドメイン名]

テストでphpinfoを置く。

cd /var/www/[ルート]
echo'<?php phpinfo();'> index.php

ブラウザから「http://[設定したドメイン名]」にアクセスしてphpinfoが表示されればOK

mysql8.0のインストールと設定

CentOS8だと特に特別ならリポジトリを落とさないでもデフォルトでmysql8がインストールできる。

sudo dnf install-y @mysql

初期設定。
開発環境なので緩い設定(initialize-insecure)にしておく。

sudo rm-rf /var/lib/mysql
sudo  mysqld --initialize-insecure--datadir=/var/lib/mysql --user=mysql

あと色々あるが、以下を入れておけばとりあえずOK。

/etc/my.cnf
# 追加
# mysqlではひらがなカタカナを判別
collation_server = utf8mb4_ja_0900_as_cs_ks

再起動と自動起動設定

sudo systemctl restart mysqld
sudo systemctl enable mysqld

DBの作成とユーザの作成

mysql -u root
> create database [作成したいDB名]
> create 'ユーザ名'@'localhost' IDENTIFIED BY 'パスワード';> grant all privileges on DB名.* TO 'ユーザ名'@'localhost';

以上。

PHP7.4対応版Laradockを、ビルドしただけの話(2019/12/17時点)

$
0
0

この内容は2019/12/17時点の話です。
あなたがこの記事をご覧になっているころには、LaraDockが対策済みになっているかもしれません。
(きっとこの記事を書いている最中にでも修正されているに違いない。)

始めに

本記事はDocker ComposeのプロジェクトであるLaradockのPHP7.4対応版の、以下のサービスを動作させることを目的としています。

  1. workspace
  2. nginx
  3. php-fpm
  4. php-worker
  5. mysql

他のコンテナの動作については言及しません。

各コンテナをビルドする際に変更したファイルと変更箇所

1. mysql/my.cnf

MySQL8を使いたいのでデフォルトに認証方式を変更する。

mysql/my.cnfの最終行に追記
+ default_authentication_plugin=mysql_native_password

2. php-fpm/Dockerfile

--with-libzipオプションがなくなったから削除。

php-fpm/Dockerfileの54行目付近
-     docker-php-ext-configure zip --with-libzip && \
+     docker-php-ext-configure zip && \ 

3. php-worker/Dockerfile

oniguruma-devが必要らしい。

php-worker/Dockerfileの32行目付近
-  supervisor
+  supervisor \
+  oniguruma-dev

--with-libzipオプションがなくなったから削除。

php-worker/Dockerfileの70行目付近
-    docker-php-ext-configure zip --with-libzip && \
+    docker-php-ext-configure zip && \

追伸1

LaradockはPHPのiniファイルで、error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICTと指定されているため、arraystring以外の型に対して配列スタイルでアクセルするとNotice警告でエラー扱いになります。
依存関係のライブラリが対応していないケースがあるため、しっかり動作検証を行う必要がありそうです。
(実際に手元の開発環境で発生しました…。)

追伸2

php本家ドキュメント(https://www.php.net/)の調子が悪いように感じる…。

php7.4からついにクラスのメンバ変数に型宣言できるようになった

$
0
0

php7.4からクラスのプロパティは、新たに型宣言をサポートするようになりました。

遂に!って感じですね。
php7系、特に7.3など使用しているとアップデートするか悩ましいですね。
パフォーマンスの改善も結構されているみたいですし。

<?phpclassUser{publicint$id;publicstring$name;}?>

上の例では、
$user->idにはintの値だけを、$user->nameにはstringの値だけを代入できるように強制します。

PHP 7.3.x から PHP 7.4.x への移行

php7.4から波括弧を使用した配列や文字列のオフセットへのアクセスは非推奨になる

$
0
0

php7.4から波括弧を使って配列や文字列のオフセットにアクセスする文法は推奨されなくなります。

$var{$idx}でなはく $var[$idx]を使って下さい。

$a=[100,2,3,4,5,'a'=>'hoge'];var_dump($a{'a'});
// 出力
string(4) "hoge"

こういう書き方は注意ですね。

というか波括弧でも配列のオフセット指定が動くって知らなかった。。。

波括弧を使った、配列や文字列のオフセットへのアクセス

AWS EC2(Amazon Linux)にPHP7.4をインストール

$
0
0

今年からAWSを使う機会が増えてきました。

で、近々PHP 7.4がインストールされたWebサーバーを用意する必要がありそうなので、
事前に検証した内容をまとめておきたいと思います。

目標

ブラウザでphpinfo()の内容を表示して、PHPのバージョンが7.4であることを確認する

1.インスタンスの作成

利用するインスタンスのタイプは「Amazon Linux 2 AMI(HVM), SSD Volume Type」
image.png

検証なのでインスタンプのタイプは「t2.nano」にしました。

基本的に設定値はデフォルトにして、セキュリティーグループのインバウンドだけ、
SSHとHTTP(HTTPS)での接続を許可させました。(デフォルトはSSHのみ許可)

image.png

2.PHPのインストール

PHPをインストールするためにはSSHでEC2に接続する必要があります。
接続する際はsudoコマンドが使えるアカウントでログインします。
こちらの記事が参考になると思います。

ログインして、php -vを実行するとコマンドがない旨のメッセージが表示されます。
Amazon Linuxはインスタンスを作成した段階では、
PHPが入っていないようです。

$php-v-bash: php: command not found

Aamazon Linuxは最初の段階では、パッケージが古い可能性があり、
ログイン時のメッセージでも`sudo yum update`でアップデートするように促されるので、
おとなしく従います。

       __|  __|_  )
       _|  (     /   Amazon Linux 2 AMI
      ___|\___|___|

https://aws.amazon.com/amazon-linux-2/
8 package(s) needed for security, out of 17 available
Run "sudo yum update" to apply all updates.
$ sudo yum update -y

PHPyumでインストールするんですが、
sudo yum install phpを素直に実行すると、バージョンが5.4のPHPがインストールされていまいます。
これは、Amazon Linuxが持っているリポジトリに、バージョン5.4のPHPしか入っていないためです。

sudo yum install php
Loaded plugins: extras_suggestions, langpacks, priorities, update-motd
amzn2-core                                                                                                                                                        | 2.4 kB  00:00:00
Resolving Dependencies
--> Running transaction check
---> Package php.x86_64 0:5.4.16-46.amzn2.0.2 will be installed
--> Processing Dependency: php-cli(x86-64)= 5.4.16-46.amzn2.0.2 for package: php-5.4.16-46.amzn2.0.2.x86_64
--> Processing Dependency: php-common(x86-64)= 5.4.16-46.amzn2.0.2 for package: php-5.4.16-46.amzn2.0.2.x86_64
--> Processing Dependency: httpd-mmn = 20120211x8664 for package: php-5.4.16-46.amzn2.0.2.x86_64
--> Processing Dependency: httpd for package: php-5.4.16-46.amzn2.0.2.x86_64
--> Running transaction check
---> Package httpd.x86_64 0:2.4.41-1.amzn2.0.1 will be installed
--> Processing Dependency: httpd-tools = 2.4.41-1.amzn2.0.1 for package: httpd-2.4.41-1.amzn2.0.1.x86_64
--> Processing Dependency: httpd-filesystem = 2.4.41-1.amzn2.0.1 for package: httpd-2.4.41-1.amzn2.0.1.x86_64
--> Processing Dependency: system-logos-httpd for package: httpd-2.4.41-1.amzn2.0.1.x86_64
--> Processing Dependency: mod_http2 for package: httpd-2.4.41-1.amzn2.0.1.x86_64
--> Processing Dependency: httpd-filesystem for package: httpd-2.4.41-1.amzn2.0.1.x86_64
--> Processing Dependency: /etc/mime.types for package: httpd-2.4.41-1.amzn2.0.1.x86_64
--> Processing Dependency: libaprutil-1.so.0()(64bit)for package: httpd-2.4.41-1.amzn2.0.1.x86_64
--> Processing Dependency: libapr-1.so.0()(64bit)for package: httpd-2.4.41-1.amzn2.0.1.x86_64
---> Package php-cli.x86_64 0:5.4.16-46.amzn2.0.2 will be installed
---> Package php-common.x86_64 0:5.4.16-46.amzn2.0.2 will be installed
--> Processing Dependency: libzip.so.2()(64bit)for package: php-common-5.4.16-46.amzn2.0.2.x86_64
--> Running transaction check
---> Package apr.x86_64 0:1.6.3-5.amzn2.0.2 will be installed
---> Package apr-util.x86_64 0:1.6.1-5.amzn2.0.2 will be installed
--> Processing Dependency: apr-util-bdb(x86-64)= 1.6.1-5.amzn2.0.2 for package: apr-util-1.6.1-5.amzn2.0.2.x86_64
---> Package generic-logos-httpd.noarch 0:18.0.0-4.amzn2 will be installed
---> Package httpd-filesystem.noarch 0:2.4.41-1.amzn2.0.1 will be installed
---> Package httpd-tools.x86_64 0:2.4.41-1.amzn2.0.1 will be installed
---> Package libzip010-compat.x86_64 0:0.10.1-9.amzn2.0.5 will be installed
---> Package mailcap.noarch 0:2.1.41-2.amzn2 will be installed
---> Package mod_http2.x86_64 0:1.15.3-2.amzn2 will be installed
--> Running transaction check
---> Package apr-util-bdb.x86_64 0:1.6.1-5.amzn2.0.2 will be installed
--> Finished Dependency Resolution

Dependencies Resolved

=========================================================================================================================================================================================
 Package                                           Arch                                 Version                                           Repository                                Size
=========================================================================================================================================================================================
Installing:
 php                                               x86_64                               5.4.16-46.amzn2.0.2                               amzn2-core                               1.4 M
Installing for dependencies:
 apr                                               x86_64                               1.6.3-5.amzn2.0.2                                 amzn2-core                               118 k
 apr-util                                          x86_64                               1.6.1-5.amzn2.0.2                                 amzn2-core                                99 k
 apr-util-bdb                                      x86_64                               1.6.1-5.amzn2.0.2                                 amzn2-core                                19 k
 generic-logos-httpd                               noarch                               18.0.0-4.amzn2                                    amzn2-core                                19 k
 httpd                                             x86_64                               2.4.41-1.amzn2.0.1                                amzn2-core                               1.3 M
 httpd-filesystem                                  noarch                               2.4.41-1.amzn2.0.1                                amzn2-core                                23 k
 httpd-tools                                       x86_64                               2.4.41-1.amzn2.0.1                                amzn2-core                                87 k
 libzip010-compat                                  x86_64                               0.10.1-9.amzn2.0.5                                amzn2-core                                30 k
 mailcap                                           noarch                               2.1.41-2.amzn2                                    amzn2-core                                31 k
 mod_http2                                         x86_64                               1.15.3-2.amzn2                                    amzn2-core                               146 k
 php-cli                                           x86_64                               5.4.16-46.amzn2.0.2                               amzn2-core                               2.8 M
 php-common                                        x86_64                               5.4.16-46.amzn2.0.2                               amzn2-core                               563 k

Transaction Summary
=========================================================================================================================================================================================
Install  1 Package (+12 Dependent packages)

Total download size: 6.6 M
Installed size: 22 M
Is this ok [y/d/N]:

そのため、yumのリポジトリにPHP7.4が入っているremiリポジトリを使えるようにする必要があります。
※remiリポジトリやepel-releaseパッケージに関しては、こちらの記事が参考になります。

$sudo amazon-linux-extras install epel #Amazon Linux でepel-releaseパッケージをインストール出来るようにする$sudo yum install epel-release #epel-releaseパッケージをインストール$sudo rpm -Uvh http://rpms.famillecollet.com/enterprise/remi-release-7.rpm #remiリポジトリを使えるようにする

あとはPHPをインストールするだけです。

$ sudo yum install-y php74 php74-php php74-php-fpm
$ sudo ln-s /usr/bin/php74 /usr/bin/php
$ php -v
PHP 7.4.1 (cli)(built: Dec 17 2019 16:35:58)( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies

3.確認

今回の目的は、ブラウザからPHPのバージョンを確認することなので、
phpinfo()を実行するためのPHPファイルを配置していきます。

Webサーバーはapahceで、ドキュメントルートは/var/www/htmlとなります。

$ httpd -v
Server version: Apache/2.4.41 ()
Server built:   Oct 22 2019 22:59:04
$ cat /etc/httpd/conf/httpd.conf  |grep ^DocumentRoot
DocumentRoot "/var/www/html"$sudo service httpd restart # apacheの再起動
$cat /var/www/html/index.php
<?php
phpinfo();

あとは、EC2サーバーの「パブリック DNS (IPv4)」を、
ブラウザのアドレスに入力して、phpinfo()の結果が表示されることを確認。

image.png

まとめ

今回はPHP7.4のインストールから、確認まで行なってみましたが、
AWSは構築に失敗しても、直ぐに作りなおせるので気軽に試してみることが出来るのがとてもいいです。
手順に不備など有りました、ご指摘いただけると助かります。


Docker(Alpine) + Laravel 環境を PHP7.4 にアップデートする際に oniguruma パッケージのビルドエラー

$
0
0

PHP7.4にアップデートしようとしたらDockerのビルド中にエラーが発生しました。

環境

  • Alpine 3.11
  • PHP 7.4

ビルドエラー

checking for oniguruma... no
configure: error: Package requirements (oniguruma) were not met:

Package 'oniguruma', required by 'virtual:world', not found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables ONIG_CFLAGS
and ONIG_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

対処法

$ apk add --update--no-cache oniguruma-dev

差分: https://github.com/ucan-lab/docker-laravel/pull/38/files

参考

PHP7.4の性能比較 一億回のループとDB500万件からの検索

$
0
0

PHP7.4の性能比較を行ってみました。

現在契約しているレンタルサーバーのグレードをアップしようかなと思い、
ついでと言っては何ですが、どの程度性能が上がるかを確認するために、
PHPそれぞれのバージョンで性能を比較してみました。

比較対象としたバージョンは以下の通りです。
■5.6.40
■7.0.33
■7.1.31
■7.2.21
■7.3.9
■7.4.1

処理としてはPHPでは1億回の単純な足し算をfor文でぶん回す事と
DBはMarriaDBですが、インデックスが貼られていないテーブルから500万行より
適当な文字列の検索を行ってみました。

実行結果としてはこのような感じになりました。

バージョンphp処理時間MySQL処理時間
5.6.4010.96秒3.21秒
7.0.3304.90秒3.06秒
7.1.3104.56秒3.06秒
7.2.2103.17秒2.72秒
7.3.902.50秒3.15秒
7.4.102.10秒3.11秒

この結果より導き出される事は以下三点です。

DBの処理はPHPのバージョンに依存しない

処理時間の差については誤差の範囲です。

5.X系はすぐにでも7.x系にかえましょう

雲泥の差です。

7.x系は大差なしです。

確かにバージョンが上がるたびに処理速度が上がっています。
しかし、この処理はこのような計算です。

$j=0;
for ( $i = 0; $i < 100000000; $i++ ) {
$j=$j+$i;
}

何かコードを描く際に1億回ものループ処理を行うことって通常は無いですよね?
あっても100回~1000回程度だと思います。
コンマ何秒の世界を生きているわけではないのであれば無理してバージョンアップをする必要はないですね。

brew の PHP が 7.4 に上がったら Mcrypt PHP extension required. が出たので対応

$
0
0

Mac OS X 10.15.2 で brew でインストールした PHP のバージョンが 7.4 に上がった際に一部のプログラムが Mycrypt PHP extension required. で動かなくなったのでその対応

mcrypt の手動 Install

$ wget https://pecl.php.net/get/mcrypt-1.0.1.tgz                                                                                                                                                                                                          
$ tar zxvf mcrypt-1.0.1.tgz
$ cd mcrypt-1.0.1
$ phpize
$ ./configure
$ make 
$ make install
$ rm -rf ../mcrypt-1.0.1*

インストールが完了したら PHP の設定を変更する

$ vim /usr/local/etc/php/php7.4/php.ini
...
extension=mcrypt ; mcrypt を読み込むように設定
...

試したこと

あまり調べていないので単純に設定等が足りないだけの可能性もある

pecl でのインストール

PHP7.3 利用時にインストールしていたものがすでにインストールされているということでインストールできなかった

$ sudo pecl install channel://pecl.php.net/mcrypt-1.0.1
pecl/mcrypt is already installed and is the same as the released version 1.0.1
install failed

pecl での再インストール

PHP7.2 から PHP7.3 でないとインストールできなかった

$ sudo pecl uninstall mcrypt-1.0.1
Extension mcrypt disabled in php.ini
uninstall ok: channel://pecl.php.net/mcrypt-1.0.1
$ pecl install mcrypt-1.0.1
pecl/mcrypt requires PHP (version >= 7.2.0, version <= 7.3.0, excluded versions: 7.3.0), installed version is 7.4.1
No valid packages found
install failed

PHP7.4対応版Laradockを、ビルドしただけの話(2019/12/17時点)

$
0
0

この内容は2019/12/17時点の話です。
あなたがこの記事をご覧になっているころには、LaraDockが対策済みになっているかもしれません。
(きっとこの記事を書いている最中にでも修正されているに違いない。)

始めに

本記事はDocker ComposeのプロジェクトであるLaradockのPHP7.4対応版の、以下のサービスを動作させることを目的としています。

  1. workspace
  2. nginx
  3. php-fpm
  4. php-worker
  5. mysql

他のコンテナの動作については言及しません。

各コンテナをビルドする際に変更したファイルと変更箇所

1. mysql/my.cnf

MySQL8を使いたいのでデフォルトに認証方式を変更する。

mysql/my.cnfの最終行に追記
+ default_authentication_plugin=mysql_native_password

2. php-fpm/Dockerfile

--with-libzipオプションがなくなったから削除。

php-fpm/Dockerfileの54行目付近
-     docker-php-ext-configure zip --with-libzip && \
+     docker-php-ext-configure zip && \ 

3. php-worker/Dockerfile

oniguruma-devが必要らしい。

php-worker/Dockerfileの32行目付近
-  supervisor
+  supervisor \
+  oniguruma-dev

--with-libzipオプションがなくなったから削除。

php-worker/Dockerfileの70行目付近
-    docker-php-ext-configure zip --with-libzip && \
+    docker-php-ext-configure zip && \

追伸1

LaradockはPHPのiniファイルで、error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICTと指定されているため、arraystring以外の型に対して配列スタイルでアクセルするとNotice警告でエラー扱いになります。
依存関係のライブラリが対応していないケースがあるため、しっかり動作検証を行う必要がありそうです。
(実際に手元の開発環境で発生しました…。)

追伸2

php本家ドキュメント(https://www.php.net/)の調子が悪いように感じる…。

php7.4-apacheイメージのビルド時に "No package 'oniguruma' found" エラーが発生する際の対処

$
0
0

経緯

既存のDocker+php環境を、php7.4にアップグレードすることになりました。

↓元のDockerfile

FROM php:7.3-apache
COPY ./etc/docker/app/conf/*.conf /etc/apache2/sites-available/

RUN apt-get update && apt-get install -y vim zip unzip

RUN set -ex apk --no-cache add postgresql-dev libpq-dev
RUN apt-get install -y libpq-dev \
    && docker-php-ext-install pdo pdo_pgsql pgsql mbstring

RUN pecl install xdebug && \
    docker-php-ext-enable xdebug
COPY ./etc/docker/app/php_conf/xdebug.ini /usr/local/etc/php/conf.d/

RUN a2enmod rewrite

EXPOSE 80

CMD ["apache2-foreground"]

ここからimageの部分を php:7.4-apacheに書き換えてビルドしたところ、以下のエラーが出ました。

configure: error: Package requirements (oniguruma) were not met:

No package 'oniguruma' found

Consider adjusting the PKG_CONFIG_PATH environment variable if you
installed software in a non-standard prefix.

Alternatively, you may set the environment variables ONIG_CFLAGS
and ONIG_LIBS to avoid the need to call pkg-config.
See the pkg-config man page for more details.

解決方法

https://github.com/docker-library/php/issues/880
こちらによると、 mbstringに替わり libonig-devというパッケージを追加する必要があるそう。
以下のように書き換えます。

FROM php:7.4-apache
COPY ./etc/docker/app/conf/*.conf /etc/apache2/sites-available/

RUN apt-get update && apt-get install -y vim zip unzip

RUN set -ex apk --no-cache add postgresql-dev libpq-dev
RUN apt-get install -y libpq-dev \
    libonig-dev \ # 追加
    && docker-php-ext-install pdo pdo_pgsql pgsql # mbstringは削除

RUN pecl install xdebug && \
    docker-php-ext-enable xdebug
COPY ./etc/docker/app/php_conf/xdebug.ini /usr/local/etc/php/conf.d/

RUN a2enmod rewrite

EXPOSE 80

CMD ["apache2-foreground"]

これで正常にビルドが完了しました。

php7.4からimplode関数の引数順序の推奨について

$
0
0

implode()は配列の要素を文字列により連結する関数ですが、
explode()とは違ってimplode()は引数のarrayと連結文字のstringの指定順が逆でも動作していました。

それがphp7.4から非推奨になります。
php7.4でE_DEPRECATEDとなり、php8で削除される予定です。
なので現状そのようなコードがあったら、あまり使わない方が好ましいでしょう。

implode()は、歴史的な理由により、引数をどちら の順番でも受けつけることが可能です。

https://www.php.net/manual/ja/function.implode.php

いっつもこの歴史的な理由というのが気になって、どっちだったかごっちゃになるんですよねー。。

docker-composeでWordPress5.3+mysql8.0+PHP7.4+apache2.4を動かす

$
0
0

こんばんは、モバイルコムの派手髪VPoE石黒です。

タイトルの通り、最新バージョンのWordPressを動かしてみた話です。
現時点で最新バージョンのインストール方法が意外と見つからなかったのでメモです。
以下のdocker-compose.ymlでupしてください。

docker-compose.yml
version:'3'services:db:image:mysql:8.0environment:MYSQL_USER:wordpressMYSQL_PASSWORD:wordpressMYSQL_DATABASE:wordpressMYSQL_ROOT_PASSWORD:wordpressvolumes:-./data/db:/var/lib/mysqlrestart:alwayswordpress:depends_on:-dbimage:wordpress:php7.4-apacheports:-"8000:80"restart:alwaysenvironment:WORDPRESS_DB_HOST:db:3306WORDPRESS_DB_PASSWORD:wordpress

ポイントは、wordpressイメージのタグをphp7.4-apacheにしている箇所。
タグ一覧はこちらを参照 https://hub.docker.com/_/wordpress/
現状のlatestではphp7.3がインストールされ、mysql8で動かそうとすると以下のエラーに見舞われます。

The server requested authentication method unknown to the client [caching_sha2_password]")

mysql5.7にダウングレードしたり、mysqlの起動オプションを変更したり、設定を読み込ませることでも解決できるようですが、
php7.4のイメージだと解消するようです。(しました)
どこかの掲示板にて、php7.4-fpm-alpineを指定しろというコメントも見つけたのですが、
それだとapacheモジュールが含まれないため、別途httpインスタンスを立ち上げないといけない模様です。
面倒なのでapacheの含まれているイメージを指定したところ、一撃でした。

おやすみなさい。


php7.4から配列でない値に配列のようにアクセスしたらエラーになる

$
0
0

php7.3からphp7.4への下位互換性のない変更点の1つとして
配列じゃない値に配列のようにアクセスすることができなくなりました。

ちなみにnullに対して以下のようにアクセスすると以下のようになります。

$hoge=null;var_dump($hoge[0]);exit;
出力結果
// php7.3までNULL// php7.4Tryingtoaccessarrayoffsetonvalueoftypenullin/hoge.phponline3trace=>#0 ...

null, bool, int, float または resource 型を ($null["key"] のように) 配列としてアクセスしようとすると、警告が生成されるようになりました。

https://www.php.net/manual/ja/migration74.incompatible.php

地味ですが、今までがよしなに動き過ぎていて、影響範囲が大きめの割と面倒な対応でした。

DockerでCentOS8+apache2.4+php7.4環境を作りwordpressを動かす環境を作る

$
0
0

現在借りているVPSサーバのスペックが低くく、過去にはGoogleさんに100点満点中2点という、あまりにひどい点を頂いたので、それを改善すべく奮闘中です。

GWにはVPSのサーバの乗り換えもしくはスケールアップを行いますが、その際、上モノ(Apahce+php)はいつでもバージョンを上げていけるよう。Dockerを使ってコンテナ化してみようと画策。

まずはタイトルに挙げた環境で環境を作ろうとしてみました。

DockerでCentOS8+apache2.4+php7.4環境を作る

Dockerfileについて

DockerFleとして用意したのは下記のとおりです。

# docker-hubからOSのイメージ引込FROM centos:centos8.1.1911# サーバの日付合わせRUN /bin/cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

# epel-releaseのインストールRUN yum install-y epel-release &&\
    yum clean all

# remiのインストールRUN rpm -ivh http://ftp.riken.jp/Linux/remi/enterprise/remi-release-8.rpm

# yumのアップデートRUN yum update -y&&\
    yum clean all

# 必要なモジュールのインストール(apache)RUN yum -yinstall httpd &&\
    yum clean all

# 必要なモジュールのインストール(php7.4)RUN yum -yinstall php74-php php74-php-mysqli php74-php-gd php74-php-mbstring php74-php-opcache php74-php-xml

# phpコマンドを作成RUN ln /usr/bin/php74 /usr/bin/php

# wordpressインストールディレクトリの所有者をapacheユーザに変更                                              RUN chown-R apache:apache /var/www/html

# php74−php−fpmのサービス永続化RUN systemctl enable php74-php-fpm

# apache サーバのサービス永続化RUN systemctl enable httpd 

# 接続用ポートの穴あけEXPOSE 80

Dokerfileの細かな内容についてはDockerfileの補足で説明していますのでそちらもご覧ください。

dockerイメージの作成

Dockerfileの保存ディレクトリで下記のコマンドを実行

docker build -t wordpress:0.0.1 ./

-tのあとはタグ名なので、wordpressで動かすことを考えてwordpress:0.0.1としました。けど、翌々考えたらwordpressは今回インストールしていないので、名前は変えても良さそうですね。

dockerコンテナの起動

イメージができたらコンテナを起動。

 docker run --privileged --name wordpress -p 80:80 -v [localhostのディレクトリ]:/var/www/html -itd wordpress:0.0.1 /sbin/init

ブラウザで起動確認

dockerコンテナ起動時に指定した「localhostのディレクトリ」にwordpressのモジュールを入れておくと下記のように「wordpressへようこそ」画面が出るはず。ここまでくれば、この記事のゴールです。

スクリーンショット 2020-04-02 21.19.17.png

ここまでたどり着くまでいろいろ調べまくりました。
もともとあるコンテナを使えばもっと手軽にできたと思いますが、勉強がてらDockerfileを作るところから始めたので思いの外時間がかかりましたが、勉強になりましたね。こうやって記事にすることで後で見直すこともできるので一石二鳥です。

Dockerfileの設定の補足

docker-hubからOSのイメージ引込

FROM centos:centos8.1.1191

OSコンテナの引き込みですね。latestでも良かったのですが、一旦執筆時点の最新のバージョンを指定しています。最終的にはlatestにするかもしれません。

サーバの日付合わせ

RUN /bin/cp /usr/share/zoneinfo/Asia/Tokyo /etc/localtime

コンテナの時刻を日本時間に合わせるコマンドです。
ログなどを保管する際、時刻がおかしなことになっていると色々と面倒なので、必要な設定となりますね。

epel-releaseのインストール

RUN yum install -y epel-release &&\
    yum clean all

remiのインストール

RUN rpm -ivh http://ftp.riken.jp/Linux/remi/enterprise/remi-release-8.rpm

php7.4をインストールするためにremiレポジトリをインストールする必要がありますが、まずここにたどり着くまで苦労しました。
CentOS8用のrpmをインストールしないと当然動かないのですが、ネットではremi-release-7.rpmでしか記事が見つからず、適当に7→8に書き換えたらインストールできました。

remiのインストールのに結構手こずりました。

yumのアップデート

RUN yum update -y &&\
    yum clean all

yumのアップデートは必須作業なので、apache、php7.4のインストール前に実行しておきます。

必要なモジュールのインストール(apache)

RUN yum -y install httpd &&\
    yum clean all

apacheのインストールはyum経由ですので特に何も設定は必要ありませんね。

必要なモジュールのインストール(php7.4)

RUN yum -y install php74-php php74-php-mysqli php74-php-gd php74-php-mbstring php74-php-opcache php74-php-xml

phpのモジュールのインストールはphp74でもインストールされますが、動作させるにはphp74-php-xxx といったphp74とモジュールの間にーphpを入れる必要があるというところに行き着くまでにまた手こずりました。

phpコマンドを作成

RUN ln /usr/bin/php74 /usr/bin/php

php7.4を入れた後、phpとコマンドを実行しても何も反応がなく、いろいろ調べた結果、php74がphpのコマンドであることが判明。
このままだと、phpとしてコマンドが実行できないので、リンクを張ってphpでもコマンドが実行できるようにしました。

wordpressインストールディレクトリの所有者をapacheユーザに変更

RUN chown -R apache:apache /var/www/html

apacheサーバの起動ユーザに合わせてwordpress配置ディレクトリのオーナーを変更。

php74-php-fpmのサービス永続化

RUN systemctl enable php74-php-fpm

apacheをインストールしてもwordpresの画面が立ち上がらず何故かと調べていたらphp-fpmがサービスとして起動している費強があるということがわかりました。
コンテナ起動時に自動でサービスが起動するようにサービスを永続化させるようにしました。

apache サーバのサービス永続化

RUN systemctl enable httpd 

apacheもphp-fpm同様サービスとして常に起動するように設定しました。

接続用ポートの穴あけ

EXPOSE 80

http接続できるように80番のポートを開けます。https化を狙って443も開けておく必要がありますが、それはこれからGWまでの課題ですね。

今後の課題

  • https化
  • mysqlとの接続

といったところでしょうか。wordpressの画面は起動しましたがwordpressまではインストールできていないです。
なので、GWまでにはこのあたりを解決したいですね。

PHPエラー一覧

$
0
0

趣味でphpを実装して遊んでいます。(初心者)
それにあたり出力されたエラーと、その原因と対処法を記載していきます。

実施環境

  • Windowsのエディション:Windows 10 Home
  • PHPのバージョン:PHP 7.4.2
  • 使用しているエディタ:Visual Stadio Code

エラー一覧

Notice: Undefined index

  • エラー
    Notice: Undefined index: A1_No in C:\xampp~~\index.php on line 7

  • 原因
    呼び出した配列のキーがセットされていませんよ。と言っている。

index.php
//$_POST[]の中の"A1_No"を表す$A1_No=$_POST["A1_No"]
  • 対処法
    • 配列のキーが必ずセットされるように修正する。(※修正方法は実装によるため、ここでは割愛)
    • issetメソッドを使用して配列が呼び出されていることを確認し、配列がセットされていない場合の対処を埋め込む。以下の例の場合は、エラーを無視する処理を埋め込む。
index.php
<?php//フォームより送信された値を取得する$A1_Yes=null;$A1_No=null;$_POST[]=null;//配列がセットされている場合はtrueを返すif(isset($_POST["A1_No"])){$A1_No=$_POST["A1_No"];echo'$_POST["A1_No"]はセットされています。';}else{//エラー制御演算子'@'(エラーを無視する)@$A1_No=$A1_No;}?>

PHP7.4 php.ini-development と php.ini-production の違い

$
0
0

PHP をインストールすると php.ini-developmentphp.ini-productionの2つのファイルが用意されていますが、どのような違いがあるのか分からなかったので diff を取ってみました。

環境

  • PHP 7.4.5

diff する

$docker run php:7.4.5-cli diff -u /usr/local/etc/php/php.ini-development /usr/local/etc/php/php.ini-production > diff.txt

diff 結果

--- /usr/local/etc/php/php.ini-development  2020-04-17 11:30:36.000000000 +0000
+++ /usr/local/etc/php/php.ini-production   2020-04-17 11:30:36.000000000 +0000
@@ -83,7 +83,7 @@
 ; development version only in development environments, as errors shown to
 ; application users can inadvertently leak otherwise secure information.

-; This is the php.ini-development INI file.
+; This is the php.ini-production INI file.

 ;;;;;;;;;;;;;;;;;;;
 ; Quick Reference ;
@@ -363,7 +363,9 @@

 ; Allows to include or exclude arguments from stack traces generated for exceptions
 ; Default: Off
-zend.exception_ignore_args = Off
+; In production, it is recommended to turn this setting on to prohibit the output 
+; of sensitive information in stack traces
+zend.exception_ignore_args = On

 ;;;;;;;;;;;;;;;;;
 ; Miscellaneous ;
@@ -460,7 +462,7 @@
 ; Development Value: E_ALL
 ; Production Value: E_ALL & ~E_DEPRECATED & ~E_STRICT
 ; http://php.net/error-reporting
-error_reporting = E_ALL
+error_reporting = E_ALL & ~E_DEPRECATED & ~E_STRICT

 ; This directive controls whether or not and where PHP will output errors,
 ; notices and warnings too. Error output is very useful during development, but
@@ -477,7 +479,7 @@
 ; Development Value: On
 ; Production Value: Off
 ; http://php.net/display-errors
-display_errors = On
+display_errors = Off

 ; The display of errors which occur during PHP's startup sequence are handled
 ; separately from display_errors. PHP's default behavior is to suppress those
@@ -488,7 +490,7 @@
 ; Development Value: On
 ; Production Value: Off
 ; http://php.net/display-startup-errors
-display_startup_errors = On
+display_startup_errors = Off

 ; Besides displaying errors, PHP can also log errors to locations such as a
 ; server-specific log, STDERR, or a location specified by the error_log
@@ -525,7 +527,9 @@
 ; This setting is on by default.
 ;report_zend_debug = 0

-; Store the last error/warning message in $php_errormsg (boolean).
+; Store the last error/warning message in $php_errormsg (boolean). Setting this value
+; to On can assist in debugging and is appropriate for development servers. It should
+; however be disabled on production servers.
 ; This directive is DEPRECATED.
 ; Default Value: Off
 ; Development Value: Off
@@ -1186,7 +1190,7 @@

 ; Enable / Disable collection of memory usage statistics by mysqlnd which can be
 ; used to tune and monitor MySQL operations.
-mysqlnd.collect_memory_statistics = On
+mysqlnd.collect_memory_statistics = Off

 ; Records communication from all extensions using mysqlnd to the specified log
 ; file.
@@ -1559,7 +1563,7 @@
 ; Development Value: 1
 ; Production Value: -1
 ; http://php.net/zend.assertions
-zend.assertions = 1
+zend.assertions = -1

 ; Assert(expr); active by default.
 ; http://php.net/assert.active
@@ -1586,8 +1590,6 @@
 ; http://php.net/assert.quiet-eval
 ;assert.quiet_eval = 0

-
-
 [COM]
 ; path to a file containing GUIDs, IIDs or filenames of files with TypeLibs
 ; http://php.net/com.typelib-file
@@ -1881,7 +1883,7 @@

 ; Enables or disables copying of PHP code (text segment) into HUGE PAGES.
 ; This should improve performance, but requires appropriate OS configuration.
-;opcache.huge_code_pages=0
+;opcache.huge_code_pages=1

 ; Validate cached file permissions.
 ;opcache.validate_permission=0

zend.exception_ignore_args

  • development は Off、production は On
  • 有効にすると例外のスタックトレースに引数情報が出なくなる
  • PHP7.4以降の設定

error_reporting

http://php.net/error-reporting

エラー出力レベルを設定します。

  • development は E_ALL、production は E_ALL & ~E_DEPRECATED & ~E_STRICT
  • E_ALL は 全ての PHP エラーを表示する
  • E_ALL & ~E_DEPRECATED & ~E_STRICT は 非推奨の警告エラーを除く PHP エラーを表示する
    • E_DEPRECATED は コードの相互運用性や互換性を維持するために PHP がコードの変更を提案する
    • E_STRICT は 実行時の注意、将来のバージョンで動作しなくなるコードについて警告する
  • https://www.php.net/manual/ja/errorfunc.constants.php

display_errors

http://php.net/display-errors

エラーをHTML出力の一部として画面に出力するかどうかを定義します。

  • development は On、production は Off
  • セキュリティ上、本番では Off推奨

display_startup_errors

http://php.net/display-startup-errors

display_errorsをonにした場合でも、PHPの起動シーケンスにおいて発生したエラーは表示されません。

  • development は On、production は Off
  • セキュリティ上、本番では Off推奨

mysqlnd.collect_memory_statistics

https://www.php.net/manual/ja/mysqlnd.config.php#ini.mysqlnd.collect-memory-statistics

さまざまなメモリ統計情報の収集を有効にします。

  • development は On、production は Off
  • phpinfo()mysqliの統計情報を出力するかどうか

zend.assertions

https://www.php.net/manual/ja/ini.core.php#ini.zend.assertions

アサーションのコードを生成して実行します

  • development は 1、production は -1
  • 1 アサーションのコードを生成して実行します (開発モード)
  • 0 アサーションのコードは生成しますが実行時にはスキップします (実行しません)
  • -1 アサーションのコードを生成せず、アサーションのコストがゼロになります (実運用モード)

opcache.huge_code_pages

https://www.php.net/manual/ja/opcache.configuration.php#ini.opcache.huge_code_pages

PHPコード(textセグメント)を HUGE PAGE にコピーする機能を有効にしたり、無効にしたりできます。

  • development は 0、production は 1
  • パフォーマンスは向上するはずですが、適切なOSの設定が必要です。

(適切なOSの設定って何...? わからないので 0 にしてます。)

参考

PHP7.4 ぼくのかんがえたさいきょうのphp.ini

$
0
0

ストーリー

PHPをインストールしたら必ず行う php.iniの設定ですが、
ネット上ではPHP5系の情報がたくさん出回っており、非推奨または削除された設定例が数多く困り果てていました。

良い感じにまとめてくれてるサイトが見つからなかったので、最強でベストプラクティスな php.ini推奨設定を考えました。
異論は受け付けますので、ぜひコメントください。

参考設定

PHPでは、開発用と本番用の設定例を用意してくれています。
なんと素晴らしいことなんでしょうか。これをベースに設定します。

予め以前の記事で設定の差分を調べておきましたので、よかったらご覧ください。

環境

  • PHP 7.4.5 (執筆時のバージョンです。)

※バージョンが異なる場合は公式サイトで有効な設定か確認してください。

開発用 php.ini

php.ini
zend.exception_ignore_args=offexpose_php=onmax_execution_time=30max_input_vars=1000upload_max_filesize=64Mpost_max_size=128Mmemory_limit=256Merror_reporting=E_ALLdisplay_errors=ondisplay_startup_errors=onlog_errors=onerror_log=/var/log/php/php-error.logdefault_charset=UTF-8[Date]date.timezone=Asia/Tokyo[mysqlnd]mysqlnd.collect_memory_statistics=on[Assertion]zend.assertions=1[mbstring]mbstring.language=Japanese

本番用 php.ini

php.ini
zend.exception_ignore_args=onexpose_php=offmax_execution_time=30max_input_vars=1000upload_max_filesize=64Mpost_max_size=128Mmemory_limit=256Merror_reporting=E_ALL & ~E_DEPRECATED & ~E_STRICTdisplay_errors=offdisplay_startup_errors=offlog_errors=onerror_log=/var/log/php/php-error.logdefault_charset=UTF-8[Date]date.timezone=Asia/Tokyo[mysqlnd]mysqlnd.collect_memory_statistics=off[Assertion]zend.assertions=-1[mbstring]mbstring.language=Japanese[opcache]opcache.enable=1opcache.memory_consumption=128opcache.interned_strings_buffer=8opcache.max_accelerated_files=4000opcache.validate_timestamps=0opcache.huge_code_pages=0opcache.preload=/var/www/preload.phpopcache.preload_user=www-data

オプションの補足

設定値だけだと何を設定しているかわからないので、各項目の補足を付け加えました。

zend.exception_ignore_args

https://www.php.net/manual/ja/migration74.other-changes.php

  • 開発 は off、本番 は on
  • 有効にすると例外のスタックトレースに引数情報が出なくなる
  • PHP7.4以降の設定

expose_php

https://www.php.net/manual/ja/ini.core.php#ini.expose-php

  • 開発 は on、本番 は off
  • 有効にするとHTTPヘッダに X-Powered-By: PHP/7.4.5とPHPのバージョン情報が表示されます。

max_execution_time

https://www.php.net/manual/ja/info.configuration.php#ini.max-execution-time

  • 設定値: 30(秒) デフォルト: 30(秒)
  • 1リクエストあたりの最大実行時間(秒)
  • コマンドラインから実行する場合のデフォルト設定は 0 です。
  • サーバーの負荷を上げることを防止するのに役立ちます。

重たい処理を実行するとこの設定で引っかかるので、その場合はそのコードだけ特別にset_time_limitを呼んであげると良いかもです。

max_input_vars

https://www.php.net/manual/ja/info.configuration.php#ini.max-input-vars

  • 設定値: 1000(個) デフォルト: 1000(個)
  • 1リクエストで受け付ける最大の入力変数の数
  • $_GET, $_POST, $_COOKIEそれぞれ個別に適用されます。
  • 設定値を超える場合は E_WARNINGが発生し、以降の入力変数はリクエストから削除されます。

入力フォームが気が狂ったように多い画面とかは1000超えるかも😇

upload_max_filesize

https://www.php.net/manual/ja/ini.core.php#ini.upload-max-filesize

  • 設定値: 20M デフォルト: 2M
  • アップロードされるファイルの最大サイズ。

スマホの写真サイズも大きいので多めにした方が良き

post_max_size

https://www.php.net/manual/ja/ini.core.php#ini.post-max-size

  • 設定値: 128M デフォルト: 8M
    • upload_max_filesize の設定値より大きくする必要がある。
  • POSTデータに許可される最大サイズを設定します。
  • ファイルアップロードにも影響します。

memory_limit

https://www.php.net/manual/ja/ini.core.php#ini.memory-limit

  • 設定値: 256M デフォルト: 128M
    • post_max_size の設定値より大きくする必要がある。
    • memory_limit > post_max_size > upload_max_filesize
  • 1リクエストあたりの最大メモリ使用量

メモリ設定はサーバーやプロジェクトによるかと思います。
最初から大量に確保するのではなく、必要に応じて上げていくのが良いのかなと思います。

error_reporting

https://www.php.net/manual/ja/errorfunc.configuration.php#ini.error-reporting

  • 開発 は E_ALL、本番 は E_ALL & ~E_DEPRECATED & ~E_STRICT
  • E_ALLは 全ての PHP エラーを表示する
  • E_ALL & ~E_DEPRECATED & ~E_STRICTは 非推奨の警告エラーを除く PHP エラーを表示する。
    • E_DEPRECATEDは コードの相互運用性や互換性を維持するために PHP がコードの変更を提案する。
    • E_STRICTは 実行時の注意、将来のバージョンで動作しなくなるコードについて警告する。

display_errors

http://php.net/display-errors

  • 開発 は on、本番 は off
  • エラーをHTML出力の一部として画面に出力するかどうかを定義します。
  • セキュリティ上、本番では off推奨

display_startup_errors

http://php.net/display-startup-errors

  • 開発 は on、本番 は off
  • display_errorsonにした場合でも、PHPの起動シーケンスにおいて発生したエラーは表示されません。
  • セキュリティ上、本番では off推奨

log_errors

https://www.php.net/manual/ja/errorfunc.configuration.php#ini.log-errors

  • エラーメッセージを、サーバーのエラーログまたはerror_logに記録するかどうかを指します。
  • このオプションはサーバーに依存します。

error_log

https://www.php.net/manual/ja/errorfunc.configuration.php#ini.error-log

  • スクリプトエラーが記録されるファイル名です。

default_charset = UTF-8

https://www.php.net/manual/ja/ini.core.php#ini.default-charset

  • 設定値: UTF-8 デフォルト: UTF-8
  • デフォルト文字コード設定

PHP 5.6.0 以降は "UTF-8" がデフォルトになりますが、念のため明示的に指定します。

date.timezone

https://www.php.net/manual/ja/datetime.configuration.php#ini.date.timezone

  • 設定値: Asia/Tokyo デフォルト: GMT
  • 全ての日付/時刻関数で使用されるデフォルトのタイムゾーン。

mysqlnd.collect_memory_statistics

https://www.php.net/manual/ja/mysqlnd.config.php#ini.mysqlnd.collect-memory-statistics

  • 開発 は on、本番 は off
  • さまざまなメモリ統計情報の収集を有効にします。
  • phpinfo()mysqliの統計情報を出力するかどうか

zend.assertions

https://www.php.net/manual/ja/ini.core.php#ini.zend.assertions

  • 開発 は 1、本番 は -1
  • アサーションのコードを生成して実行します
  • 1 アサーションのコードを生成して実行します (開発モード)
  • 0 アサーションのコードは生成しますが実行時にはスキップします (実行しません)
  • -1 アサーションのコードを生成せず、アサーションのコストがゼロになります (実運用モード)

mbstring.language

https://www.php.net/manual/ja/mbstring.configuration.php#ini.mbstring.language

  • 設定値: Japanese デフォルト: neutral
  • mbstring で使用される言語設定のデフォルト値。

opcache の設定

https://www.php.net/manual/ja/opcache.configuration.php

本番のみ有効にします。
opcacheするとソースコードのキャッシュ、最適化して高速化が見込めます。

ソースコードを変更してもサーバーを再起動しないと変更が反映されなくなるため開発時は使用しません。

opcache.enable

  • オペコード・キャッシュを有効にします。

opcache.memory_consumption

  • OPcache によって使用される共有メモリ・ストレージのサイズ(MB単位)

opcache.interned_strings_buffer

  • インターン (intern) された文字列を格納するために使用されるメモリ量。(MB単位)

opcache.max_accelerated_files

  • OPcache ハッシュテーブルのキー(すなわちスクリプト)の最大数

opcache.validate_timestamps

  • 有効にすると、OPcache は、スクリプトが更新されたか opcache.revalidate_freq 秒ごとにチェックします。
  • 無効にすると、スクリプトの更新をチェックしません。

opcache.huge_code_pages

  • PHPコード(textセグメント)を HUGE PAGE にコピーする機能を有効にしたり、無効にしたりできます。
  • これにより、パフォーマンスは向上するはずですが、適切なOSの設定が必要です。

※適切なOS設定がいまいちわからなかったので、この設定は無効化しています。

opcache.preload

  • サーバが起動した際にコンパイルされ、実行されるPHPスクリプトを指定します。
  • PHP7.4以降の設定

※ここはプロジェクトに合わせて自前で用意する必要があります。これは無理に設定しなくてもokと思います。
※Laravelの場合はこちらのコードを参考にしています。 https://github.com/brendt/laravel-preload/blob/master/preload.php

opcache.preload_user

その他

論理値

設定で使用される論理値(true, false, on, off, yes, no)は大文字・小文字は区別しないようなので、True, On等でも認識されます。
とても柔軟で素敵だと思いました😇😇😇

私のphp.iniはどこ?

ここです。

$php -i | grep php.ini

環境変数を使いたい

普通に環境変数読み込めます。

php.ini
date.timezone=$TZ

参考

Viewing all 113 articles
Browse latest View live