20210413のPHPに関する記事は14件です。

【Docker】MySQLに接続できないエラー(php_network_getaddresses: getaddrinfo failed: Name or service not known)

Dockerを用いてlaravelの環境構築を試みている時に起こったエラーです。 開発環境 Docker 20.10.5 docker-compose 1.28.5 php 7.2 laravel 7.30.4 Composer 2.0.12 MySQL 8.0 nginx 1.15.12-alpine エラー Dockerで作成したコンテナに入り、MySQLに接続するために php artisan migrateを実行するとターミナルに下記のエラーが表示される。 Illuminate\Database\QueryException SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known (SQL: select * from information_schema.tables where table_schema = development and table_name = migrations and table_type = 'BASE TABLE') at vendor/laravel/framework/src/Illuminate/Database/Connection.php:671 667| // If an exception occurs when attempting to run a query, we'll format the error 668| // message to include the bindings with SQL, which will make this exception a 669| // lot more helpful to the developer instead of just the database's errors. 670| catch (Exception $e) { > 671| throw new QueryException( 672| $query, $this->prepareBindings($bindings), $e 673| ); 674| } 675| +36 vendor frames 37 artisan:37 Illuminate\Foundation\Console\Kernel::handle(Object(Symfony\Component\Console\Input\ArgvInput), Object(Symfony\Component\Console\Output\ConsoleOutput)) 解決策 調べてみると上記エラーは.envでホスト名が間違ってる時に出るものだそうです。 .env DB_CONNECTION=mysql DB_HOST=db DB_PORT=3306 DB_DATABASE=laravel_local DB_USERNAME=laravel_user DB_PASSWORD=laravel123 docker-compose.yml version: '3' services: #省略 mysql: image: mysql:8.0 container_name: app_db ports: - 3306:3306 environment: MYSQL_DATABASE: laravel_local MYSQL_ROOT_USER: root MYSQL_ROOT_PASSWORD: root MYSQL_USER: laravel_user MYSQL_PASSWORD: laravel123 TZ: 'Asia/Tokyo' volumes: - ./docker-config/mysql/data:/var/lib/mysql - ./docker-config/mysql/my.cnf:/etc/mysql/conf.d/my.cnf depends_on: - mysql-volume mysql-volume: image: busybox volumes: - ./docker-config/mysql/data:/var/lib/mysql #省略 .envの中のDB_HOST=dbが誤ってるということなので調べてみると、 DB_HOSTはserviceの名前らしいです。 今回はdocker-compose.ymlでmysqlと命名しているので合わせる必要があります。 .env DB_CONNECTION=mysql DB_HOST=mysql DB_PORT=3306 DB_DATABASE=laravel_local DB_USERNAME=laravel_user DB_PASSWORD=laravel123 これで再度コンテナ内でphp artisan migrateを実行すれば上記のエラーは解消されます。 おまけ(SQLSTATEエラー) このエラーは.envのどこの設定が間違っているかで表示されるものが違うんじゃないかと思い、ロールバックして試してみます。 DB_CONNECTIONが異なる場合 Database connection [DB] not configured. DB_PORTが異なる場合 SQLSTATE[HY000] [2002] Connection refused DB_HOSTが異なる場合 SQLSTATE[HY000] [2002] php_network_getaddresses: getaddrinfo failed: Name or service not known DB_DATABASEが異なる場合 SQLSTATE[HY000] [1045] Access denied for user 'laravel_user'@'%' (using password: YES) DB_USERNAMEが異なる場合 SQLSTATE[HY000] [2054] The server requested authentication method unknown to the client DB_PASSWORDが異なる場合 SQLSTATE[HY000] [1045] Access denied for user 'laravel_user'@'%'
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

ローカルでは動いてたのにサーバーに上げたら"not found"って怒られたときの話

初めに プロジェクトの一環として、先輩から任されたツール作成。 この手のタスクにもだいぶ慣れ、サクッとLaravelでコードを書き上げる。 いつも通りローカルで念入りに動作確認し、無事に動くことを確認する。 そしてAWS上の保守環境へ適用するためにパイプラインを実行。 いざ画面で動作確認... すると、エラー画面へ遷移。 何度やっても「申し訳ありませんが、再度操作をやり直してください」。 「なぜ?」と思いながらCloudWatchへ。 ログ「そんなファイルないぞ」 私「え?」 結論 ファイル名の大文字小文字は正確に打ちましょう。 OSによっては読み込まれないことがあります。 ディレクトリにも大文字小文字を不用意に混ぜないようにしましょう。 詳しいお話 長々と冒頭を書いたが、なんてことはない、ファイル名(というかフォルダ名)の打ち間違いである。 今回のエラーはこれ。とってもシンプル。  View [pages.tool.TestView] not found. そして引っかかったのがコントローラー内の以下のコード。 TestController.php return view('pages.tool.TestView', ['action' => 'get']); 実際のファイル構造はこんな感じ views └pages   └Tool     └ TestView.blade.php ...皆さんもわかっただろう。 "tool"と"Tool"の間違いという、ひっっじょうにしょうもないミスである。 「じゃあなんでローカルだと動いたの?」という話であるが、 どうやらローカルとAWS(EC2)のOSの違いが原因だったらしい。 私のローカル環境  PHPのビルドインサーバーを利用。PCはWindows。 EC2の設定  インスタンスはLinux指定。 ここでこちらの記事から引用させていただくと、 PHPは文法においては大文字小文字を区別しない(ケースインセンシティブ)。 しかしファイル名となると、 これは実はPHPは関係なく、ファイルシステム(OS)に依存します。 一般的にWindowsやmacOSのデフォルトのファイルシステムではファイル名はケースインセンシティブ(大文字小文字を区別しない)、GNU/Linuxではケースセンシティブ(大文字小文字を区別する)です。 つまり、PHPの文法上ではifだろうがIfだろうがIFだろうが許容されるから ファイル名も大文字小文字関係ない...というわけではなく、 ファイル名は大文字小文字をしっかり区別しうるのだ。 そして今回は、ローカル環境がケースインセンシティブなWindowsだったのに対し、 保守環境がケースセンシティブなLinuxだったため、 ローカルではちゃんと動いたにもかかわらず保守環境上でファイルが正しく読み込まれなくなったという話。 まとめ ファイルやフォルダの命名規則はちゃんと守って、 大文字小文字はちゃんと区別しておきましょう。 特に今回は、コントローラーをtoolフォルダに、ビューをToolフォルダに、という あまりにがさつすぎる管理をしていた自分が100%悪いという結果に。 リリース前でほんとよかった... OSによる文字区別については、経験のあるエンジニアの皆さんには常識かもしれないが 自分にとってはかなり衝撃的だった。 ちゃんとサーバーやOSについても理解を深めたいと思った次第である。 参考ページ ・ローカル環境(XAMPP)では読み込めたのに、サーバーにアップすると読み込めないファイルが…。原因はファイル名にある?(https://incloop.com/file-case-differences/) ・Q. PHPは大文字小文字を区別するか?(https://qiita.com/tadsan/items/6c6329eeb43929271119)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

cebe/markdownで改行が<br>に変換されないのに対処する

対処したい問題 phpのシステムにマークダウンパーサを組み込むにあたり、cebe/markdownは有力な選択肢のひとつです。 しかし普通にパースしただけでは改行コードが<br>に変換されないため、こちらの期待する見た目になってくれません。一応、スペースを連続で2つ挿入すると<br>コードに変換されるため改行は実現できるのですが、直感に反した挙動でありユーザフレンドリーとは言えません。 そこでこの記事では、cebe/markdownにおいて改行コードを<br>に変換させる方法を記します。 ※公式ドキュメントを読めば記述があるのですが、日本語での情報が見当たらなかったためこのような記事にしました 例)期待に反する見た目。本文が適切に改行されていない 対処方法 結論となるコードを先に示します。 sample.php $parser = new GithubMarkdown(); // パーサを生成 $parser->enableNewlines = true; // 改行コードを<br>に変換する設定を有効に $parsedText = $parser->parse($markdownText); // パースを実施 例)期待した通りの見た目。本文が適切に改行されている まず「改行コードを<br>に変換する」を実現するためには(cebe/markdownには他の選択肢もありますが)GithubMarkdownである必要があります。 パーサのインスタンスを生成後、$parser->enableNewlines = true;とすることで改行を<br>に変換する設定を有効にします。 あとは通常とおりにパースを実施するだけです。 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[PHP] メモリの上限を無制限にする

概要 Fatal error: Allowed memory size of 1610612736 bytes exhausted... composerでパッケージをインストールする際に上記のエラーが発生することがあります。 原因 このエラーはパッケージがメモリの制限を超えてしまっていることで起きるエラーなので、 php.iniからメモリの制限を開放することでエラーを回避することができます。 方法 php.iniファイルを開く 下記を追加 php.ini memory_limit = -1
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

IntelliJ + Dockerでローカル環境を極力汚さずPHP+MySQL開発環境を構築する

概要 PHP + MySQL の環境を docker-compose で構築し、IntelliJ上でdockerに接続してPHPUnitをする手順を記載してます。 Docker上に構築した実行環境を使うようにすることで、いちいちローカルにPHPやMySQLをインストールしなくてもよくなるようになり、ローカル環境の汚染を防ぐことができ、「案件によって使うMySQLのバージョンが異なるせいで毎回再インストールしないといけないんだよぉ」みたいな煩わしさから解放されます。 かつ、ローカルに環境を構築していた時と同様にIDEからサクっとテストを走らせることができるため、なんかハッピーなアレになれます。多分。 実行環境 Windows 10 64bit IntelliJ Ultimate Edition 2021.1 Docker Desktop v20.10.5 今回はWindowsで構築したけど、Macでも普通にできるはず。 前提 DockerやIntelliJ はインストール済 IntelliJ のプラグインのインストール 以下をインストールしておきます。 PHP PHP Docker PHP Remote Interpreter PHPUnit Enhancement Docker とりあえずトライ&エラーで入れたプラグインなんで、いくつか不要なものもあるのかも。 Dockerfileなどの作成 以下のフォルダ構成にします。 <Root> ・ local // Docker環境用 ├ php │ ├ php.ini │ └ Dockerfile └ mysql // 最終的にデータファイルが入る ・ src // ソースファイル ・ docker-compose.yml local/php/Dockerfile FROM php:7.2-fpm RUN apt-get update RUN apt-get install -y vim git zip unzip RUN docker-php-ext-install pdo_mysql COPY --from=composer /usr/bin/composer /usr/bin/composer COPY php.ini /usr/local/etc/php/ local/php/php.ini date.timezone = "Asia/Tokyo" docker-compose.yml version: '3' services: # Webサーバーとして動かす場合(今回はユニットテスト書くのが目的なのでこの部分は割愛) # nginx: # image: nginx:latest # ports: # - 8080:80 # volumes: # - ./local/nginx/nginx.conf:/etc/nginx/conf.d/default.conf # - ./src:/var/www/html # depends_on: # - php php: build: ./local/php volumes: - ./src:/var/www/html depends_on: - db db: image: mysql:5.7 ports: - 13306:3306 volumes: - ./local/mysql/data:/var/lib/mysql environment: MYSQL_ROOT_PASSWORD: password container_name: mysqldb phpmyadmin: image: phpmyadmin/phpmyadmin:latest ports: - 8888:80 depends_on: - db これらのイメージ&コンテナを作成しておき、 phpにCLIで入って、 composer install をやっておきます。 IntelliJの設定 Dockerの設定 File -> Settings にてSettingsダイアログを出し、 Build, Execution, Deployment -> Dockerを選択します。 ひとつDockerのサービスを作成しておけばOKです。 PHPの設定 Languages & Frameworks -> PHP を選択し、CLI Interpreter の「...」ボタンを押下 CLI Interpreters から設定を作成し、「From Docker, Vagrant, VM, WSL, Remote...」を選択 Docker Composeを選択し、実行サービス(今回の例だとphp)を選択します。 最初の設定のは不要な場合は削除しちゃいます。 PHPUnitの設定 Languages & Frameworks -> PHP -> Test Frameworks を選択し、CLI Interpreter に、上記で作成したインタプリタを選択します。 テストの設定 最後に、 実行の設定を行います。 Run / Debug Configurationsから、PHPUnitのを作成 あとはいつも通りの感じでテストを起動すると、IntelliJ は自動的にDocker上の実行環境を使ってテストを行い、MySQLにも接続するテストが実行できます。 まとめ いい時代になりましたねぇ。Docker便利。 そのうちGoやJavaやFlutterとかも同様のやり方でできないか調べたい
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

三項演算子とNull合体演算子 By php

三項演算子とNull合体演算子 ?: if ($Foo) { echo $Hoge } else { echo $Fuga } は echo $Foo ? $Hoge : $Fuga とかける ?? if (isset($Foo)) { echo $Foo } else { echo $Hoge } は echo $Foo ?? $Hoge とかける
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

便利な評価方法 By php

はじめに phpを使う上でよくemptyやis_null、issetを使うが、完全に条件を覚えていないので簡単に見返せるよう、自分用に書く。 empty emptyは厳しい bool $checkVal=1 false $checkVal='1' false $checkVal=0 true $checkVal='0' true $checkVal=[] true $checkVal=[0] false $checkVal true $checkVal='' true $checkVal=null true is_null is_nullはゆるい bool $checkVal=1 false $checkVal='1' false $checkVal=0 false $checkVal='0' false $checkVal=[] false $checkVal=[0] false $checkVal true $checkVal='' false $checkVal=null true if ifは厳しい bool $checkVal=1 true $checkVal='1' true $checkVal=0 false $checkVal='0' false $checkVal=[] false $checkVal=[0] true $checkVal false $checkVal='' false $checkVal=null false isset issetはゆるい bool $checkVal=1 true $checkVal='1' true $checkVal=0 true $checkVal='0' true $checkVal=[] true $checkVal=[0] true $checkVal false $checkVal='' true $checkVal=null false 総評 isがついてたらゆるい empty is_null if isset $checkVal=1 false false true true $checkVal='1' false false true true $checkVal=0 true false false true $checkVal='0' true false false true $checkVal=[] true false false true $checkVal=[0] false false true true $checkVal true ​ true false false $checkVal='' true false false true $checkVal=null true true false false
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

気象庁のAPI非公式。

新しい気象庁サイトからJSONデータで天気予報などが取得できる事を知りました。 取得の方法は下記を参照 天気予報などを取得したい方はこちらを参考にしてください。 https://mindtech.jp/?p=1754 補足 上記の取得方法を読んだあとに下記を読むとなんとなくわかると思います・・・↓ 気象庁のarea.jsonというデータがあるのですがこれだと少し不便だったのでJSONを自分用に変更しました。 なお、気象庁のJSONがアップデートした場合は御自身で対応をお願いいたします。 因みにこんな感じに取得できます。 https://taoka-toshiaki.com/tools/Weather/ Github https://github.com/taoka-toshiaki/tenki-url /assets/tenki.json { "weather": [ { "urlno": "011000", "name": "宗谷地方" }, { "urlno": "012000", "name": "上川・留萌地方" }, { "urlno": "013000", "name": "網走・北見・紋別地方" }, { "urlno": "014030", "name": "十勝地方" }, { "urlno": "014100", "name": "釧路・根室地方" }, { "urlno": "015000", "name": "胆振・日高地方" }, { "urlno": "016000", "name": "石狩・空知・後志地方" }, { "urlno": "017000", "name": "渡島・檜山地方" }, { "urlno": "020000", "name": "青森県" }, { "urlno": "030000", "name": "岩手県" }, { "urlno": "040000", "name": "宮城県" }, { "urlno": "050000", "name": "秋田県" }, { "urlno": "060000", "name": "山形県" }, { "urlno": "070000", "name": "福島県" }, { "urlno": "080000", "name": "茨城県" }, { "urlno": "090000", "name": "栃木県" }, { "urlno": "100000", "name": "群馬県" }, { "urlno": "110000", "name": "埼玉県" }, { "urlno": "120000", "name": "千葉県" }, { "urlno": "130000", "name": "東京都" }, { "urlno": "140000", "name": "神奈川県" }, { "urlno": "190000", "name": "山梨県" }, { "urlno": "200000", "name": "長野県" }, { "urlno": "150000", "name": "新潟県" }, { "urlno": "160000", "name": "富山県" }, { "urlno": "170000", "name": "石川県" }, { "urlno": "180000", "name": "福井県" }, { "urlno": "210000", "name": "岐阜県" }, { "urlno": "220000", "name": "静岡県" }, { "urlno": "230000", "name": "愛知県" }, { "urlno": "240000", "name": "三重県" }, { "urlno": "250000", "name": "滋賀県" }, { "urlno": "260000", "name": "京都府" }, { "urlno": "270000", "name": "大阪府" }, { "urlno": "280000", "name": "兵庫県" }, { "urlno": "290000", "name": "奈良県" }, { "urlno": "300000", "name": "和歌山県" }, { "urlno": "310000", "name": "鳥取県" }, { "urlno": "320000", "name": "島根県" }, { "urlno": "330000", "name": "岡山県" }, { "urlno": "340000", "name": "広島県" }, { "urlno": "360000", "name": "徳島県" }, { "urlno": "370000", "name": "香川県" }, { "urlno": "380000", "name": "愛媛県" }, { "urlno": "390000", "name": "高知県" }, { "urlno": "350000", "name": "山口県" }, { "urlno": "400000", "name": "福岡県" }, { "urlno": "410000", "name": "佐賀県" }, { "urlno": "420000", "name": "長崎県" }, { "urlno": "430000", "name": "熊本県" }, { "urlno": "440000", "name": "大分県" }, { "urlno": "450000", "name": "宮崎県" }, { "urlno": "460100", "name": "鹿児島県(奄美地方除く)" }, { "urlno": "460040", "name": "奄美地方" }, { "urlno": "471000", "name": "沖縄本島地方" }, { "urlno": "472000", "name": "大東島地方" }, { "urlno": "473000", "name": "宮古島地方" }, { "urlno": "474000", "name": "八重山地方" } ] } /lib/tenki.php <?php $end_point_url = "https://www.jma.go.jp/bosai/forecast/data/"; $type = "forecast/"; // $obj = (object)json_decode(file_get_contents("../assets/js/area.json")); // $cnt = 0; // foreach($obj->centers as $key=>$value){ // $j[$cnt]["name"] = $obj->centers->{$key}->name; // $j[$cnt]["url"] = $end_point_url.$type.$key.".json"; // $cnt++; // } $obj = (object)json_decode(file_get_contents("../assets/js/tenki.json")); $cnt = 0; foreach($obj->weather as $key=>$value){ $j[$cnt]["name"] = $obj->weather[$key]->name; $j[$cnt]["url"] = $end_point_url.$type.$obj->weather[$key]->urlno.".json"; $cnt++; } print json_encode($j);
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

MacでLaravel開発環境を構築する

MacでLaravel開発環境を整備するまでの手順 macOS11.2でPHPフレームワークのLaravelの開発環境を調えるための手順を自身の備忘録も兼ねて書き留めておきます。初心者で知識も不足しているので間違っている所があれば、ご指摘頂けると幸いです。 Laravelとは Homebrewのインストール Homebewが入っていない場合はインストールしておきます。執筆時点では次のコマンドでインストールできます。 ターミナルにコピペしてください。 /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh) なお、インストールコマンドはバージョンによって変わっている事があるので、ホームページで最新版を確認する事をオススメします。 Composerのインストール ComposerはPHPのパッケージ管理ソフトです。 Hombrewでインストールします。 Homebrewのアップデート はじめにHomebrewをアップデートしておきます。 この処理には時間がかかる事があるので気長に待ちましょう。 brew update インストール アップデートが完了したらComposerをインストールします。 brew install composer インストールの確認 インストールが完了したら次のコマンドで正しくインストール出来ているか確認します。 composer -v 次のように表示されればOKです。 ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/ Composer version 2.0.12 2021-04-01 10:14:59 Laravelのインストール 次はいよいよLaravelのインストールです。 (正確にはLaravelインストーラーのダウンロードですが、今は細かい事は気にしないでください!) インストール 次のコマンドを実行します。 composer global require laravel/installer パスを通す インストールは完了しましたが、今の状態ではまだパスが通っておらず、 laravelコマンドが使用出来ないので、パスを通す必要があります。 laravelは $HOME.composer/vendor/laravel/installer/bin にあるので ここにパスを通してやれば良いです。 つまり、次のようにします。 export PATH=$HOME/.composer/vendor/laravel/installer/bin:$PATH これでパスが通りました。試しに次のコマンドを打ってみてください。 laravel -V 次のように表示されれば完了です! おつかれ様でした!(※バージョンはインストールされて時期によって異なります) Laravel Installer 4.2.4 参考サイト
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP5上級試験/準上級試験の上級合格に挑戦(21) プログラミングPHP第3版 16章~17章

16章 デバッグ 黒本だと11章のアプリケーションに関するテクニックの、エラーの箇所が対応する。 PHP開発の場合開発環境、ステージング環境、本番環境の3つがある 16.1 開発環境 開発環境はエラー報告をできる限り設定しておく Gitなどでバージョン管理するべきだが、そうでないならlocalhost環境を用意する方法がある localhost環境構築にはZend Server CEやApache Web Server,MicorosoftのIISなどを手動でインストールする方法がある 他にも、ビルドインウェブサーバーを使う方法、クラウド環境を利用する方法がある ビルドインウェブサーバー http://php.net/manual/ja/features.commandline.webserver.php Zend社の開発・テスト用のクラウド環境 http://www.phpcloud.com/ 16.2 ステージング環境 自分のコードがどのように動くのかを本番環境をシミュレートした保護された環境で試すことができ、 また、エンドユーザ・クライアントが新機能を試す場でもある。 つまり、開発者用と、クライアント用の2種類用意するとよい(リソースがあれば) 16.3 本番環境 エラー報告の制御は厳しくする 404のページリダイレクトやtry~catch構文でエラーをうまく回避し、ログファイルに書き出すようにする 16.4 php.ini設定 display_errors →本番環境では0 error_reporting → いろいろな設定がある(黒本11章参照) → ステージング環境でのおすすめ設定として 動きが怪しいファイルが有る時、そのファイルにだけ頭に記載すると、エラーを吐き出す。 index.php error_report(E_ALL); ini_set("display_errors", 1); 16.5 手動でのデバッグ Zend Studio for EclipseやKomodoといった統合開発環境を使う →変数の内容に依存する論理的エラーも捕捉可 ・var_dump()、print()、pritn_r()がある  →print_rの場合、データ型表示はなし 16.6 エラーログ ログの置き場所は、 Ubuntuの場合デフォルトは/var/logs/apache2.jogになる 16.7 IDEをつかったデバッグ 複雑な問題はIDEを使ったデバッグが一番 Zend Studio for Eclipse をつかったデバッグもある(これはJSもデバッグできる) 他にもKomodoやPhpEDがある 実行しているコードがブラウザに表示する内容を表示する Debug OutputビューとBrowser Output ビューで、 コードを実行したところまでしか表示しないことが良い点。 つまりブレークポイントだと、そこまでしか表示しない。 ウォッチ式とかもある 16.8 その他の応用テクニック プロファイリング・ユニットテストなどがある →大規模なウェブシステムを作っていて大量のサーバーリソースを必要とする場合は、調べたほうがいい 17章 日付と時刻 黒本だと第14章が対応する 今までの日付・時刻関数群は、1970年1月1日より前、2036年1月19日より後の日付を扱えなかった (32ビット符号付き整数値で管理していたから) 今後のことを考えると、DateTimeクラス群を使うほうが良い DateTimeZoneクラスで、設定をphp.iniファイルから抜き出す場合ini_get()をつかう そしてもっと詳しい情報をゲットするにはgetLocation()を使う index.php $tz = ini_get('date.timezone'); $dtz = new DateTimeZone($tz); echo "サーバーのタイムゾーン: {$tz}<br>"; foreach ($dtz->getLocation() as Key => $value){ echo "{$key} {$value}<br/>"; }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

laravel カラムを削除するマイグレーションの書き方

目的 カラムを削除する際のマイグレーションファイルの記載方法をまとめる 情報 ハードウェア環境 項目 情報 OS macOS Catalina(10.15.5) ハードウェア MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) プロセッサ 2 GHz クアッドコアIntel Core i5 メモリ 32 GB 3733 MHz LPDDR4 グラフィックス Intel Iris Plus Graphics 1536 MB ソフトウェア環境 項目 情報 備考 PHP バージョン 7.4.8 Homebrewを用いてこちらの方法で導入→Mac HomebrewでPHPをインストールする Laravel バージョン 6.X commposerを用いてこちらの方法で導入→Mac Laravelの環境構築を行う MySQLバージョン 8.0.19 for osx10.13 on x86_64 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでMySQLをインストールする Node.jsバージョン v12.14.1 Homwbrewを用いてこちらの方法で導入→Mac HomebrewでNode.jsをインストールする 方法 「delete_flag」というカラムを削除したい場合下記のように記載する。 $table->dropColumn('delete_flag'); 例 下記にマイグレーションファイルの例を記載する。下記のマイグレーションファイルはtasksテーブルに「delete_flag」カラムを追加するup処理と追加されている「delete_flag」カラムを削除するdown処理が記載されている。 2021_04_12_213724_add_delete_flag_columns_to_task_table.php <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class AddDeleteFlagColumnsToTaskTable extends Migration { /** * Run the migrations. * * @return void */ public function up() { Schema::table('tasks', function (Blueprint $table) { $table->tinyInteger('delete_flag')->after('statut_id')->nullable()->comment('削除フラグ'); }); } /** * Reverse the migrations. * * @return void */ public function down() { Schema::table('tasks', function (Blueprint $table) { $table->dropColumn('delete_flag'); }); } }
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

CakePHP環境構築メモ

CakePHP学習用個人備忘録 ゴール XAMPP環境にCakePHPをインストールして、デフォルトページを表示するところまで ポイント intl拡張機能のエラー解消 環境 Mac ローカル開発環境はXAMPP PHP/Composer/インストール済 XAMPPインストール 1. MacOS用のダウンロードページからPHPバージョンを選択し、遷移先画面で末尾がinstaller.dmgのリンクをクリックしてDL(vmのほうではないので注意) https://sourceforge.net/projects/xampp/files/XAMPP%20Mac%20OS%20X/ 2. インストールが完了すると勝手にコンパネが出てきます。 この時点でApacheが起動しているので以下にアクセスしてXAMPPのホーム画面が表示されればOK http://localhost/dashboard/ (表示されない時はコンパネのManage ServerタブをクリックしてApacheをstartすればOK) CakePHPをインストール 1. アプリケーションフォルダ内にXAMPPフォルダが出現しています。公開フォルダであるhtdocsへ移動します。 cd /Applications/XAMPP/htdocs 2. ターミナル上でhtdocsディレクトリに移動したら、プロジェクトディレクトリの生成とCakePHPのファイルをダウンロードします。 例でプロジェクト名(ディレクト名)はmessagesappにします。(好きなように決めてください) composer create-project --prefer-dist cakephp/app messagesapp 3. 以下でCakePHPのデフォルトページが表示されればOKです。(プロジェクト名は指定した名称に変更してください) http://localhost/dashboard/messagesapp intl拡張機能のエラー解消 【エラー文】 概要: intl拡張機能が読み込まれていないのでPHPを調整して設定してください。 Fatal error: You must enable the intl extension to use CakePHP. in /Applications/XAMPP/xamppfiles/htdocs/messagesapp/config/requirements.php on line 31 【原因と解決策】 ・HomebrewがHomebrew/phpをdeprecated(廃止)しており、  MacのデフォルトのPHPが使われていため、PHPを再インストールしてみる。 ・MacPortsというパッケージ管理システムでintl拡張機能をインストールしてみる。 PHPを再インストール 1. XAMPPのPHPバージョンを確認(ページ最上部) http://localhost/dashboard/phpinfo.php 2. インストールできるPHPのバージョンを確認します。 brew search php *結果* ==> Formulae brew-php-switcher php-code-sniffer php@7.2 php@7.4 phplint phpmyadmin phpunit php ✔ php-cs-fixer php@7.3 phpbrew phpmd phpstan ==> Casks eclipse-php netbeans-php 3. XAMPPのバージョンにあったPHPをインストールします。 brew install php@7.4 4. 格納先を確認 MacのPHPのパスから、今回インストールしたPHPのパスが表示され、インストールしたPHP適応されていることを確認できます。 which php *結果* /Applications/XAMPP/xamppfiles/bin/php 5. バージョンを確認 php -v *結果* PHP 7.4.16 (cli) (built: Mar 12 2021 04:42:02) ( NTS ) Copyright (c) The PHP Group Zend Engine v3.4.0, Copyright (c) Zend Technologies intl拡張機能をインストール 現在、intlをHomebrewでダウンロード出来ないので、MacPortsというパッケージ管理システムでインストールしていきます。 1. 以下記事を参考にMacPortsをインストールしましょう。MacPortsは/opt/local/以下にインストールされます。 https://webkaru.net/dev/macports-download-install/ 2. パスを通します。 設定ファイルを開く vi ~/.bash_profile 以下を追記 PATH=/opt/local/bin:/opt/local/sbin:$PATH MANPATH=/opt/local/man:$MANPATH export PATH export MANPATH 読み込ませる source ~/.bash_profile 3. アップデートします。 (MacPorts本体の更新とパッケージリストの更新を同時に行います。MacPortsを使う前に実行する癖をつけるといいらしいです) sudo port selfupdate 4. インストールしたPHPと同じバージョンのintl拡張機能をMacPortのコマンド(port)でインストールします。 sudo port install php74-intl XAMPPのphp.iniを編集 1. intlをインストールしたことで以下の場所にフォルダが生成されますのでパスを取得します。 /Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-******** 2. XAMPPのphp.iniに2行を追記します。 ********は上記で調べたフォルダ名に差し替えてください。 extension=/opt/local/lib/php74/extensions/no-debug-non-zts-********/intl.so extension=/Applications/XAMPP/xamppfiles/lib/php/extensions/no-debug-non-zts-******** php.iniの格納先は以下URLのLoaded Configuration File項目に記載されています。 http://localhost/dashboard/phpinfo.php Apacheを再起動してアクセス XAMPPのコンパネでApacheを再起動していかにアクセスしてデフォルトページが表示されればOKです。 http://localhost/messagesapp/ 参考記事 https://hacknote.jp/archives/56258/ https://webkaru.net/dev/macports-download-install/ https://www.karakaram.com/macports-howto/#install
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】モデルをall()で取得したときに並び替える方法

allで取得したモデルを並び替える方法 モデルをallで取得した時、基本的には主キーでソートされるようです。 別のキーでソートしたい場合でも、order byは使えません。 laravel $users = Users::all()->orderBy('department_id'); all()で取得した場合は、order byではなくsort byを使う必要があります。 laravel $users = Users::all()->sortBy('department_id'); 参考 Laravel Eloquent: Ordering results of all()
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Amazon IVS の録画機能を動画配信プラットフォームサービスに組み込む

概要 Amazon IVSが 2020/04/08 に S3 への録画機能を開始した。 https://aws.amazon.com/jp/about-aws/whats-new/2021/04/amazon-interactive-video-service-adds-support-recording-live-streams-amazon-s3/ 今まではライブ配信機能のみを提供していたが S3への録画機能が提供されたことでライブ配信とアーカイブの両方が利用可能になる。 本記事では、S3の録画機能を自前の動画配信プラットフォームと連携するために必要な処理について解説する。 なお最新版のAWS SDKで本機能は利用可能である。 本記事で作成した動画配信プラットフォームに関しては以下を参照されたい。 https://qiita.com/clom/items/697d5fe87461d633d043 S3への録画設定 S3 への録画を行う場合は IVS へ記録設定を行う必要がある。 その際、バケットを新規作成するか、既存のバケットを利用するか選択が可能になるが、利用するIVSのAPIと同じリージョンに属していることが必須である。 今回の場合はIVSがオレゴンに作成しているためS3バケットもオレゴンに作成している。 この記録設定と既存のチャネルや新規チャネルを連携させてS3への録画設定が可能になる。 録画を行った場合、動画データは以下に格納される /ivs/v1/{AWSアカウントID}/{チャネルARNのリソースID}/{年}/{月}/{日}/{ライブ配信単位のユニークID}/ 録画されるS3ファイルの構成 録画された動画データはIVS側から提供される events, 1分おきに生成されるサムネイル画像や各解像度別のtsファイルが格納されている media の2つが存在する。録画完了した動画データを再生する場合は media/hls/master.m3u8をHLSなどが再生できるプレイヤーに入れて再生すると視聴が可能になる。 events には以下のデータが格納されており、録画の開始・終了時刻、レンディションの情報やサムネイルの情報などが含まれている。録画開始時にはrecording-started.json、 録画終了時にはrecording-ended.json が生成される。 recording-ended.json recording-started.json { "version": "v1", "recording_started_at": "2021-04-12T14:49:15Z", "recording_ended_at": "2021-04-12T15:00:30Z", "channel_arn": "arn:aws:ivs:us-west-2:0000000000:channel/aaaaaaaaaa", "recording_status": "RECORDING_ENDED", "media": { "hls": { "duration_ms": 672133, "path": "media/hls", "playlist": "master.m3u8", "renditions": [ { "path": "480p30", "playlist": "playlist.m3u8", "resolution_width": 852, "resolution_height": 480 }, { "path": "360p30", "playlist": "playlist.m3u8", "resolution_width": 640, "resolution_height": 360 }, { "path": "160p30", "playlist": "playlist.m3u8", "resolution_width": 284, "resolution_height": 160 }, { "path": "720p30", "playlist": "playlist.m3u8", "resolution_width": 1280, "resolution_height": 720 } ] }, "thumbnails": { "path": "media/thumbnails" } } } チャネル発行時連携 PHPの場合、チャネルを発行する際に recordingConfigurationArn を追加し、記録設定を作成した際の ARN を用いることで、チャネル発行時に記録設定に設定したS3バケットに対して録画したデータを格納している。 $result = $ivs->createChannel([ 'latencyMode' => 'LOW', 'name' => $uuid->toString(), 'type' => 'STANDARD', 'recordingConfigurationArn' => env('AWS_RECORDING_CONFIGURATION'), ]); 記録設定で使用する ARN は↓の形式で登録されている。 arn:aws:ivs:us-west-2:123456789012:recording-configuration/aabbccddeeff 録画開始・終了の通知受け取り AWSから録画開始、録画終了の通知は EventBridge を通じて受け取ることが可能である。 IVS Recording State Change のイベントを通じて処理が進むためEventBridgeでルールの設定を行い、 Lambdaなどのターゲットを設定して以降の処理を実行させる。 なお、イベントパターンは事前定義がまだ追加されていないためカスタムパターンで追加を行う。 { "source": ["aws.ivs"], "detail-type": ["IVS Recording State Change"] } IVS Recording State Change では 4種類のイベントタイプを提供している。 event description Recording Start ストリームへの処理が開始され S3 への putObject 開始時に通知されるイベント Recording End ストリームへの処理が終了し S3への putObject が終了した際に通知されるイベント Recording Start Failure S3にバケットがない場合などで録画開始が出来ない場合に通知されるイベント Recording End Failure 録画中にエラーが発生し、録画が中止した場合などに通知されるイベント 録画開始、終了のみを検知できればいい場合は Recording Start, Recording End のイベントを受け取り処理を行えるようにする。 通知されるイベントの内容に関しては以下の内容で通知される。 { "version": "0", "id": "12345678-1a23-4567-a1bc-1a2b34567890", "detail-type": "IVS Recording State Change", "source": "aws.ivs", "account": "123456789012", "time": "2020-06-23T20:12:36Z", "region": "us-west-2", "resources": [ "arn:aws:ivs:us-west-2:123456789012:channel/AbCdef1G2hij" ], "detail": { "channel_name": "Your Channel", "stream_id": "st-1F6jDj0t3zV01cXKe5dScIJ", "recording_status": "Recording Start", "recording_status_reason": "", "recording_s3_bucket_name": "r2s3-dev-channel-1-recordings", "recording_s3_key_prefix": "ivs/123456789012/AbCdef1G2hij/2020-06-23T20-12-32.152Z/a1B2345cdeFg" } } イベントは recording_status に記載されており、この値を用いて必要な処理を行う。 recording_s3_key_prefix に該当の動画情報が記録されるためこの値を利用する。 prefixのデータのみでは再生はできないため、動画プレイヤーで再生が行えるようにプレイリスト用のURLを別途生成する必要がある。 受け取ったイベントの値を元に以下のURLを構成することで動画プレイヤーでの再生が可能になる。 https://${s3 URL}/${recording_s3_key_prefix}/media/hls/master.m3u8 stream_id は1配信においては終了まで同一IDとして処理が行われるため、ライブ配信単位でデータを管理したい場合にstream_idをkeyとして持っておくと生成開始・終了イベントが追いやすくなる。 EventBridge から Lambda Function でイベントを受け取り、録画開始・終了に対応したエンドポイントをサービス側に定義している場合、以下のような形でハンドリングが可能になる。 ※実装コードに合わせてパラメーターを定義しているため、実際に運用する場合は送られてくるイベントに合わせて定義する必要がある。 var request = require('request'); const HOST = ''; const EVENT_RECORD_START = 'Recording Start'; const EVENT_RECORD_END = 'Recording End'; const ARCHIVE_START_ENDPOINT = ''; const ARCHIVE_STOP_ENDPOINT = ''; exports.handler = function(event, context) { var actionEndpoint = null; const params = { arn: event.resources[0], stream_id: event.detail.stream_id, playback_path: event.detail.recording_s3_key_prefix } console.log(event.detail.recording_status); console.dir(params); switch (event.detail.recording_status) { case EVENT_RECORD_START: actionEndpoint = ARCHIVE_START_ENDPOINT; break; case EVENT_RECORD_END: actionEndpoint = ARCHIVE_STOP_ENDPOINT; break; default: return; } const options = { uri: HOST + actionEndpoint, headers: { "Content-type": "application/json", }, json: params }; request.post(options, function(error, response, body){}); } まとめ 本記事では、Amazon IVS をすでに利用している場合に今回追加された録画機能を組み込む処理について紹介した。 今まではライブ配信のみの提供でアーカイブ機能を作成する場合は自前でライブ配信を録画する必要があったが、この機能追加により気軽にライブ配信のアーカイブ化が容易となった。 再生時の認証(Playback Auth)やS3への録画(Auto-Record to AmazonS3)などの機能が増えてきたことで動画配信サービスとしてのSaaSの選択肢の一つとして選ばれるようになるのではと思われる。 参考 実装コード
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む