- 投稿日:2021-02-21T23:28:21+09:00
PHP学習
- 投稿日:2021-02-21T22:36:45+09:00
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 setupLaravel8サーバー条件
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-mysqlndphp.iniにてタイムゾーンだけ設定しておく
/etc/php/7.4/apache2/php.initimezone = Asia/Tokyonodejs アップグレード
nvmで入っているので、インストールするだけ
nvm install v15.8.0 nvmLaravel8 インストール
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/composercomposer インストール
composer create-project laravel/laravel example-appApache2設定
デフォルトのドキュメントルートを付け替える
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/ad819d06ea0cd31411dfsudo 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/データベース設定
# 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.envDB_DATABASE=devdb DB_USERNAME=devuser DB_PASSWORD=1234Laravel Starter Kits (Breeze)インストール
cd example-app php artisan migrate composer require laravel/breeze --dev php artisan breeze:install npm install npm run devApache2のrewriteが効かない
a2enmod rewrite して、/var/wwwのoverride Allする
https://qiita.com/ryokurosu/items/7bae243614c0894e048d
/dashboardへアクセス
- 投稿日:2021-02-21T21:16:43+09:00
[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);終わりに
改行コードとか、正規表現とか難しい・・。
参考
プログラム本体
結果確認
オマケ
- 投稿日:2021-02-21T16:42:27+09:00
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_pgsqlAfter
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の拡張を入れる必要に迫られることは少なかった(ぶっちゃけ海外でもこういう人が多いっぽい)ので勉強になりました。
- 投稿日:2021-02-21T13:53:37+09:00
忙しい人のための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/695a30fd38444d065ae5Dockerのトラブルシューティング
コンテナ間での通信やイメージに関するトラブルが多い模様。
- 投稿日:2021-02-21T11:18:47+09:00
(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でテーブルをすべて作り直し解決。
- 投稿日:2021-02-21T08:39:22+09:00
PHPでEXIF情報をjson_encodeする時の注意メモ
EXIFに含まれるUserCommentなどの文字コードがUTF8でない場合にjson_encodeが失敗してるよう。EXIF2.3規格をチラ見すると、そんな感じかなと。
PHPのjson_encodeはUTF8以外の場合失敗してfalseが帰ってきてしまうので、json_encodeを使う時は注意しておかないと駄目ですね。
とりあえず位置情報など欲しい情報だけ取得して返そうかな。とりあえずメモ。


