- 投稿日:2021-07-20T23:35:14+09:00
PHPで配列の要素を部分一致で検索する方法 ( preg_grep )
PHPで配列の要素を検索する方法 学べること - preg_grepの使い方 - 変数を検索する場合の正規表現 preg_grep 検索してマッチする配列の要素を返します。 - 使い方 $array = ['hoge','huga']; $result = preg_grep('/ho/',$array); var_dump($result); //出力結果 // array(1) { // [0] => // string(4) "hoge" // } 解説 preg_grepの第一引数には検索する文字列、第二引数には配列を入れます。 ここでは配列の要素で"ho"が含まれるものを検索しています。$resultには検索にマッチした要素が配列として入っています。 ちなみに、第一引数の検索する文字列を囲ってるスラッシュはデリミタ(区切り文字)と呼ばれ、スラッシュじゃなくてもかまいません。例えば'{ho}'でもOK. 検索文字列が変数の時 それでは、検索する文字列が変数だった場合はどうしましょう。 上記に従うと、以下のパターン1のようになるはずです。 $array = ['hoge','huga']; $search = 'ho'; //パターン1 $result = preg_grep('/$search/',$array); しかし、これでは$searchそのものが検索ワードとして扱われてしまうのでダメ。 ちなみにpreg_grep($search,$array);もだめ。これはデリミタがないですね。 ではどうするかというと、以下のように書きます。 //パターン2 $result = preg_grep('/'.$result.'/',$array); //パターン3 $result = preg_grep("/$result/",$array); 上記のパターンだとそれぞれ変数展開されます。 クォーテーションの違いは下記記事が参考になるかと! PHPのダブルクォーテーションとシングルクォーテーションの違いを理解する もちろん preg_grep('{'.$result.'}',$array); とか、 preg_grep("/{$result}/",$array); でもOK。 こちらもご参考に。 文字列の中の変数展開についてまとめました 今回は部分一致で検索する場合を紹介しましたが、完全一致で検索する場合はin_array()を使いましょう! でわでわ。
- 投稿日:2021-07-20T23:10:43+09:00
PHP 基礎 Part1
PHPとは HTMLは決まった画像しか表示できませんが、 PHPは見る人や状況に応じてテキストを変えることができます。 PHPはHTMLに組み込んで使うことができます。 <?php ?>の中に命令を書いていきます。 文末にはセミコロンを使うようにして下さい。 出力する時はechoを使うようにしましょう。 変数 変数はPHPでは$を使って書いていきます。 文字列の連結 PHPでは文字列を連結する時は.を使います。 変数展開 文字列の中に変数を入れる時は変数展開をしますが、 {変数}を使いましょう。 配列 配列の時は$配列名 = array(値1,値2...)を使います。 配列の末に値を追加する時は$配列名[]= '値'を記述しましょう。 foreach foreachは()の最初に配列名を入れて、asの後に変数を入れる。 連想配列の時は(配列名 as キー変数 => 値変数) 関数 関数はまとまった処理を行い、値を返すモノです。 組み込み関数と言って、予め関数が入っています。 いくつかの組み込み関数を紹介します。 echo strlen(引数) これで値の字数を数えます。 echo count(引数) これは引数の配列の値の数を数えます。 echo rand(引数) これは1つ目の引数から2つ目の引数までの数字をランダムで表示します。 formを作る formを作るにはformタグを作ります。 属性でactionを使い、属性値にURLを置きます。 method属性ではgetかpostを使います。 inputタグでtype属性をtextにします。 nameで受け取る値に名前を付けましょう。 文章のためにはtextareaタグを使いましょう。 送信ボタンを作る時はtypeをsubmitにします。 フォームに送った値を受け取るためには$_POSTで受け取ります。 $_POSTの後に['']で送ったnameの値を入れます。 セレクトボックス selectタグの中にoptionタグを使います。 optionタグにvalue属性を使い、実際に送信される値を決めます。
- 投稿日:2021-07-20T18:56:55+09:00
PHP8.1でarray_is_listが追加されたよ
はじめに こんにちは。 熱帯夜で全然寝むれず、寝不足だと暑さがより一層堪えますね...筆者です さて、今回はPHP8.1で追加された関数array_is_listを紹介しようと思います。 array_is_listとは こちら↓ 0から始まる連続した整数がkeyになっているかどうかを判定する関数です。 使用例 <?php array_is_list([]); // true array_is_list([1, 2, 3]); // true array_is_list(['apple', 2, 3]); // true array_is_list(['apple', 'orange']); // true array_is_list([0 => 'apple', 'orange']); // true array_is_list([0 => 'apple', 1 => 'orange']); // true // 0から始まっていない array_is_list([1 => 'apple', 0 => 'orange']); // false // 整数がkeyではない array_is_list([0 => 'apple', 'foo' => 'bar']); // false // 連続ではない array_is_list([0 => 'apple', 2 => 'bar']); // false おわりに LaravelのCollectionにもそのうち追加されそうですね ただ、この関数あったらよかったなぁってこと今までになかったので、今後使うときが来るかはちょっとわかりません そそれでは!
- 投稿日:2021-07-20T16:45:26+09:00
Laravel のリリーススケジュールとサポート期限
ソース: Laravel公式 サポートポリシー(8.xリリースノート) 現状(2021年7月時点)まとめ LaravelにはLTS(Long Term Support:長期サポート)版があります。 現行のLTSは6.xで、次のLTSは2022年1月25日リリース予定の9.xになります。 7.xはBug FixesもSecurity Fixesもサポート期限が終了しているので 今利用すべきはLTSの6.xか、アップデートするなら8.xになります。 もし今利用しているのが7.xであれば8.xにアップグレードを行う必要があります。 現行ではLTSである6.xの方が後発の7.xよりサポート期限が長くなっています。 そのため頻繁にアップグレードできない場合はLTSからLTSへ上げていくのが定番ですが、 次回LTSの9.xより10.xの方がBug Fixes期限は長く、Security Fixes期限は同じになっています。 Laravelのアップグレード作業は1ずつバージョンを上げていく形になりますし、 8.x以降は上げたいところまでバージョンを上げていってもよさそうです。 バージョン リリース バグ修正 セキュリティ修正 6 (LTS) 済 2022/1/25 2022/9/6 7 済 2020/10/6 2021/3/3 8 済 2022/7/26 2023/1/24 9 (LTS) 2022/1/25 2024/1/30 2025/1/28 10 2023/1/24 2024/7/30 2025/1/28 11 2024/1/? 2025/7/30? 2026/1/28? なお、今後は11月のSymfonyのアップグレードにあわせて、その2ヶ月後の年明け1月に新バージョンをリリースしていく予定のようです。 https://blog.laravel.com/laravel-9-release-date アップグレード計画作成の助けになれば幸いです。
- 投稿日:2021-07-20T14:01:53+09:00
ec2のamazon linux2 にnginx+php-fpm+php7.4+phalcon4 セットアップ
ログインしてrootで作業します timedatectl set-timezone Asia/Tokyo timedatectl status localectl set-locale LANG=ja_JP.UTF-8 yum update amazon-linux-extras install php7.4 amazon-linux-extras install nginx1 epelのインストール設定がいろいろ調べるとありますが、AmazonLinux2のamazon-linux-extras に存在したので、それをインストールして、有効にすればOKです。 amazon-linux-extras install epel yum-config-manager --enable epel yum install https://rpms.remirepo.net/enterprise/remi-release-7.rpm yum install php-mbstring yum install pcre-devel curl -s https://packagecloud.io/install/repositories/phalcon/stable/script.rpm.sh | sudo bash yum install --enablerepo=remi-php74 php-phalcon4 yum install php-devel php-opcache php-mbstring php-xml php-gd php-json # phalconは、/etc/php.d/にあるのを確認
- 投稿日:2021-07-20T12:59:14+09:00
Boost your Laravel models by Lara Query Kit
Lara Query Kit Lara Query Kit utilizes the Eloquent model. PHP Trait and Laravel local scope are used to implement this utilitiy PHP Traits PHP only supports single inheritance: a child class can inherit only from one single parent. So, what if a class needs to inherit multiple behaviors? OOP traits solve this problem. Traits are used to declare methods that can be used in multiple classes. Traits can have methods and abstract methods that can be used in multiple classes, and the methods can have any access modifier (public, private, or protected). Laravel local scope Local scopes allow you to define common sets of constraints that you may easily re-use throughout your application. To define a scope, simply prefix an Eloquent model method with scope. Installation & Configuration 1-Install cuongnd88/lara-query-kit using Composer. composer require cuongnd88/lara-query-kit 2-Push lara-query-kit into your application. php artisan vendor:publish --provider="Cuongnd88\LaraQueryKit\LaraQueryKitServiceProvider" 3-App\Traits\QueryKit.php is already to pump your performance. Please add QueryKit into the model . . . . use App\Traits\QueryKit; class User extends Authenticatable { use Notifiable; use HasOtpAuth; use HasGuardian; use QueryKit; . . . . } Available methods Let discuss each method available on the Query Kit. insertDuplicate() getTableColumns() exclude() filter() searchFulltext() insertDuplicate insertDuplicate(array $data, array $insertKeys, array $updateKeys): Insert new rows or update existed rows. public function upsert() { $data = [ ['name' => "Dean Ngo", 'email' => 'dinhcuongngo@gmail.com', 'mobile' => '84905005533', 'password' => Hash::make('123456')], ['name' => "Robert Neil", 'email' => '1111@gmail.com', 'mobile' => '84905001122', 'password' => Hash::make('123456')], ]; User::insertDuplicate($data, ['name', 'email', 'mobile', 'password'], ['name', 'email', 'mobile']); } getTableColumns getTableColumns(): Get the array of columns. public function listTableColumns() { $columns = User::getTableColumns(); dump($columns); } exclude exclude(array $columns): Retrieve a subset of the output data. You should define which model attributes you want to exclude. You may do this using the $excludable property on the model. . . . . use App\Traits\QueryKit; class User extends Authenticatable { use Notifiable; use HasOtpAuth; use HasGuardian; use QueryKit; protected $excludable = ['deleted_at', 'created_at', 'updated_at']; . . . . } public function listUsers() { $data = User::exclude()->get()->toArray(); dump($data); } Or pass a array of excludable columns as argument public function listUsers() { $users = User::exclude(['deleted_at', 'created_at', 'updated_at']) ->get()->toArray(); dump($users); } filter filter(array $params): Get the result with filter conditions. You may use the fitler method on a query builder instance to add where clauses to the query. The $filterable property should contain an array of conditions that you want to execute searching. The key of filterable array corresponds to table columns, whereas the value is condition to call where clauses. The most basic condition requires two arguments: The first argument is simple where clause such as: where, orWhere, whereBetween, whereNotBetween, whereIn, whereNotIn, whereNull, whereNotNull, orWhereNull , orWhereNotNull, whereDate, whereMonth, whereDay, whereYear, whereTime The second argument is an operator, which can be any of the database's supported operators. Exceptionally, the third argument is required with the operator is LIKE, it is for a specified pattern For convenience, if you verify only column in fiterable property, the default clause is where with = operator . . . . use App\Traits\QueryKit; class User extends Authenticatable { use Notifiable; use HasOtpAuth; use HasGuardian; use QueryKit; protected $filterable = [ 'id' => ['whereBetween'], 'email', 'name' => ['orWhere', 'LIKE', '%{name}%'], ]; . . . . } public function filter() { $where = [ 'id' => [1,5], 'email' => 'dinhcuongngo@gmail.com', 'name' => 'ngo', ]; $data = User::->filter($where)->get()->toArray(); } Dynamically, you can call filterableCondition() and assign the filterable conditions public function filter() { $filterable = [ 'email', 'name' => ['orWhere', 'LIKE', '%{name}%'], 'deleted_at' => ['whereNull'], ]; $where = [ 'email' => 'dinhcuongngo@gmail.com', 'name' => 'ngo', 'deleted_at' => '', ]; $data = User::filterableCondition($filterable) ->filter($where) ->get() ->toArray(); } searchFulltext searchFulltext($value, $mode = NATURAL_LANGUAGE): Run full-text queries against character-based data in MySQL tables. There are four modes of full-text searches: NATURAL_LANGUAGE (is default): IN NATURAL LANGUAGE MODE NATURAL_LANGUAGE_QUERY: IN NATURAL LANGUAGE MODE WITH QUERY EXPANSION BOOLEAN_MODE: IN BOOLEAN MODE QUERY_EXPANSION: WITH QUERY EXPANSION The $searchable property should contain an array of conditions that you search full- . . . . use App\Traits\QueryKit; class User extends Authenticatable { use Notifiable; use HasOtpAuth; use HasGuardian; use QueryKit; protected $excludable = ['deleted_at', 'created_at', 'updated_at']; protected $searchable = [ 'name', 'address' ]; . . . . } public function search() { $data = User::searchFulltext('ngo')->exclude()->get()->toArray(); dump($data); } You flexibly add matched columns by searchableCols() public function search() { $data = User::searchableCols(['name', 'address']) ->searchFulltext('ngo') ->exclude() ->get() ->toArray(); dump($data); } You must create a full-text index on the table before you run full-text queries on a table. The full-text index can include one or more character-based columns in the table. ALTER TABLE `users` ADD FULLTEXT(`name`, `address`);
- 投稿日:2021-07-20T12:50:58+09:00
共同開発まとめ
初めに 実務に近い経験を積みたい!と思い、共同開発のコミュニティに参加しECサイトを作成しました。 共同開発するにあたって苦労した点や、各機能実装の際に参考にした記事や教材について記事にまとめました。 アプリの概要 ご当地の美味しいものをお取り寄せできるECサイト。 アプリURL https://www.tomtom-blog.net ※テストアカウント メールアドレス test@co.jp パスワード123456789123でログインできます。 GitHub https://github.com/KawataTsutomu/yanbaru_ec_traning 使用画面のイメージ 使用技術 フロントエンド HTML / CSS / Bootstrap バックエンド PHP 7.2.34 Laravel 6.18.36 インフラ Vagrant + VirtualBox + Docker CentOS 7.3.1611 Apache 2.4.6 MySQL 5.7 / PHPMyAdmin AWS ( VPC, EC2, RDS, IAM, IGW, ELB, Route53 ) 開発環境、インフラ構成図 AWSデプロイ参考記事 VPC構築参考 Docker環境構築 機能一覧 ログイン関連 ログイン、ログアウト機能 ユーザー登録関連 新規登録、ユーザー情報確認、編集、退会機能 商品関連 商品詳細、検索機能 注文関連 カート、注文詳細、キャンセル機能 私は主にマイグレーション・シーダーファイル作成、ユーザー情報確認・修正、注文詳細を担当しました。 DB設計 ER図 苦労したこと まず何をすればいいんだ...?と何も分からないところからスタート。考えているだけでは始まらない!とりあえず手を動かそう!とcodeを書いてみるもエラー連発で泣きそうになりました...w ここでは特に印象に残っている点をまとめます。 環境構築 Vagrantを用いてDocker動作環境を構築し、Laravel立ち上げに成功! 翌日、PCを再起動し、作業を始めようとするapacheだけ立ち上がらない... 原因は、正しい手順でDockerとVagrantを停止していなかったからで、コンテナを壊してしまっていました...。 docker-compose stop でDocker停止 vagrant suspend でvagrant停止 パソコンをシャットダウン することで防ぐことができました。パソコンの電源を切るのと同じように正しい手順があることを学びました。 Git操作 意図して変更していないファイルも差分としてpushしてしまっていました。 commit,pushする前に何を変更した確認することを怠っていました。 色々な方法がありますが、VSCodeで確認するのが自分にあっているように感じました。 ①サイドバーの「ソース管理」のアイコンをクリック ②変更に変更されたファイルが表示される ③ファイルをクリックすると変更内容が表示される。(左が変更前で右が変更後) 個人で開発する分にはそれほど問題にはならないが、複数人で作業する現場では注意しなくてはいけないということを学びました。 「git push origin master は悪魔のコマンド」という高額な損害賠償のエピソードを知り、個人で開発する時よく使ってしまっていたのでゾッとしました... DBからデータ取得 先に取りかかったユーザー情報確認画面では Controller UserController.php public function show() { $user = Auth::user(); return view('auth/user_info', ['user' => $user]); } View user_info.blade.php @extends('layouts.app') @section('content') <main> <div class="page-header mt-5 pt-5 text-center"> <h4>ユーザ情報</h4> </div> <div class="row mt-5 mb-5"> <div class="col-sm-6 mx-auto"> <div class="mb-3"> <p class="contents">ユーザID</p> <p class="contents-text">{{ $user->id }}</p> </div> <div class="mb-3"> <p class="contents">氏名</p> <p class="contents-text"> {{ $user->last_name }} {{ $user->first_name }}</p> </div> <div class="mb-3"> <p class="contents" id="content-address"> 住所 </p> <div class="contents-text"> <p class="mb-1">〒{{ $user->zipcode }}</p> <p class="mb-1">{{ $user->prefecture }}{{ $user->municipality }}{{ $user->address }}{{ $user->apartments }}</p> </div> </div> Authで欲しい情報(ログインしているユーザー情報)を取得できたので簡単だったので、次に担当した注文詳細画面で壁にぶち当たりました... Route web.php Route::resource('orders', 'OrderDetailController', ['only' => ['show', 'edit']]); Controller web.php class OrderDetailController extends Controller { private const SHIPMENT_STATUS_PREPARE = 1; private const SHIPMENT_STATUS_CANCEL = 2; public function show($id) { $orderDetail = OrderDetail::whereHas('order', function ($query) use($id) { $query->where('order_id', $id); }) ->select('order_detail_number') ->first(); // ログインしているユーザーの注文詳細、注文履歴で選んだ注文のキャンセル(注文状態)以外を取得 $ordersHistory = OrderDetail::with('Product.category', 'shipmentStatus') ->whereHas('order', function ($query) { $query->where('user_id', Auth::id()); }) ->where('order_detail_number', $orderDetail->order_detail_number) ->where('shipment_status_id', '<>', self::SHIPMENT_STATUS_CANCEL) ->get(); $userInfo = Auth::user(); $subtotal = 0; $total = 0; //注文状態の判定 $preparationOrder = OrderDetail::whereHas('order', function ($query) { $query->where('user_id', Auth::id()); }) ->where('order_detail_number', $orderDetail->order_detail_number) ->where('shipment_status_id', '=', self::SHIPMENT_STATUS_PREPARE) ->get(); //$shipment_status_flg = true なら準備中、false なら発送済 $preparationOrderFlg = $preparationOrder->isEmpty() ? false : true; return view('order/order_detail', compact('ordersHistory', 'userInfo', 'orderDetail', 'subtotal', 'total', 'preparationOrderFlg') ); } public function edit($id) { // ログインしたユーザーと同じuser_idなら選択した注文を準備中をキャンセルへ変更 $ordersHistory = OrderDetail::whereHas('order', function ($query) { $query->where('user_id', Auth::id()); }) ->where('order_detail_number', '=', $id) ->where('shipment_status_id', '=', self::SHIPMENT_STATUS_PREPARE) ->update(['shipment_status_id' => self::SHIPMENT_STATUS_CANCEL]); return redirect()->back();; } } しかしそのお陰で、クエリビルダを使ってデータベースを操作し、テーブルからデータを取得することや、定数を定義して数字に意味を持たせることによってcodeが読みやすくなることを学べました。 参考にしたURL https://readouble.com/laravel/5.7/ja/queries.html 終わりに 壁にぶち当たってメンバーに相談した際、嫌な顔せずに、dd( );を使ったデバッグの方法など色々教えてもらい、感謝してもしきれません。本当ありがとうございます。 自分もそんなチームを助けられるエンジニアになれるよう、勉強を続け知識を深めていきたいと思います。 動作確認した不備が見つかったので時間を作り直していきます。 技術的な記事ではありませんが、最後まで読んでいただきありがとうございました。
- 投稿日:2021-07-20T10:31:19+09:00
Laravel でのファイルダウンロードを実装してみた
LaravelでPDFファイルのダウンロードを実装してみて、こんなに簡単に実装できるんだ、、、と驚いたので書いてみた 仕様、もしくは前提 ・OS : Windows ・PHP 7.4.16 (cli) (built: Mar 2 2021 14:06:15) ( ZTS Visual C++ 2017 x64 ) ・Laravel Framework 6.20.24 ・ある画面に表示される「PDF出力」ボタンをクリックすると、DBに登録されているPDFファイルのパスを取得し、ブラウザ経由でローカルにPDFファイルがダウンロードされる。 1.PDFファイルのパス取得 $res = \DB->table('files') ->where('id', '=', $id) ->get(); $pdfFilePath = $res->pdf_pile_path; //C:\LavelDir\storage\app\public\pdfFiles\202107191038162092931173.pdf $pdfFileName = pathinfo($pdfFilePath)['basename']; //202107191038162092931173.pdf 2.ヘッダー情報指定 $headers = [ 'Content-Type' => 'application/pdf' ]; 3.ファイルが存在したらダウンロード if(file_exists($pdfFilePath)){ return response()->download($pdfFilePath, $pdfFileName, $headers); return redirect()->route('sales.index.list')->with('sales.index.list.print.success', true); }else{ //ファイルが存在しなかった場合のエラー処理 } まとめ こんな感じです。 他にもStorage::download()やStorage::response()を使う方法があるみたいですが、今回は使いませんでした。
- 投稿日:2021-07-20T01:25:17+09:00
Laravel+Eclipseで開発するための準備&Google App Engineにデプロイする
概要 以前からLaravelに興味があり、Laravelを用いて何かWebアプリケーションを作ってみたいと思っていました。 そこで先日、準備としてLaravelをインストールしてEclipseで開発環境を作り、作成した新規LaravelプロジェクトをGoogle App Engineにデプロイしてみました。最初は色々つまずきましたが、何とか一通りできたので参考にさせていただいたサイトと手順をメモとして残します。 目的 Laravelをインストールしてプロジェクトを作成する LaravelプロジェクトをEclipseにインポートして編集できるようにする 作成したLaravelプロジェクトをGoogle App EngineにデプロイしてWebアプリとして公開する 環境 macOS Catalina ver.10.15.7 PHP 7.3.11 Laravel Framework 8.50.0 Eclipse Platform Version: 2021-06 (4.20) ※おおよその手順は同じだと思いますが、Windowsの場合手順が一部異なる可能性があります。 ※今回、開発環境にEclipseを選んでいますがEclipse以外の環境を用いても大丈夫です。 手順 1. Eclipseのインストール 参考サイト:MacにEclipse(+日本語化)をインストールする方法 上記サイトを参考に、Pleiades All in One ダウンロードページから自分の環境に合うEclipseをダウンロード・インストールしてください(自分はMacのFull Edition(PHP)を選択しました)。 2. Composerのインストール 参考サイト:Macにcomposerをインストール Composerのダウンロードページにあるコマンドを実行してComposerをインストールしてください。 インストール後、composer -Vまたはcomposer --versionコマンドを実行してComposerが正しくインストールされているかを確認してください。 3. Composerを用いてLaravelをインストール+プロジェクトを作成 参考サイト:【PHP/Laravel】開発環境構築(Mac版) プロジェクトを作成したい場所にカレントディレクトリを移動し、 $ composer create-project "laravel/laravel=8.*" プロジェクト名 (プロジェクト名の部分は任意の名前を設定してください。またLaravelのバージョンはここでは8としていますが、任意のバージョンで大丈夫です。) 上記コマンドでLaravelをインストール&プロジェクトを作成してください。プロジェクトの作成後、作成したプロジェクトにカレントディレクトリを移動して $ php artisan serve 上記コマンドを実行して表示されるURLにブラウザでアクセスし、プロジェクトが正しく動作することを確認してください(ローカルサーバーを停止させたい時はCtrl+Cを押してください)。 以降、作成したプロジェクトがカレントディレクトリになっている状態として説明を続けていきます。 Eclipseに Laravelプロジェクトをインポートする ※ここの作業はEclipseにLaravelプロジェクトを読み込ませたい場合の手順なので、今ではなくLaravelプロジェクトのデプロイ後に実施しても大丈夫です。 1. Eclipseのメニューバーから ファイル > インポートを選択 2. PHP > 既存のComposerプロジェクト を選択 3. 作成したLaravelプロジェクトを参照で選択する。プロジェクト名に任意の名前を入力して完了を押すと、Eclipse上にLaravelプロジェクトがインポートされる 4. Google Cloud Platformの利用登録とGoogle App Engineのプロジェクト作成 参考サイト:ゼロから始める Google App Engine の使い方(2017年) 上記サイトを参考に、Google Cloud Platformの利用登録とGoogle App Engineのプロジェクト作成を行なってください(作成したプロジェクトについて、請求は有効にしてください)。 ここでGoogle Cloud PlatformとGoogle App Engineの概要について簡単に触れると、 Google Cloud Platform: Googleが提供するクラウド上のサービス群。データ解析や機械学習系など様々なサービスがある。利用登録後、90日間($300相当)無料トライアルで利用できる。 Google App Engine: Google Cloud Platformのサービスの1つで、Webアプリケーションを公開することができる。JavaやPython、PHPなどに対応している。無料枠が存在する。 Google Cloud Platformの利用登録をする際に支払い方法を設定する必要がありますが、利用登録後90日間は無料トライアルを利用できます。また無料トライアル期間が終了して有料アカウントに切り替えても、無料枠に収めて運用することができれば課金はされません。 ※無料トライアルが終了した後は有料アカウントに切り替える必要があります(切り替えない場合、プロジェクトのリソースが削除されてしまう)。 5. Google Cloud SDKのインストール 参考サイト:【Mac】gcloudコマンドのインストール $ curl https://sdk.cloud.google.com | bash 上記コマンドを実行してGoogle Cloud SDKをインストールし、ターミナル上でgcloudコマンドが使える状態にしてください(上記コマンドを実行すると対話形式で色々聞かれますが、基本的には全てEnter及びyで大丈夫です)。 $ exec -l $SHELL 上記コマンドでシェルを再起動した後、 $ gcloud -v を実行してGoogle Cloud SDKのバージョンが表示されれば正しくインストールされています。 Google Cloud SDKのインストール後、 $ gcloud init を実行して環境を初期化してください(ブラウザで認証を求められるので、Google Cloud Platformの利用登録を行なったGoogleアカウントで認証してください)。 ターミナル上で使用するアカウントを聞かれた場合は登録を行なったアカウントを、使用するプロジェクトを聞かれた場合は登録したプロジェクトを選択してください。 6. app.yamlの作成とbootstrap/app.phpの編集 参考サイト: Laravel6をGoogle App Engineで動かす Google App Engine(GAE)を無料枠で収めるための勘所 Laravelプロジェクト内にapp.yamlを作成します。一例ですが、内容は以下のようにします(環境変数の設定と、プロジェクトをできるだけ無料枠で収めるためにしておきたい設定を書いています)。 app.yaml runtime: php73 env: standard instance_class: F1 env_variables: ## Put production environment variables here. APP_KEY: YOUR_APP_KEY APP_STORAGE: /tmp VIEW_COMPILED_PATH: /tmp SESSION_DRIVER: cookie automatic_scaling: min_idle_instances: automatic max_idle_instances: 1 min_pending_latency: 3000ms max_pending_latency: automatic max_instances: 2 runtimeのphp**の値はPHPのバージョンに合わせて設定します(例:PHPのバージョンが7.2であれば72)。 またYOUR_APP_KEYの部分には $ php artisan key:generate --show --no-ansi の実行結果を書いてください(以下のコマンドを実行すると自動的に書き替えてくれます)。 $ sed -i '' "s#YOUR_APP_KEY#$(php artisan key:generate --show --no-ansi)#" app.yaml 次に、bootstrap/app.phpのreturn $app;の手前に以下の内容を追記します。 bootstrap/app.php /* |-------------------------------------------------------------------------- | Set Storage Path |-------------------------------------------------------------------------- | | This script allows you to override the default storage location used by | the application. You may set the APP_STORAGE environment variable | in your .env file, if not set the default location will be used | */ $app->useStoragePath(env('APP_STORAGE', base_path() . '/storage')); 7. Laravelプロジェクトをデプロイ 参考サイト:Laravel6をGoogle App Engineで動かす $ gcloud app deploy 上記コマンドを実行して、LaravelプロジェクトをGoogle App Engineにデプロイします。 途中でどのリージョンにデプロイするかを聞かれると思うので、任意のものを選択してください(リージョンによって無料枠を超えた場合にかかる費用が若干異なるみたいですが、大きな違いはないのであまり気にしなくて大丈夫だと思います。特別な理由がなければ、距離的に近い東京(asia-northeast1)または大阪(asia-northeast2)を選ぶと良いと思います)。 何もエラーが出なければデプロイ成功です。以下のコマンドを実行することで、ブラウザ上でページを表示することができます。 $ gcloud app browse なお、もし上記コマンドを実行してブラウザ上でページを表示させた時に Class 'NunoMaduro\Collision\Adapters\Laravel\CollisionServiceProvider' not found といったエラーが表示された場合、composer.jsonの "require-dev" 内にある"nunomaduro/larastan": "^{バージョン}"を "require" に移動してみてください(参考ページ)。 以降、ファイルを編集してApp Engine上にその内容を反映させたい場合は $ gcloud app deploy を実行してデプロイを行なってください。 ローカル環境でページを確認したい場合は $ php artisan serve を実行して表示されるURLにアクセスし、公開したページを表示したい場合は $ gcloud app browse を実行してください(App EngineのダッシュボードにURLが表示されているのでそこからアクセスしてもOKです)。 無料枠で運用するためにやっておきたいこと 参考サイト:App Engine の費用の管理 意図せぬ形で料金を請求されてしまうことがないよう、項目6で述べたようにapp.yamlにmax_instances等を設定したり、プロジェクトの設定画面から予算アラートを設定しておきましょう(設定次第では指定したしきい値を超えた場合にアプリを自動的に無効化することもできるみたいです)。 無料枠を超えてしまった等、アプリを停止させたい場合はApp Engineの設定画面の「アプリケーションを無効にする」を押すことで一時的に停止させることができます(後で再開させることもできます)。 万が一に備えて、無料枠で運用できているかこまめにApp Engineのダッシュボードは確認しましょう。 以上、Laravelプロジェクトの作成〜App Engineにデプロイするまでの手順をまとめてみました。最後まで読んでくださりありがとうございました!
