20210221のPHPに関する記事は7件です。

PHP学習

PHPについて

個人的なアウトプットとしての記事です。
私がPHPについて学習したことについて記述していきます。

PHPとは

アウトプット

21/02/21
関数
・var_dump()
 引数に指定した変数の型を表示する
 デバッグによく使う

・intval()
 引数に指定した変数を数値に変換する
 同義?に (int)"文字列" がある。こちらも文字列部分を数値に変換する。

・strval()
 引数に指定した変数を文字列に変換する
 同義?に (string)数値 がある。こちらも数値部分を文字列に変換する。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

UbuntuでLaravel8

AWS EC2にて

Ubuntu 18.04.5 LTS

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 18.04.5 LTS
Release:        18.04
Codename:       bionic

パッケージ確認

ii  php7.2                           7.2.24-0ubuntu0.18.04.7             all          server-side, HTML-embedded scripting language (metapackage)
ii  php7.2-cli                       7.2.24-0ubuntu0.18.04.7             amd64        command-line interpreter for the PHP scripting language
ii  apache2                          2.4.29-1ubuntu4.14                  amd64        Apache HTTP Server
ii  mysql-server-5.7                 5.7.33-0ubuntu0.18.04.1             amd64        MySQL database server binaries and system database setup

Laravel8サーバー条件

php7.3以上
MySQL5.7以上(migrationの ('email')->unique()がこけるので実質5.7)
nodejs v12.14以上(npmでこけるものがあるのでこれも実質12.14)

php7.4をインストール

php7.2を残したまま切り替えできる
https://www.souichi.club/wordpress/php-version-up/
何故か入っていない、mbstringとdomをインストール

apt install php7.4-mbstring php7.4-xml php7.4-mysqlnd

php.iniにてタイムゾーンだけ設定しておく

/etc/php/7.4/apache2/php.ini
timezone = Asia/Tokyo

nodejs アップグレード

nvmで入っているので、インストールするだけ

nvm install v15.8.0
nvm 

Laravel8 インストール

composerインストールする

composerコマンド、ここから(https://getcomposer.org/download/)

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');"
php -r "if (hash_file('sha384', 'composer-setup.php') === '756890a4488ce9024fc62c56153228907f1545c228516cbf63f885e036d37e9a59d27d63f46af1d4d07ee0f76181c7d3') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;"
php composer-setup.php
php -r "unlink('composer-setup.php');"

mkdir ~/bin
mv composer.phar ~/bin/composer

composer インストール

composer create-project laravel/laravel example-app 

Apache2設定

デフォルトのドキュメントルートを付け替える

ubuntu:~/example-app $ sudo mv /var/www/html /var/www/html_org                                                                                         
ubuntu:~/example-app $ sudo ln -s /home/ubuntu/example-app/public /var/www/html 

パーミッション設定
https://qiita.com/engulisyu/items/ad819d06ea0cd31411df

sudo usermod -a -G www-data ubuntu
sudo chown -R ubuntu:www-data ~/example-app
sudo find ~/example-app -type d -exec chmod 750 {} \;
sudo find ~/example-app -type f -exec chmod 640 {} \;
sudo chmod -R 770 ~/example-app/storage/ ~/example-app/bootstrap/cache/

ここまでで画面でる
スクリーンショット 2021-02-16 16.50.45.png

データベース設定

# mysql
mysql> GRANT ALL PRIVILEGES ON *.* TO devuser@localhost IDENTIFIED BY '1234' WITH GRANT OPTION;
mysql> FLUSH PRIVILEGES;
mysql> CREATE DATABASE devdb CHARACTER SET utf8mb4;
mysql> \q
.env
DB_DATABASE=devdb
DB_USERNAME=devuser
DB_PASSWORD=1234

Laravel Starter Kits (Breeze)インストール

cd example-app
php artisan migrate
composer require laravel/breeze --dev
php artisan breeze:install
npm install
npm run dev

Apache2のrewriteが効かない

a2enmod rewrite して、/var/wwwのoverride Allする
https://qiita.com/ryokurosu/items/7bae243614c0894e048d
/dashboardへアクセス
スクリーンショット 2021-02-16 18.09.36.png

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[php]改行コードを統一する

複数の改行コードが混ざって出力されてしまったファイルの改行コードを統一して出力し直すサンプルコードです。

環境

  • OS: Amazon Linux2
  • PHP: 7.4.14

プログラム本体

今回は、複数の改行コードが混ざって出力されたtsvファイルの改行コードをLFに統一することに加え、CSVファイルとして出力する、という内容になっています。

tsvToCsv.php
<?php
$tsvfile = 'data.tsv';
$csvfile = 'data.csv';

if(file_exists('data.tsv')){
    // 読み込みモードでファイルを開く
    $handle = fopen($tsvfile, 'r');
    $contents = fread($handle, filesize($tsvfile));
    // 改行コードがCRLFもしくはCRの場合に、LFに置換
    // $str = preg_replace('/\t/', ',', preg_replace(['/\r\n/', '/\r/'], "\n", $contents));
    $str = preg_replace('/\t/', ',', preg_replace('/\r\n?/', "\n", $contents));
    // 書き出しモードでファイルを開く(複数回実施の場合は上書きになる)
    $fp = fopen($csvfile, 'w');
    fwrite($fp, $str);
    fclose($fp);
}else{
    echo 'tsvfile is not existed!';
}

ポイント

(1) preg_replace

正規表現検索および置換を行います。
置換元の文字列が複数種類存在する場合は、第1引数に、配列として格納します。
注意点として、配列の前のほうから検索を行うため、CRLF(\r\n)よりも、CR(\r)を前に置いてしまうと、CRLFのCRの部分のみ置換されてしまいます。
必ずCRLF(\r\n)を配列の前の方に格納するようにしましょう。

@il9437 さんのご指摘をもとに、置換元を文字列での記載に変更しました。
「?」を使うことで、0回もしくは1回マッチしたものを対象とすることができます。

結果確認

元ファイルの改行コード

まず、元ファイルであるdata.tsvの内容を確認します。
catコマンドに-Aオプションをつけることで、不可視文字(改行コード、タブ、スペースなど)を確認することができます。

$ cat -A data.tsv
aaa^IAaa^IAAa^IAAA$
bbb^IBbb^IBBb^IBBB^Mccc^ICcc^ICCc^ICCC^M$

登場する不可視文字は以下の通り。

表示 意味 備考
^I タブ -
$ LF 主にUnix系OS全般、Mac OS Xで使用される改行コード
^M$ CRLF 主にWindows系OSで使用される改行コード
^M CR 主に古いMac OS(9以前)で使用されていた改行コード

出力ファイルの改行コード

続いて、出力されたdata.csvの改行コードも確認しておきましょう。

$ cat -A data.csv
aaa,Aaa,AAa,AAA$
bbb,Bbb,BBb,BBB$
ccc,Ccc,CCc,CCC$

不可視文字は「$(LF)」のみになっていますね。うまくいきました!
※TSV→CSVとして出力しているため、「^I(タブ)」だった箇所はカンマ「,」になっています。

オマケ

以下、元となるTSVファイルの出力プログラム。

tsvOutput.php
<?php
$tsvfile = 'data.tsv';
$array = [
    ['aaa', 'Aaa', 'AAa', 'AAA' . "\n"],
    ['bbb', 'Bbb', 'BBb', 'BBB' . "\r"],
    ['ccc', 'Ccc', 'CCc', 'CCC' . "\r\n"]
];

// 追記モードでファイルを開く
$fp = fopen($tsvfile, 'a');
foreach($array as $vals){
    for($i = 0; $i < count($vals); $i++){
        if($i < count($vals) - 1){
            fwrite($fp, $vals[$i]."\t");
        }else{
            fwrite($fp, $vals[$i]);
        }
    }
}
fclose($fp);

終わりに

改行コードとか、正規表現とか難しい・・。

参考

プログラム本体

結果確認

オマケ

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel Horizonインストール時のエラー require ext-pcntl *....への対処法

Laravel8 + PHP 7.4.7のdocker環境でHorizonをインストールしようとしたら、以下のようなエラーが出ました。

$ composer require laravel/horizon
Using version ^5.7 for laravel/horizon
./composer.json has been updated
Running composer update laravel/horizon
Loading composer repositories with package information
Updating dependencies
Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - laravel/horizon[v5.7.0, ..., 5.x-dev] require ext-pcntl * -> it is missing from your system. Install or enable PHP's pcntl extension.
    - Root composer.json requires laravel/horizon ^5.7 -> satisfiable by laravel/horizon[v5.7.0, 5.x-dev].

PHPの拡張pcntl(Process Controll)がないらしいです。

解決策 Dockerfileに拡張機能インストール処理を追記

私の場合、dockerで環境構築していたので、
webサーバー(PHPの処理を書くコンテナ)のDockerfileにpcntlをインストールしました。

Before

FROM php:7.4-apache

# pcntl is requirement of horizon
RUN apt-get update \
    && apt-get install -y zip unzip vim libpq-dev \
    && docker-php-ext-install pdo_mysql pdo_pgsql

After
docker-php-ext-installコマンドの後ろにpcntlを追加

docker-php-ext-installコマンドがない人は、PHPコンテナ内をfindで探し、あるなら下記のように追記、なければ別のPHP拡張インストーラーが入っているはずなので、そのインストーラーの処理に追記しましょう。

FROM php:7.4-apache

# pcntl is requirement of horizon
RUN apt-get update \
    && apt-get install -y zip unzip vim libpq-dev \
    && docker-php-ext-install pdo_mysql pdo_pgsql pcntl

後はコンテナを立て直してcomposer require laravel/horizonすればOK!

$ composer require laravel/horizon

Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
  - Installing laravel/horizon (v5.7.0): Downloading (100%)         
laravel/horizon suggests installing ext-redis (Required to use the Redis PHP driver.)
Package fzaninotto/faker is abandoned, you should avoid using it. No replacement was suggested.
Writing lock file
Generating optimized autoload files
composer/package-versions-deprecated: Generating version class...
composer/package-versions-deprecated: ...done generating version class
> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover --ansi
Discovered Package: facade/ignition
Discovered Package: laravel/ui
Discovered Package: nesbot/carbon
Discovered Package: nunomaduro/collision
Package manifest generated successfully.

代替案 CLIで今すぐインストール

代わりというのもアレですが、既にコンテナが立っている状態であれば、Dockerfileを編集せずにインストールすることも可能です。

// コンテナ内で実行
docker-php-ext-install pcntl


// もしパスが通ってなかったら、コンテナ内でphpなどのパスにないか確認・移動(大抵同じ箇所にある)
which php
# -> /usr/local/bin/php

cd /usr/local/bin
docker-php-ext-install pcntl

以上で完了です!

こんな対応もあるらしい

私自身は「解決策」の方法を取り、導入・動作まで確認できましたが、調べる過程では別の方法も提案されていました。

Laracasts laravel horizon install error
composer require laravel/horizon --ignore-platform-reqsコマンドでインストールする。
オプション(--ignore-platform-reqs)で環境(PHP側の拡張がないこと)を無視してインストールできるらしい。
=> packagistでHorizonのrequiresを見る限り、pcntlがないとヤバそうなので、不採用。

Laracasts Install pcntl ext
PHPをダウンロードして、コマンドを打って設定できるみたい。
既にdockerで環境を作った場合、ここに示されているようなファイルが見つからなかったので見送り。
MAMP環境での導入方法が書かれているので、同じ環境の人は試してもいいかも

資料

Docker上でPHP拡張モジュール『GD』を有効化する
https://laracasts.com/discuss/channels/laravel/install-pcntl-ext
https://github.com/mlocati/docker-php-extension-installer

まとめ

今回の対応は、資料①の記事を多いに参考にさせてもらいました(入れる拡張が違うだけで、やってることは変わらない)。
普段は追加機能の開発でcomposerを使ってライブラリを入れるくらいで、
PHPの拡張を入れる必要に迫られることは少なかった(ぶっちゃけ海外でもこういう人が多いっぽい)ので勉強になりました。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

忙しい人のためのDocker入門

とりあえずDockerって何?と思った人のためのまとめ

Dockerとは

一言でまとめると

ざっくりというと「仮想環境構築のためのツール」。

Dockerのメリット

1、要するに開発環境の構築&破棄が簡単になる。
2、環境による違いをなくせる。
3、クラスタ構成を作るのも楽。

こちらが詳しかった(https://knowledge.sakura.ad.jp/13265/

コード化されたファイルを共有することで、どこでも誰でも同じ環境が作れる。
作成した環境を配布しやすい。
スクラップ&ビルドが容易にできる。
例えば、開発環境(Windows上)では動いていたけどLinuxで動かなかった、といったケースも、開発工程からDockerを活用していくことで防ぎやすくなります。そして、開発工程の中で使っていた環境をそのまま本番環境に持っていくことも可能なため、環境差分が少なく、環境による問題を減らすことができます。作成したDockerイメージを他の人にも渡して使ってもらうことで、各自の環境のバージョンずれ防止や、開発環境準備の短縮化にもつながります。開発環境の準備で、説明不足や手順ミスで、丸一日かかったとなってしまうのはもったいないですよね。私自身も、開発環境からDockerを使っていて、新規メンバ参画時のコスト削減や、環境依存問題を減らせて、役立っています。また、クラスタ構成を構築する場合も、Dockerイメージがあれば、それを起動する名前(コンテナ名)などを変えるだけで、
複数の環境(コンテナ)を起動できるので、一から手順に沿って環境を作る作業もなくなり、クラスタ構成を構築するのも容易になります。これは、コンテナを管理するオーケストレーションツールを使うことで、より運用が楽になります。

Dockerを導入する基準は? Dockerのデメリットは?

こちらが詳しい。https://qiita.com/taishin/items/e1e7153cecb3ffd44a54
要するにインフラや開発サイクルや運用のことまで考えて導入すべきと思われる。
大規模チームで常にリリースする事業会社なら必須だろうが、少人数で小規模な受託開発するならメリットは無さそう。
(ちなみに前々職では意味なかった

Dockerで環境を作る流れ

1,Dockerレジストリ(DockerHub)からDockerイメージ(環境に必要なソフトウェアのことPHP,Apache、MySQLなど)を取得。
2,DockerイメージをDockerコンテナ(仮想環境のこと)として動かす。

DockerでPHPを環境を動かす

こちらが詳しい。https://qiita.com/nemui_/items/f911be7ffa4f29293fd5

DockerでLaravelの開発環境を作る

Laravelの場合はLaradockを使用するらしい。
https://qiita.com/J_Shell/items/695a30fd38444d065ae5

Dockerのトラブルシューティング

コンテナ間での通信やイメージに関するトラブルが多い模様。

https://qiita.com/ft0220/items/2522e2d056eb2b289dc1

https://qiita.com/hatai/items/6375c930488f34d15776

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

(Laravel)外部キーを設定するにはデータ型を揃える。

環境

Windows10
Laravel 8.27.0
XAMPP 8.0.1

問題

Laravelでテーブルを作成し、外部キーを設定しようとしているのにエラーが発生する。

("SQLSTATE[HY000]: General error: 1005 Can't create table `todo`.`folders` (errno: 150 "Foreign key constraint is 
incorrectly formed")

原因

データ型が適切でないことだった。
外部キーを設定する側 \$table->integer('user_id')->unsigned(); //INT(符号なし)
外部キーの対象側 \$table->id(); //BIGINT(符号なし)

解決策

外部キーを設定する側 \$table->bigInteger('user_id')->unsigned(); //BIGINT(符号なし)
外部キーの対象側 \$table->id(); //BIGINT(符号なし)

参照先$table->id()のとき、参照先カラムのデータ型が符号なしのBIGINTだったため、外部キーを設定するカラムも符号なしのBIGINT(符号なし)型$table-bigIngeger('user_id')->unsigned()で指定する必要がある。

データ型を適切に指定し、php artisan migrate:refreshでテーブルをすべて作り直し解決。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPでEXIF情報をjson_encodeする時の注意メモ

EXIFに含まれるUserCommentなどの文字コードがUTF8でない場合にjson_encodeが失敗してるよう。EXIF2.3規格をチラ見すると、そんな感じかなと。

PHPのjson_encodeはUTF8以外の場合失敗してfalseが帰ってきてしまうので、json_encodeを使う時は注意しておかないと駄目ですね。

とりあえず位置情報など欲しい情報だけ取得して返そうかな。とりあえずメモ。

  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む