20210620のlaravelに関する記事は14件です。

AWS PollyをLaravelで利用したよ

はじめに Amazon PollyはAWSが提供する深層学習を利用してリアルな音声に変換できるサービスです。 ブラウザの読み上げ機能よりクオリティの高い音声を実現したいなどテキストから音声ファイル(mp3)に変換したい時に活躍するのではないでしょうか。 そんな、AWS Pollyをハッカソンで利用したので備忘録的な感じで書いていきます。Pythonでの記事はたくさん見かけたのですがPHPはあまり見つからなかったので参考になればと思います。 AWSのサンプルコードがありますのでしておきます。PHP Code sample for Amazon Polly ※もし、利用方法などに間違いなどがあればコメントください。 実装 今回はAPIを利用し、下記の工程の流れとなります。 1.テキストをPollyに対してリクエストを送る 2.Pollyで作成したmp3ファイルをAWS S3に保存する。 3.S3に保存されたmp3ファイルのファイルパスをLaravelで取得する。 4.取得した、ファイルパスを保存する。 パッケージをインストールする 必要なパッケージをインストールする composer require aws/aws-sdk-php <?php use Aws\Exception\AwsException; use Aws\Sdk; use Aws\Polly\PollyClient; use App\Models\s3_file_path; public function index(){ $config = [ 'version' => 'latest', 'region' => 'ap-northeast-1', 'credentials' => [ 'key' => env('AWS_ACCESS_KEY_ID'), 'secret' => env('AWS_SECRET_ACCESS_KEY') ] ]; try { $client = new PollyClient($config); $result = $client->startSpeechSynthesisTask([ 'Text' => '再生するテキストです。', 'OutputFormat' => 'mp3', 'OutputS3BucketName' => 'bucket-name', 'VoiceId' => 'Mizuki', ]); $s3_file_path = $result['SynthesisTask']['TaskId']; s3_file_path::create([ 's3_file_path'=>$s3_file_path ]); }catch (AwsException $e) { echo $e->getMessage(); echo "\n"; } } 簡単なプログラムの解説 $client = new PollyClient($config); $result = $client->startSpeechSynthesisTask([ 'Text' => '再生するテキストです。', 'OutputFormat' => 'mp3', 'OutputS3BucketName' => 'bucket-name', 'VoiceId' => 'Mizuki', ]); $s3_file_path = $result['SynthesisTask']['TaskId']; s3_file_path::create([ 's3_file_path'=>$s3_file_path ]); 1.new PollyClientにてインスタンスを生成する。 2.テキストや、アウトプット形式、保存するバケット、読み上げる声優を指定する。 3.$result['SynthesisTask']['TaskId']にS3のファイルパスが保存されているので受け取る。 4.DBにファイルパスを保存する。 補足 パブリックにアクセスを受け付ける場合はS3の設定にてパブリックに公開の状態にすること。 現在の日本語の声優はMizukiさんとtakumiさんが存在するようです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHP、CakePHP、LaravelのそれぞれのXSS対策

XSSとは XSS(クロスサイトスクリプティング)は、脆弱性のあるWebサイトに対して、悪意のある不正なスクリプトを挿入する攻撃のことを示します。 挿入したスクリプトを、サイトに訪れたユーザーに実行させる攻撃のため、ウェブサイトそのものではなく、サイトを利用するユーザーに被害が発生します。 XSS対策を行っていないサイトでは、どのように攻撃されるのか例を見てみます。 XSS対策をしていないサイトの例とXSS攻撃方法 「投稿する」ボタンを押下すると、入力データが保存された後、次の投稿一覧画面に表示されるサイトとします(今回テーマから逸れてしまうので、データベースに保存する処理を省略しています)。 例:投稿フォームと一覧画面 comment_index.php <h1>投稿フォーム</h1> <form action="comment_index.php" method="post"> <p>コメント</p> <input type="text" name="comment"> <input type="submit" value="投稿する"> </form> <h2>投稿一覧</h2> <?php $sql = 'SELECT * FROM comment; $comments = $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC); foreach ($comments as $comment)){ echo '<p>'.$comment['comment'].'</p>'.PHP_EOL; } ?> 図:「投稿する」ボタンをクリックしたらコメント一覧の下に表示される このようなXSS対策を行っていないサイトでは、入力フォームにJSコードを書き込まれると、そのままコードが出力されるため、読み込み時に動作してしまいます。 以下のようなコードを書き込むと、当該ページへアクセスした利用者全員に、alertメッセージが強制的に表示されてしまいます。 <script>window.alert('このメッセージを表示したユーザー全員にアラートメッセージを表示');</script> 図:サイトのユーザー全員にアラートメッセージが表示されてしまう このような脆弱性のある環境では、次のような3つの攻撃が予想されます。 攻撃①:サイトの改ざん JSのコードの差し込みができると、画面の表示内容を変更することができます。 例のようなコメント一覧サイトに、次のようなコードを送信することで、全く別の内容を表示させる事ができます。 改ざんすることで、他にもECサイトで表示価格を変更させたり、会員サイトで再度ログイン画面などを出すことで個人情報を盗み出すといった被害が考えられます。 <script>document.getElementsByTagName("h1")[0].innerHTML = "ウイルスに感染しました!";document.getElementsByTagName("h2")[0].innerHTML = "ウイルスに感染しました!以下のサイトで、大至急セキュリティーソフトをダウンロードしてください";document.getElementsByTagName("p")[0].innerHTML = "";document.getElementsByTagName('h2')[0].insertAdjacentHTML('afterend','<a href=”http://罠サイト”>ダウンロードリンク</div>');</script> 図:コメント一覧サイトの書き換え 攻撃②:フィッシング詐欺 また、以下のようなにJSのコードを送信することで、アクセスと同時に偽サイトに転送させることが可能です。 <script>window.open('http://罠サイト');</script> 本物そっくりのサイトを作成してそこに転移させることで、個人情報を入力させて盗み出すといった被害が考えられます。 攻撃③:セッションハイジャック コンピューター通信で利用する「セッション」を奪い、「なりすまし」で不正アクセスをする行為です。 方法に関してはこちらの方が詳しく書かれていたので、リンクを載せておきます。 対策:サニタイズ(無効化)する XSSの対策は、サニタイズが有効です。 サニタイズとは、ユーザからフォームの値を取得した際に、htmlで特別な意味を持つ以下の記号を別の記号に置換することです。 置換することで、先程のようなスクリプトが実行できなくなるため、被害を防ぐことができます。 記号 サニタイズ < &lt; > &gt; & &amp; " &quot; ' &apos; PHPの場合:htmlspecialchars()を用いる <?php foreach ($comments as $comment)){ $comment = htmlspecialchars($comment['comment'], ENT_QUOTES, 'UTF-8'); echo '<p>'.$comment.'</p>'.PHP_EOL; } CakePHPの場合:h()メソッドを使用する htmlspecialchars()と同義となっています。 <?php foreach ($comments as $comment)){ echo '<p>'.h($comment['comment']).'</p>'.PHP_EOL; } また入力フォームでFormHelperを使用することでも、自動でサニタイズしてくれます。 <?php echo $this->Form->control('comment'); Laravel(blade)の場合: {{ }}で囲む これによって、自動的にhtmlspecialchars関数を通してくれます <?php {{ $comment['comment'] }} XSS対策まとめ PHP CakePHP Laravel htmlspecialchars() h() {{ }} 参考文献 https://www.php.net/manual/ja/function.htmlspecialchars.php https://book.cakephp.org/3/ja/core-libraries/global-constants-and-functions.html https://readouble.com/laravel/7.x/ja/blade.html 体系的に学ぶ 安全なWebアプリケーションの作り方 第2版 徳丸 浩 (著)
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel8でHTTPテスト

はじめに 初めまして。ヤマウチです。 今回は私が業務で実装しているLaravelのHTTPテストに関してPHPUnitのセットアップからテスト実行までの手順をチュートリアル風に書いてみました。 技術面がまだまだ乏しい弱々エンジニアですが、一人でも多くの方に参考になると嬉しいです。 誤った記載がありましたらコメントにてご指摘くださいm(__)m やること 今回はHTTPテストを実施することを目的としますので、すでに実装済みのコードがあることを前提に テストの準備 データの作成 使用するトレイトやメソッド を中心に紹介していきます。 マイグレーションや機能の実装などの紹介は行いません。 また、今回はコントローラの機能テスト(HTTPテスト)を行うていで進めていきます。 テストの準備 Laravelでは、ユニットテストも考慮して作られており、最初からPHPUnitが標準で備わっています。 以下のコマンドを打つことでテスト用のファイルがtests/Featureディレクトリへ配置されます。 $ php artisan make:test UserTest Test created successfully. また、tests/Unitディレクトリ内にテストを作成したい場合は、make:testコマンドを実行するときに--unitオプションを使用することで作成することが可能です。 .env.testingの設定に関して テストを行う際、開発用のDBを汚さずにテストを行いたいこともあるかと思います。そういった場合に.env.testingを別で作成しておくことが必要があります。 バージョンは異なりますが、こちらの記事が参考になったので紹介します。【Laravel】.env.testingの使用方法と注意点 テストを実行してみる 先程のコマンドでテストファイルを作成すると、tests/Featureディレクトリに以下の内容のテストが作成されます。 <?php namespace Tests\Feature; use Illuminate\Foundation\Testing\RefreshDatabase; use Illuminate\Foundation\Testing\WithFaker; use Tests\TestCase; class UserTes extends TestCase { /** * A basic feature test example. * * @return void */ public function testExample() { $response = $this->get('/'); $response->assertStatus(200); } } 内容としては、「get('/')にアクセスすると、レスポンスステータスコード200が返されること。」が書かれています。 早速こちらを試してみます。 基本的には$ ./vendor/bin/phpunitコマンドで全てのテストを実行することができますが、ディレクトリやファイルを指定してテストを実行することも可能です。 $ ./vendor/bin/phpunit ./tests/Feature/ PHPUnit 8.5.8 by Sebastian Bergmann and contributors. ..... 5 / 5 (100%) Time: 1.87 seconds, Memory: 26.00 MB OK (5 tests, 8 assertions) 上記のように出力されれば無事テストが通ったことになり、イメージ通りのプログラムが書けていることの証明になります。(ちゃんとしたテストが書けていれば) しかし、上記のような出力だと、どのテストを実施したかいまいち分かり難いかと思います。 そこで、PHPUnitにはテストをより分かりやすくするためのオプションも備えていますので、ここでいくつか紹介します。 --list-testsオプション どのファイルのどのテストが実行されたかを表示してくれます。 $ ./vendor/bin/phpunit --list-tests ./tests/Feature PHPUnit 8.5.8 by Sebastian Bergmann and contributors. Available test(s): - Tests\Feature\Controllers\AuthTest::test_ユーザーが作成されること - Tests\Feature\Controllers\AuthTest::test_ユーザーが登録されること - Tests\Feature\Controllers\PostTest::test_投稿のテスト - Tests\Feature\ExampleTest::testBasicTest - Tests\Feature\UserTest::testExample --testdoxオプション テストを実行しながら、どのテストが成功し、あるいは失敗したかをリアルタイムで確認することができます。 ついつい--testboxにしがちですが、--testdoxなのでお間違いなく。 $ ./vendor/bin/phpunit --testdox ./tests/Feature PHPUnit 8.5.8 by Sebastian Bergmann and contributors. Auth (Tests\Feature\Controllers\Auth) ✔ ユーザーが作成されること ✔ ユーザーが登録されること Post (Tests\Feature\Controllers\Post) ✔ 投稿のテスト Example (Tests\Feature\Example) ✔ Basic test User (Tests\Feature\User) ✔ Example Time: 1.8 seconds, Memory: 26.00 MB OK (5 tests, 8 assertions) --filterオプション 実行したいテストを、パターンで指定することが可能。 以下の例では、Exampleから始まるファイルのみのテストを実行しています。 ./vendor/bin/phpunit --filter Example --testdox ./tests/Feature PHPUnit 8.5.8 by Sebastian Bergmann and contributors. Example (Tests\Feature\Example) ✔ Basic test User (Tests\Feature\User) ✔ Example Time: 1.46 seconds, Memory: 24.00 MB OK (2 tests, 2 assertions) また、--filterオプションでは、テストファイルだけではなく、特定のテストを指定することも可能です。 その他オプション PHPUnitのコマンドラインオプションに関してはphpunit --helpコマンドにて確認することができます。 コマンドラインオプション コントローラのテスト それでは本題のコントローラのテストを行います。 ですがその前に準備として、テストデータを作成する必要があるので、作成方法を記載します。 モデルファクトリの定義 テストを行う際、データベースにあらかじめいくつかのレコードを準備しておく必要があります。このテストデータを作成するときに各カラムの値を自分でいちいち指定する代わりに、Laravelではモデルファクトリを使用し、各Eloquentモデルのデフォルト属性を定義できます。 モデルファクトリの定義 モデルファクトリの作成 モデルファクトリを作成するにはまず、以下のコマンドを実行します。 php artisan make:factory UserFactory --model=User --modelオプションは、ファクトリにより作成するモデルの名前を指定するために使用します。 上記コマンドを実行すると、database/factoriesディレクトリに以下のファイルが作成されます。 ※return以下は、必要なレコードを作成するために各々で定義します。 UserFactory.php database/factories/UserFactory.php <?php namespace Database\Factories; use App\Models\User; use Illuminate\Database\Eloquent\Factories\Factory; use Illuminate\Support\Str; use Illuminate\Support\Facades\Hash; class UserFactory extends Factory { /** * The name of the factory's corresponding model. * * @var string */ protected $model = User::class; // モデルとの紐付け /** * Define the model's default state. * * @return array */ public function definition() { return [  // 以下は適宜定義 'name' => $this->faker->name, 'email' => $this->faker->unique()->safeEmail, 'email_verified_at' => now(), 'password' => Hash::make(12345678), 'remember_token' => Str::random(10), ]; } } User.php app/Models/User.php <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; class User extends Authenticatable { use HasFactory; // 必要 } 以上でデータ作成のための前準備は完了です。 あとは必要な時にモデルからfactory()メソッドを呼び出すことでデータを作成することができます。 ※Laravel8から、モデルファクトリを使用したデータの作成方法がこれまでと異なります。 以下の記事が非常に参考になります。 Laravel8で完成されたModelFactoryの使い方 テスト作成(GETリクエスト) ここからは実際にコントローラのテストを書いていきます。 すでにログイン済みの画面から、別の画面へ遷移できることをテストで確認していきたいと思います。 tests/Feature/Controllers/ControllerTest.php <?php namespace Tests\Feature\Controllers; use Tests\TestCase; use App\Models\User; use Database\Seeders\GenreSeeder; class ControllerTest extends TestCase { use WithoutMiddleware; public function test_画面遷移のテスト() { // 認証済みユーザーの作成 $loginUser = User::factory()->create(); // Userモデルからfactory()を呼び出すことでユーザーを作成 $request = $this->actingAs($loginUser) ->get('main/display'); $request->assertOk(); } } // ------------------------------------------------------ Controller (Tests\Feature\Controllers\Controller) ✔ 画面遷移のテスト Time: 1.9 seconds, Memory: 28.00 MB OK (1 tests, 1 assertions) 上記テストのポイントとして気をつけなければいけないことは、「すでにログイン済みの画面から、別の画面へ遷移」することです。 つまり、認証済みのユーザーからリクエストを投げなければなりません。 そこで必要になるのが、actingAs()メソッドです。公式ドキュメントに詳しい説明があるのでぜひ読んでみてください。 もし、actingAs()を忘れていた場合、ステータスコード302が返されるので、そこも同時に覚えておくと良いでしょう。 HTTP 302 Post (Tests\Feature\Controllers\ControllerTest) ✘ 画面遷移のテスト ┐ ├ Response status code [302] does not match expected 200 status code. ├ Failed asserting that false is true. テスト作成(POSTリクエスト) 次は、POSTリクエストのテストを書いていきます。 よくある投稿機能のテストを想定とし、 タイトル ジャンル 本文 をリクエストパラメータとします。 tests/Feature/Controllers/PostTest.php <?php namespace Tests\Feature\Controllers; use Illuminate\Foundation\Testing\WithoutMiddleware; use Tests\TestCase; use App\Models\User; use App\Models\Post; use Database\Seeders\GenreSeeder; class PostTest extends TestCase { use WithoutMiddleware; // ミドルウェアを無効化 public function test_投稿のテスト() { $this->withoutMiddleware([VerifyCsrfToken::class]); // 特定のミドルウェアを無効化 $loginUser = User::factory()->create(); $request = $this->actingAs($loginUser) ->post('/post/insert', [ 'title' => 'テスト', 'comment' => 'これはテストです。', 'genres' => [3, 4, 5] ]); $newPost = Post::where('title', 'テスト')->first(); self::assertSame('これはテストです。', $newPost->comment); $request->assertRedirect('main/display'); } } // -------------------------------------------------------- Post (Tests\Feature\Controllers\Post) ✔ 投稿のテスト Time: 1.9 seconds, Memory: 28.00 MB OK (1 tests, 2 assertions) ここでもいくつかポイントを紹介します。 $this->withoutMiddleware([VerifyCsrfToken::class]); ここではテストの際に無効化したいミドルウェアを記載しています。 今回の例で説明しますと、POSTリクエストの際に必要となるCSRF(クロス・サイト・リクエスト・フォージェリ)を無効化しています。 use WithoutMiddleware;ここの記載のみでもミドルウェアを無効化することができますが、$this->withoutMiddleware();によって、特定のミドルウェアに絞らないと全てのミドルウェアを無効化してしまうことになるので、必要な時に必要なミドルウェアのみ無効化しましょう。 Laravel 8.x ミドルウェア 参考にした記事 また、上記の記載がなければステータスコード419(Laravelの非公式HTTPコード)が返されますので、同時に覚えておくと良いでしょう。 ステータスコード419 ✘ 投稿のテスト ┐ ├ Response status code [419] is not a redirect status code. ├ Failed asserting that false is true. まとめ 今回はPHPUnitセットアップ → データ作成 → テスト実施と、かなり大雑把な説明となってしまいました。 また、本記事では、2つのHTTPテストしか実施していませんが、実際にテストを書く際にはもっと様々なテストパターンを作成しなければなりませんし、PHPUnitには他にもたくさんの便利な機能が備わっています。 次回以降は、さらに焦点を絞った内容でテストに関する記事を書いていけたらいいなと考えています。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravel 製アプリケーションに対する自動テストでなにをどうテストすればいいか

この記事について 自分の所属するチームに、自動テストを書いたことがないメンバーが加わったとき、ガイドラインとなるようなドキュメントがほしいなと思っていたので、書きました。どうせなら他のチームでも使いたいので、ドメインはぼかして汎用的になるようにして公開します。独自のベストプラクティス的なものですが、これまでのチームではわりとどこもこれに近くうまくいっていたので、汎用的に使えるんじゃないかと想像します。 はじめに 環境 Laravel: 5.8 以上 PHP: 7.0 以上 PHPUnit: 7.0 以上 いちおうバージョンは書きましたが、あまり関係はないです。 基本方針 基本方針は、自分の経験上これがいちばんコストパフォーマンスがいいと思っているガイドラインですが、自分はベンチャーやスタートアップ企業で、スピード重視の文化に身を置くことが多いため、テストは最低限にして、素早くリリースするのに適した形になっています。プロダクトの性質や扱うドメインによってはもう少し厳格にやったほうがいい場合もあると思うので、そこは適宜補ってください。 フィーチャーテストの方針 ウェブ API ごとのフィーチャーテストは必ず書く(最低限正常系) ユニットテストの方針 以下のいずれかに該当する場合はユニットテストを書く(ただし、フィーチャーテストでカバーできれば省略も可) 金額計算などプログラムミス発生時のリスクが高いモジュール 入出力パラメータのパターンが多いモジュール 頻繁に仕様が変わるモジュール フィーチャーテストのガイドライン 「ウェブ API ごとのフィーチャーテストは必ず書く(最低限正常系)」 フィーチャーテストで検証する対象は以下の3つです: ステータスコード レスポンスデータ API 実行後に変化する状態 命名に関するガイドライン 原則的に、テストクラスの名前空間はテスト対象のクラスと対応するようにする 1つのクラスに対して複数のテストクラスが対応する場合は、テストクラス名を名前空間として、その下にテストクラスを配置する 例)Tests\Feature\Http\Controllers\SomeController\IndexTest 原則的に、テストメソッド名はテスト対象のメソッド名と対応するようにする 1つのメソッドに対して複数のテストメソッドが対応する場合は、サフィックスでわけるようにする 例)testInvoke_Successfull, testInvoke_FailedNotAuthorized 構造に関するガイドライン すべてのテストクラスは Tests\TestCase を継承してください テストメソッドの中身は以下の構成にしてください(小項目の順番は多少前後してもいいです) 準備 フェイク準備 データ準備 モック準備 実行 リクエストパラメータ構築 API コール 検証 ステータスコード検証 レスポンスデータ検証 状態変化検証 状態変化は、データベースや通知、ファイルなど、場合によって様々ですが、基本的には PHPUnit のアサーション、あるいは Laravel が拡張したアサーションで対応できるはずです。 モックに関するガイドライン 必ずモックしなければならないのは以下のパターンです: 外部 API 呼び出し ファイルI/O 通知系 Facade::fake() で対応できる部分は積極的に使っていきましょう。 フィーチャーテストのサンプルコード <?php // 原則的に名前空間の Http 以下は、プロダクションコードと同じ階層にする(対になるように) namespace Tests\Feature\Http\Controllers; // 独自で拡張してない場合を除いて Laravel が提供している基底クラスを継承する use Tests\TestCase; // 原則的にクラス名は、SUT(テスト対象)のクラス名 + Test となるようにする(対になるように) class HelloControllerTest extends TestCase { // テストメソッド名は test で始め、テスト対象のメソッド名と対になるようにする(この場合は __invoke がテスト対象) public function testInvoke(): void { // 1. 準備 // 1.1. フェイク準備 Notification::fake(); // 1.2. データ準備 $user = User::factory()->create(); $message = 'hello'; // 1.3. モック準備 $this->mock(ExternalApi::class, function ($mock) use ($message) { $mock->shouldReceive('send') ->once() ->with($message) ->andReturn(['message' => $message]); }) // 2. 実行 // 2.1. リクエストデータ構築 $payload = ['message' => $message]; // 2.2. API コール実行 $response = $this->actingAs($user) ->postJson('/hello', $payload) // 3. 検証 // 3.1. ステータスコード検証 $resuponse->assertOk(); // 3.2. レスポンス検証 $response->assertJsonExact(['message' => $payload['message']]); // 3.3. 状態変化検証 $this->assertDatabaseHas('messages', [ 'user_id' => $user->id, 'message' => $payload['message'], ]); Notification::assertSentTo( $user, HelloNotification::class, function ($notification, $channels, $notifiable) use ($payload) { return $notifiable->message->body === $payload['message']; } ); } } ユニットテストのガイドライン 「以下のいずれかに該当する場合はユニットテストを書く(ただし、フィーチャーテストでカバーできれば省略も可)」 金額計算などプログラムミス発生時のリスクが高いモジュール 入出力パラメータのパターンが多いモジュール 頻繁に仕様が変わるモジュール ユニットテストで検証する対象は以下の2つです: 関数の返却値(または例外) 実行後に変化する状態 命名に関するガイドライン フィーチャーテストと同じ 構造に関するガイドライン 以下の点以外はフィーチャーテストと同じ すべてのテストクラスは PHPUnit\Framework\TestCase を継承してください ユニットテストの基底クラスは原則的に PHPUnit が提供している TestCase クラスを使いますが、テスト対象がデータベースアクセスやファサードなど、Laravel に依存する部分と密結合している場合は、Laravel が提供している Tests\TestCase を継承してもかまいません。 モックに関するガイドライン フィーチャーテストと同じ 基本的に、ユニットテストのテスト対象となるようなクラスはプレーンなクラスになるよう、データベースへのアクセスが発生しないようなつくりにしてください。それでもやむを得ずデータベースへのアクセスが発生するようなケースでも、データベースアクセスを担当するクラスのモックはつくらない方針ですが、パターンが多くテストケースの実行に時間がかかる場合は、リファクタリングを行い、データベースアクセスを行うクラスをモックできるような形に変え、依存を排除してください。 例)ユーザーが持つクーポンから値引きして料金計算を行う テスト対象にデータベース依存がある構造 PriceCalculator.php public function calculate(int $price, User $user): int { $coupon = UserCoupon::where('user_id', $user->id)->first(); if ($coupon) { $price = max($price - $coupon->value, 0); } // 他の計算 return $price; } テスト対象にデータベース依存がない構造 PriceCalculator.php public function calculate(int $price, int $coupon): int { $price = max($price - $coupon->value, 0); // 他の計算 return $price; } // 呼び出し時 $coupon = UserCoupon::where('user_id', $user->id)->first(); $calculator = new PriceCalculator(); $price = $calculator->calculate($amount, $coupon ? $coupon->value : 0); Eloquent な Model クラスはデータベースアクセスを発生させないようにできるので、上記の形で排除できない場合は、次の形式を検討してください。 PriceCalculator.php public function calculate(int $price, User $user): int { $coupon = $user->coupon; if ($coupon) { $price = max($price - $coupon->value, 0); } // 他の計算 return $price; } // 呼び出し時 $user->coupon = new UserCoupon(['value' => 500]); $calculator = new PriceCalculator(); $price = $this->calculatePrice($amount, $user); ユニットテストのサンプルコード <?php // 原則的に名前空間の Unit 以下は、プロダクションコードと同じ階層にする(対になるように) namespace Tests\Unit\Models; // 独自で拡張してない場合を除いて PHPUnit が提供している基底クラスを継承する use PHPUnit\Framework\TestCase; // 原則的にクラス名は、SUT(テスト対象)のクラス名 + Test となるようにする(対になるように) class PriceCalculatorTest extends TestCase { /** * @param int $amount * @param ?UserCoupon $coupon * @param int $expected * @dataProvider dataCalculate */ // テストメソッド名は test で始め、テスト対象のメソッド名と対になるようにする(この場合は __invoke がテスト対象) public function testCalculate(int $amount, ?UserCoupon $coupon, int $expected): void { $user = User::factory()->make(); // 保存はしない $user->coupon = $coupon; $calculator = new PriceCalculator(); $this->assertSame($expected, $calculator->calculate($amount, $user)); } // データプロバイダメソッド名は data で始め、テストメソッド名と対になるようにする public function dataCalculate(): array { // 各テストパターンの配列は連想配列にし、テストメソッドの引数と対応するようにする return [ 'クーポンあり' => [ 'amount' => 5000, 'coupon' => new UserCoupon(['value' => 500]), // 保存はしない /* * 8.x 未満のモデルファクトリを使う場合はクロージャにする * 'coupon' => fn() => factory(UserCoupon::class)->make(['value' => 500]), */ 'expected' => 4500, ], 'クーポンなし' => [ 'amount' => 5000, 'coupon' => null 'expected' => 5000, ], ]; } } その他のガイドライン パターンが複数ある場合はデータプロバイダを使ってください 比較には assertSame を使ってください パターンが複数ある場合はデータプロバイダを使ってください 例)フィーチャーテスト /** * @param Closure $prepare * @param Closure $assert * @dataProvider dataInvoke */ public function testInvoke(Closure $prepare, Closure $assert): void { // 1. 準備 $prepare(); // 2. 実行 // 省略 // 3. 検証 $assert($this, $response); } // メソッド名はテストメソッドと対になるように(testInvoke なら dataInvoke) public function dataInvoke(): array { return [ 'パターンがわかるようなキーにしてください' => [ 'prepare' => function () { // データの構築やらなにやら }, 'assert' => function (TestCase $testCase, TestResponse $response) { // レスポンスの検証やらなにやら }, ], ]; } データプロバイダが返す配列は、連想配列のほうがいいと思います(キーが変数名になります)。データプロバイダ内ではファクトリもファサードも使えないので、なるべくプリミティブな値を返すようなつくりにしておいたほうがいいんですが、フィーチャーテストの場合は、モデルファクトリーでデータをつくったり、Facade::fake() を呼んだりするので上記例のように、クロージャを渡すのがいいでしょう。 例)ユニットテスト public function testCalculate(int $amount, int $coupon, int $expected): void { $calculator = new PriceCalculator(); $actual = $calculator->calculate($amount, $coupon); $this->assertSame($expected, $actual); } public function dataCalculate(): array { return [ 'クーポンあり' => [ 'amount' => 4000, 'coupon' => 500, 'expected' => 3850, ], ]; } ユニットテストの場合も、フィーチャーテストでの使い方と同じです。 比較には assertSame を使ってください assertEquals は緩い比較なので、原則 assertSame を使ってください。 $this->assertEquals(10, 10.0); // passes $this->assertSame(10, 10.0); // fails おわりに ざっと思いついたガイドラインを列挙してみました。またなにか(思いついた|質問された)ら追加します。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS Cloud9でlaravelの環境立てたら、見たことないエラーに遭遇したので、Google先生に質問してみる

やりたいこと AWS cloud9 でとりあえずlaravelのprojectをgitcloneしたい。 免責事項 以下の手順は2021/6/20に実施しました。環境の更新によっては手順ができない可能性があります。 手順 PHPのバージョン確認をします OrganizationAccountAccessRole:~/environment $ php -v PHP 7.2.24 (cli) (built: Oct 31 2019 18:27:08) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies PHPのversionが7.2でした。このままgithubからcloneしたのちプロジェクトを動かそうとするとphpのバージョンの影響により動作しません。ご自身で使われているPHPのバージョを合わせる作業を実施します php7.3をインストールしようとします OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras install php7.3 Refusing because php7.3 could cause an invalid combination. 拒否されたので確認します。 OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras list | grep php 15 php7.2 available \ 17 lamp-mariadb10.2-php7.2=latest enabled \ _ php7.3 available \ _ php7.4 available [ =stable ] _ php8.0 available [ =stable ] lamp-mariadb10.2-php7.2=latest enabled が有効化しておりますので競合し拒絶されています。 競合となるものを無効化する OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras disable lamp-mariadb10.2-php7.2 Beware that disabling topics is not supported after they are installed. 0 ansible2 available \ [ =2.4.2 =2.4.6 =2.8 =stable ] 2 httpd_modules available [ =1.0 =stable ] 3 memcached1.5 available \ [ =1.5.1 =1.5.16 =1.5.17 ] 5 postgresql9.6 available \ [ =9.6.6 =9.6.8 =stable ] 6 postgresql10 available [ =10 =stable ] 9 R3.4 available [ =3.4.3 =stable ] 10 rust1 available \ [ =1.22.1 =1.26.0 =1.26.1 =1.27.2 =1.31.0 =1.38.0 =stable ] 11 vim available [ =8.0 =stable ] 15 php7.2 available \ [ =7.2.0 =7.2.4 =7.2.5 =7.2.8 =7.2.11 =7.2.13 =7.2.14 =7.2.16 =7.2.17 =7.2.19 =7.2.21 =7.2.22 =7.2.23 =7.2.24 =7.2.26 =stable ] 17 lamp-mariadb10.2-php7.2 available \ [ =10.2.10_7.2.0 =10.2.10_7.2.4 =10.2.10_7.2.5 =10.2.10_7.2.8 =10.2.10_7.2.11 =10.2.10_7.2.13 =10.2.10_7.2.14 =10.2.10_7.2.16 =10.2.10_7.2.17 =10.2.10_7.2.19 =10.2.10_7.2.22 =10.2.10_7.2.23 =10.2.10_7.2.24 =stable ] 18 libreoffice available \ [ =5.0.6.2_15 =5.3.6.1 =stable ] 19 gimp available [ =2.8.22 ] 20 docker=latest enabled \ [ =17.12.1 =18.03.1 =18.06.1 =18.09.9 =stable ] 21 mate-desktop1.x available \ [ =1.19.0 =1.20.0 =stable ] 22 GraphicsMagick1.3 available \ [ =1.3.29 =1.3.32 =1.3.34 =stable ] 23 tomcat8.5 available \ [ =8.5.31 =8.5.32 =8.5.38 =8.5.40 =8.5.42 =8.5.50 =stable ] 24 epel=latest enabled [ =7.11 =stable ] 25 testing available [ =1.0 =stable ] 26 ecs available [ =stable ] 27 corretto8 available \ [ =1.8.0_192 =1.8.0_202 =1.8.0_212 =1.8.0_222 =1.8.0_232 =1.8.0_242 =stable ] 28 firecracker available [ =0.11 =stable ] 29 golang1.11 available \ [ =1.11.3 =1.11.11 =1.11.13 =stable ] 30 squid4 available [ =4 =stable ] 31 php7.3 available \ [ =7.3.2 =7.3.3 =7.3.4 =7.3.6 =7.3.8 =7.3.9 =7.3.10 =7.3.11 =7.3.13 =stable ] 32 lustre2.10 available \ [ =2.10.5 =2.10.8 =stable ] 33 java-openjdk11 available [ =11 =stable ] 34 lynis available [ =stable ] 35 kernel-ng available [ =stable ] 36 BCC available [ =0.x =stable ] 37 mono available [ =5.x =stable ] 38 nginx1 available [ =stable ] 39 ruby2.6 available [ =2.6 =stable ] 40 mock available [ =stable ] 41 postgresql11 available [ =11 =stable ] 42 php7.4 available [ =stable ] 43 livepatch available [ =stable ] 44 python3.8 available [ =stable ] 45 haproxy2 available [ =stable ] 46 collectd available [ =stable ] 47 aws-nitro-enclaves-cli available [ =stable ] 48 R4 available [ =stable ] 49 kernel-5.4 available [ =stable ] 50 selinux-ng available [ =stable ] 51 php8.0 available [ =stable ] 52 tomcat9 available [ =stable ] 53 unbound1.13 available [ =stable ] 54 mariadb10.5 available [ =stable ] 55 kernel-5.10 available [ =stable ] 56 redis6 available [ =stable ] これで無効化できました。この時点ではphpのバージョンは変わりません。 次に無効化できたかどうか確認します。 OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras list | grep php 15 php7.2 available \ 17 lamp-mariadb10.2-php7.2 available \ 31 php7.3 available \ 42 php7.4 available [ =stable ] 51 php8.0 available [ =stable ] 7.3を有効化します OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras enable php7.3 0 ansible2 available \ [ =2.4.2 =2.4.6 =2.8 =stable ] 2 httpd_modules available [ =1.0 =stable ] 3 memcached1.5 available \ [ =1.5.1 =1.5.16 =1.5.17 ] 5 postgresql9.6 available \ [ =9.6.6 =9.6.8 =stable ] 6 postgresql10 available [ =10 =stable ] 9 R3.4 available [ =3.4.3 =stable ] 10 rust1 available \ [ =1.22.1 =1.26.0 =1.26.1 =1.27.2 =1.31.0 =1.38.0 =stable ] 11 vim available [ =8.0 =stable ] _ php7.2 available \ [ =7.2.0 =7.2.4 =7.2.5 =7.2.8 =7.2.11 =7.2.13 =7.2.14 =7.2.16 =7.2.17 =7.2.19 =7.2.21 =7.2.22 =7.2.23 =7.2.24 =7.2.26 =stable ] _ lamp-mariadb10.2-php7.2 available \ [ =10.2.10_7.2.0 =10.2.10_7.2.4 =10.2.10_7.2.5 =10.2.10_7.2.8 =10.2.10_7.2.11 =10.2.10_7.2.13 =10.2.10_7.2.14 =10.2.10_7.2.16 =10.2.10_7.2.17 =10.2.10_7.2.19 =10.2.10_7.2.22 =10.2.10_7.2.23 =10.2.10_7.2.24 =stable ] 18 libreoffice available \ [ =5.0.6.2_15 =5.3.6.1 =stable ] 19 gimp available [ =2.8.22 ] 20 docker=latest enabled \ [ =17.12.1 =18.03.1 =18.06.1 =18.09.9 =stable ] 21 mate-desktop1.x available \ [ =1.19.0 =1.20.0 =stable ] 22 GraphicsMagick1.3 available \ [ =1.3.29 =1.3.32 =1.3.34 =stable ] 23 tomcat8.5 available \ [ =8.5.31 =8.5.32 =8.5.38 =8.5.40 =8.5.42 =8.5.50 =stable ] 24 epel=latest enabled [ =7.11 =stable ] 25 testing available [ =1.0 =stable ] 26 ecs available [ =stable ] 27 corretto8 available \ [ =1.8.0_192 =1.8.0_202 =1.8.0_212 =1.8.0_222 =1.8.0_232 =1.8.0_242 =stable ] 28 firecracker available [ =0.11 =stable ] 29 golang1.11 available \ [ =1.11.3 =1.11.11 =1.11.13 =stable ] 30 squid4 available [ =4 =stable ] 31 php7.3=latest enabled \ [ =7.3.2 =7.3.3 =7.3.4 =7.3.6 =7.3.8 =7.3.9 =7.3.10 =7.3.11 =7.3.13 =stable ] 32 lustre2.10 available \ [ =2.10.5 =2.10.8 =stable ] 33 java-openjdk11 available [ =11 =stable ] 34 lynis available [ =stable ] 35 kernel-ng available [ =stable ] 36 BCC available [ =0.x =stable ] 37 mono available [ =5.x =stable ] 38 nginx1 available [ =stable ] 39 ruby2.6 available [ =2.6 =stable ] 40 mock available [ =stable ] 41 postgresql11 available [ =11 =stable ] _ php7.4 available [ =stable ] 43 livepatch available [ =stable ] 44 python3.8 available [ =stable ] 45 haproxy2 available [ =stable ] 46 collectd available [ =stable ] 47 aws-nitro-enclaves-cli available [ =stable ] 48 R4 available [ =stable ] 49 kernel-5.4 available [ =stable ] 50 selinux-ng available [ =stable ] _ php8.0 available [ =stable ] 52 tomcat9 available [ =stable ] 53 unbound1.13 available [ =stable ] 54 mariadb10.5 available [ =stable ] 55 kernel-5.10 available [ =stable ] 56 redis6 available [ =stable ] Now you can install: # yum clean metadata # yum install php-cli php-pdo php-fpm php-json php-mysqlnd 無事有効化できました。念のため確認ののち、以下のコマンドを実行します。 確認 OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras list | grep php _ php7.2 available \ _ lamp-mariadb10.2-php7.2 available \ 31 php7.3=latest enabled \ _ php7.4 available [ =stable ] _ php8.0 available [ =stable ] 実行コマンド Now you can install: # yum clean metadata # yum install php-cli php-pdo php-fpm php-json php-mysqlnd # yum clean metadata OrganizationAccountAccessRole:~/environment $ yum clean metadata Loaded plugins: extras_suggestions, langpacks, priorities, update-motd Cleaning repos: amzn2-core amzn2extra-docker amzn2extra-epel amzn2extra-php7.3 epel hashicorp 14 metadata files removed 0 sqlite files removed 0 metadata files removed # yum install php-cli php-pdo php-fpm php-json php-mysqlnd OrganizationAccountAccessRole:~/environment $ yum install php-cli php-pdo php-fpm php-json php-mysqlnd Loaded plugins: extras_suggestions, langpacks, priorities, update-motd You need to be root to perform this command. 準備完了しました。ちなみにまだversionが上がっているわけではありません OrganizationAccountAccessRole:~/environment $ php -v PHP 7.2.24 (cli) (built: Oct 31 2019 18:27:08) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies ここでupdateコマンドを打ちます OrganizationAccountAccessRole:~/environment $ sudo yum update -y Loaded plugins: extras_suggestions, langpacks, priorities, update-motd amzn2extra-docker | 3.0 kB 00:00:00 amzn2extra-epel | 3.0 kB 00:00:00 amzn2extra-php7.3 | 3.0 kB 00:00:00 (1/2): amzn2extra-php7.3/2/x86_64/updateinfo | 76 B 00:00:00 (2/2): amzn2extra-php7.3/2/x86_64/primary_db | 471 kB 00:00:00 235 packages excluded due to repository priority protections Resolving Dependencies --> Running transaction check ---> Package php-cli.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-cli.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-common.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-common.x86_64 0:7.3.28-1.amzn2 will be an update --> Processing Dependency: libzip.so.5()(64bit) for package: php-common-7.3.28-1.amzn2.x86_64 ---> Package php-devel.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-devel.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-fpm.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-fpm.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-json.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-json.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-mysqlnd.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-mysqlnd.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-pdo.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-pdo.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-process.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-process.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-xml.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-xml.x86_64 0:7.3.28-1.amzn2 will be an update --> Running transaction check ---> Package libzip.x86_64 0:1.3.2-1.amzn2.0.1 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================================================================================================================================================================= Package Arch Version Repository Size ================================================================================================================================================================================================================================= Updating: php-cli x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 4.8 M php-common x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 1.1 M php-devel x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 1.3 M php-fpm x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 1.7 M php-json x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 71 k php-mysqlnd x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 236 k php-pdo x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 132 k php-process x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 88 k php-xml x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 210 k Installing for dependencies: libzip x86_64 1.3.2-1.amzn2.0.1 amzn2-core 62 k Transaction Summary ================================================================================================================================================================================================================================= Install ( 1 Dependent package) Upgrade 9 Packages Total download size: 9.7 M Downloading packages: Delta RPMs disabled because /usr/bin/applydeltarpm not installed. (1/10): libzip-1.3.2-1.amzn2.0.1.x86_64.rpm | 62 kB 00:00:00 (2/10): php-common-7.3.28-1.amzn2.x86_64.rpm | 1.1 MB 00:00:00 (3/10): php-cli-7.3.28-1.amzn2.x86_64.rpm | 4.8 MB 00:00:00 (4/10): php-devel-7.3.28-1.amzn2.x86_64.rpm | 1.3 MB 00:00:00 (5/10): php-json-7.3.28-1.amzn2.x86_64.rpm | 71 kB 00:00:00 (6/10): php-fpm-7.3.28-1.amzn2.x86_64.rpm | 1.7 MB 00:00:00 (7/10): php-mysqlnd-7.3.28-1.amzn2.x86_64.rpm | 236 kB 00:00:00 (8/10): php-pdo-7.3.28-1.amzn2.x86_64.rpm | 132 kB 00:00:00 (9/10): php-process-7.3.28-1.amzn2.x86_64.rpm | 88 kB 00:00:00 (10/10): php-xml-7.3.28-1.amzn2.x86_64.rpm | 210 kB 00:00:00 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 20 MB/s | 9.7 MB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : libzip-1.3.2-1.amzn2.0.1.x86_64 1/19 Updating : php-common-7.3.28-1.amzn2.x86_64 2/19 Updating : php-json-7.3.28-1.amzn2.x86_64 3/19 Updating : php-cli-7.3.28-1.amzn2.x86_64 4/19 Updating : php-pdo-7.3.28-1.amzn2.x86_64 5/19 Updating : php-mysqlnd-7.3.28-1.amzn2.x86_64 6/19 Updating : php-devel-7.3.28-1.amzn2.x86_64 7/19 Updating : php-fpm-7.3.28-1.amzn2.x86_64 8/19 Updating : php-xml-7.3.28-1.amzn2.x86_64 9/19 Updating : php-process-7.3.28-1.amzn2.x86_64 10/19 Cleanup : php-devel-7.2.24-1.amzn2.0.1.x86_64 11/19 Cleanup : php-cli-7.2.24-1.amzn2.0.1.x86_64 12/19 Cleanup : php-mysqlnd-7.2.24-1.amzn2.0.1.x86_64 13/19 Cleanup : php-pdo-7.2.24-1.amzn2.0.1.x86_64 14/19 Cleanup : php-process-7.2.24-1.amzn2.0.1.x86_64 15/19 Cleanup : php-xml-7.2.24-1.amzn2.0.1.x86_64 16/19 Cleanup : php-fpm-7.2.24-1.amzn2.0.1.x86_64 17/19 Cleanup : php-json-7.2.24-1.amzn2.0.1.x86_64 18/19 Cleanup : php-common-7.2.24-1.amzn2.0.1.x86_64 19/19 Verifying : php-fpm-7.3.28-1.amzn2.x86_64 1/19 Verifying : php-cli-7.3.28-1.amzn2.x86_64 2/19 Verifying : php-xml-7.3.28-1.amzn2.x86_64 3/19 Verifying : php-json-7.3.28-1.amzn2.x86_64 4/19 Verifying : libzip-1.3.2-1.amzn2.0.1.x86_64 5/19 Verifying : php-process-7.3.28-1.amzn2.x86_64 6/19 Verifying : php-mysqlnd-7.3.28-1.amzn2.x86_64 7/19 Verifying : php-devel-7.3.28-1.amzn2.x86_64 8/19 Verifying : php-pdo-7.3.28-1.amzn2.x86_64 9/19 Verifying : php-common-7.3.28-1.amzn2.x86_64 10/19 Verifying : php-common-7.2.24-1.amzn2.0.1.x86_64 11/19 Verifying : php-fpm-7.2.24-1.amzn2.0.1.x86_64 12/19 Verifying : php-process-7.2.24-1.amzn2.0.1.x86_64 13/19 Verifying : php-cli-7.2.24-1.amzn2.0.1.x86_64 14/19 Verifying : php-pdo-7.2.24-1.amzn2.0.1.x86_64 15/19 Verifying : php-json-7.2.24-1.amzn2.0.1.x86_64 16/19 Verifying : php-mysqlnd-7.2.24-1.amzn2.0.1.x86_64 17/19 Verifying : php-xml-7.2.24-1.amzn2.0.1.x86_64 18/19 Verifying : php-devel-7.2.24-1.amzn2.0.1.x86_64 19/19 Dependency Installed: libzip.x86_64 0:1.3.2-1.amzn2.0.1 Updated: php-cli.x86_64 0:7.3.28-1.amzn2 php-common.x86_64 0:7.3.28-1.amzn2 php-devel.x86_64 0:7.3.28-1.amzn2 php-fpm.x86_64 0:7.3.28-1.amzn2 php-json.x86_64 0:7.3.28-1.amzn2 php-mysqlnd.x86_64 0:7.3.28-1.amzn2 php-pdo.x86_64 0:7.3.28-1.amzn2 php-process.x86_64 0:7.3.28-1.amzn2 php-xml.x86_64 0:7.3.28-1.amzn2 Complete! ここまでで完了です。確認するとバージョンが上がっています OrganizationAccountAccessRole:~/environment $ php -v PHP 7.3.28 (cli) (built: May 13 2021 22:37:44) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.28, Copyright (c) 1998-2018 Zend Technologies ここから対象のURLを元にgit cloneしていきます OrganizationAccountAccessRole:~/environment $ git clone yourURL Cloning into 'TOTONOI'... The authenticity of host 'github.com (52.69.186.44)' can't be established. RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. RSA key fingerprint is MD5:16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'github.com,52.69.186.44' (RSA) to the list of known hosts. Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 弾かれました。ここはsshの公開鍵をこの環境で作ってないので当然ですね。作っていきます。 ssh公開鍵登録作業 OrganizationAccountAccessRole:~/environment $ cd .. OrganizationAccountAccessRole:~ $ ls environment node_modules package-lock.json OrganizationAccountAccessRole:~ $ ls -a . .aws .bash_logout .bashrc .cache environment .gitconfig .mkshrc .npm .nvm .profile .ssh .zshrc .. .bash_history .bash_profile .c9 .config .gem .gnupg node_modules .npmrc package-lock.json .rvm .zlogin OrganizationAccountAccessRole:~ $ cd .ssh OrganizationAccountAccessRole:~/.ssh $ ls authorized_keys known_hosts OrganizationAccountAccessRole:~/.ssh $ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/ec2-user/.ssh/id_rsa. Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub. The key fingerprint is: SHA256:uqT24L1+8UDI0Ljs4XOco0CPz29sMw1iefTJumwYMOU ec2-user@ip-172-31-9-197.ap-northeast-1.compute.internal The key's randomart image is: your ssh OrganizationAccountAccessRole:~/.ssh $ OrganizationAccountAccessRole:~/.ssh $ ls authorized_keys id_rsa id_rsa.pub known_hosts OrganizationAccountAccessRole:~/.ssh $ cat id_rsa.pub ssh-rsa your ssh あとはsshをgithubに登録してください 再トライ OrganizationAccountAccessRole:~/environment $ git clone youtURL Cloning into 'hogehoge'... remote: Enumerating objects: 458, done. remote: Counting objects: 100% (458/458), done. remote: Compressing objects: 100% (258/258), done. remote: Total 458 (delta 214), reused 410 (delta 172), pack-reused 0 Receiving objects: 100% (458/458), 833.04 KiB | 1.28 MiB/s, done. Resolving deltas: 100% (214/214), done. できましたので、プロジェクトの設定をしていきます。 プロジェクトの設定をしていきます OrganizationAccountAccessRole:~/environment $ cd/ OrganizationAccountAccessRole:~/environment/hogehoge(main) $ ls app bootstrap composer.lock database package-lock.json public resources select storage tests artisan composer.json config package.json phpunit.xml README.md routes server.php tailwind.config.js webpack.mix.js OrganizationAccountAccessRole:~/environment/hoge(main) $ composer install bash: composer: command not found OrganizationAccountAccessRole:~/environment/hoge(main) $ curl -sS https://getcomposer.org/installer | php All settings correct for using Composer Downloading... Composer (version 2.1.3) successfully installed to: /home/ec2-user/environment/TOTONOI/composer.phar Use it: php composer.phar OrganizationAccountAccessRole:~/environment/hoge(main) $ sudo mv composer.phar /usr/local/bin/composer OrganizationAccountAccessRole:~/environment/hoge (main) $ composer ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/ Composer version 2.1.3 2021-06-09 16:31:20 Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question --profile Display timing and memory usage information --no-plugins Whether to disable plugins. -d, --working-dir=WORKING-DIR If specified, use the given directory as working directory. --no-cache Prevent use of the cache -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Available commands: about Shows a short information about Composer. archive Creates an archive of this composer package. browse Opens the package's repository URL or homepage in your browser. cc Clears composer's internal package cache. check-platform-reqs Check that platform requirements are satisfied. clear-cache Clears composer's internal package cache. clearcache Clears composer's internal package cache. config Sets config options. create-project Creates new project from a package into given directory. depends Shows which packages cause the given package to be installed. diagnose Diagnoses the system to identify common errors. dump-autoload Dumps the autoloader. dumpautoload Dumps the autoloader. exec Executes a vendored binary/script. fund Discover how to help fund the maintenance of your dependencies. global Allows running commands in the global composer dir ($COMPOSER_HOME). help Displays help for a command home Opens the package's repository URL or homepage in your browser. i Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json. info Shows information about packages. init Creates a basic composer.json file in current directory. install Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json. licenses Shows information about licenses of dependencies. list Lists commands outdated Shows a list of installed packages that have updates available, including their latest version. prohibits Shows which packages prevent the given package from being installed. reinstall Uninstalls and reinstalls the given package names remove Removes a package from the require or require-dev. require Adds required packages to your composer.json and installs them. run Runs the scripts defined in composer.json. run-script Runs the scripts defined in composer.json. search Searches for packages. self-update Updates composer.phar to the latest version. selfupdate Updates composer.phar to the latest version. show Shows information about packages. status Shows a list of locally modified packages. suggests Shows package suggestions. u Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file. update Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file. upgrade Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file. validate Validates a composer.json and composer.lock. why Shows which packages cause the given package to be installed. why-not Shows which packages prevent the given package from being installed. OrganizationAccountAccessRole:~/environment/TOTONOI (master) $ sudo yum install php php-mbstring php-pdo php-gd php-xml Loaded plugins: extras_suggestions, langpacks, priorities, update-motd amzn2-core | 3.7 kB 00:00:00 235 packages excluded due to repository priority protections Package php-pdo-7.3.28-1.amzn2.x86_64 already installed and latest version Package php-xml-7.3.28-1.amzn2.x86_64 already installed and latest version Resolving Dependencies --> Running transaction check ---> Package php.x86_64 0:7.3.28-1.amzn2 will be installed ---> Package php-gd.x86_64 0:7.3.28-1.amzn2 will be installed --> Processing Dependency: libXpm.so.4()(64bit) for package: php-gd-7.3.28-1.amzn2.x86_64 --> Processing Dependency: libX11.so.6()(64bit) for package: php-gd-7.3.28-1.amzn2.x86_64 ---> Package php-mbstring.x86_64 0:7.3.28-1.amzn2 will be installed --> Processing Dependency: libonig.so.2()(64bit) for package: php-mbstring-7.3.28-1.amzn2.x86_64 --> Running transaction check ---> Package libX11.x86_64 0:1.6.7-3.amzn2 will be installed --> Processing Dependency: libX11-common >= 1.6.7-3.amzn2 for package: libX11-1.6.7-3.amzn2.x86_64 --> Processing Dependency: libxcb.so.1()(64bit) for package: libX11-1.6.7-3.amzn2.x86_64 ---> Package libXpm.x86_64 0:3.5.12-1.amzn2.0.2 will be installed ---> Package oniguruma.x86_64 0:5.9.6-1.amzn2.0.4 will be installed --> Running transaction check ---> Package libX11-common.noarch 0:1.6.7-3.amzn2 will be installed ---> Package libxcb.x86_64 0:1.12-1.amzn2.0.2 will be installed --> Processing Dependency: libXau.so.6()(64bit) for package: libxcb-1.12-1.amzn2.0.2.x86_64 --> Running transaction check ---> Package libXau.x86_64 0:1.0.8-2.1.amzn2.0.2 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================================================================================================================================================================= Package Arch Version Repository Size ================================================================================================================================================================================================================================= Installing: php x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 3.2 M php-gd x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 190 k php-mbstring x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 511 k Installing for dependencies: libX11 x86_64 1.6.7-3.amzn2 amzn2-core 606 k libX11-common noarch 1.6.7-3.amzn2 amzn2-core 164 k libXau x86_64 1.0.8-2.1.amzn2.0.2 amzn2-core 29 k libXpm x86_64 3.5.12-1.amzn2.0.2 amzn2-core 57 k libxcb x86_64 1.12-1.amzn2.0.2 amzn2-core 216 k oniguruma x86_64 5.9.6-1.amzn2.0.4 amzn2-core 127 k Transaction Summary ================================================================================================================================================================================================================================= Install 3 Packages (+6 Dependent packages) Total download size: 5.0 M Installed size: 17 M Is this ok [y/d/N]: y Downloading packages: (1/9): libX11-common-1.6.7-3.amzn2.noarch.rpm | 164 kB 00:00:00 (2/9): libXau-1.0.8-2.1.amzn2.0.2.x86_64.rpm | 29 kB 00:00:00 (3/9): libX11-1.6.7-3.amzn2.x86_64.rpm | 606 kB 00:00:00 (4/9): libXpm-3.5.12-1.amzn2.0.2.x86_64.rpm | 57 kB 00:00:00 (5/9): libxcb-1.12-1.amzn2.0.2.x86_64.rpm | 216 kB 00:00:00 (6/9): oniguruma-5.9.6-1.amzn2.0.4.x86_64.rpm | 127 kB 00:00:00 (7/9): php-gd-7.3.28-1.amzn2.x86_64.rpm | 190 kB 00:00:00 (8/9): php-mbstring-7.3.28-1.amzn2.x86_64.rpm | 511 kB 00:00:00 (9/9): php-7.3.28-1.amzn2.x86_64.rpm | 3.2 MB 00:00:00 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 11 MB/s | 5.0 MB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : oniguruma-5.9.6-1.amzn2.0.4.x86_64 1/9 Installing : libXau-1.0.8-2.1.amzn2.0.2.x86_64 2/9 Installing : libxcb-1.12-1.amzn2.0.2.x86_64 3/9 Installing : libX11-common-1.6.7-3.amzn2.noarch 4/9 Installing : libX11-1.6.7-3.amzn2.x86_64 5/9 Installing : libXpm-3.5.12-1.amzn2.0.2.x86_64 6/9 Installing : php-gd-7.3.28-1.amzn2.x86_64 7/9 Installing : php-mbstring-7.3.28-1.amzn2.x86_64 8/9 Installing : php-7.3.28-1.amzn2.x86_64 9/9 Verifying : libX11-common-1.6.7-3.amzn2.noarch 1/9 Verifying : libX11-1.6.7-3.amzn2.x86_64 2/9 Verifying : php-gd-7.3.28-1.amzn2.x86_64 3/9 Verifying : libXau-1.0.8-2.1.amzn2.0.2.x86_64 4/9 Verifying : php-7.3.28-1.amzn2.x86_64 5/9 Verifying : libXpm-3.5.12-1.amzn2.0.2.x86_64 6/9 Verifying : php-mbstring-7.3.28-1.amzn2.x86_64 7/9 Verifying : libxcb-1.12-1.amzn2.0.2.x86_64 8/9 Verifying : oniguruma-5.9.6-1.amzn2.0.4.x86_64 9/9 Installed: php.x86_64 0:7.3.28-1.amzn2 php-gd.x86_64 0:7.3.28-1.amzn2 php-mbstring.x86_64 0:7.3.28-1.amzn2 Dependency Installed: libX11.x86_64 0:1.6.7-3.amzn2 libX11-common.noarch 0:1.6.7-3.amzn2 libXau.x86_64 0:1.0.8-2.1.amzn2.0.2 libXpm.x86_64 0:3.5.12-1.amzn2.0.2 libxcb.x86_64 0:1.12-1.amzn2.0.2 oniguruma.x86_64 0:5.9.6-1.amzn2.0.4 Complete! OrganizationAccountAccessRole:~/environment/TOTONOI (master) $ ls app bootstrap composer.lock database package-lock.json public resources select storage tests artisan composer.json config package.json phpunit.xml README.md routes server.php tailwind.config.js webpack.mix.js OrganizationAccountAccessRole:~/environment/TOTONOI (master) $ composer install Installing dependencies from lock file (including require-dev) Verifying lock file contents can be installed on current platform. Package operations: 116 installs, 0 updates, 0 removals - Downloading dasprid/enum (1.0.3) - Downloading bacon/bacon-qr-code (2.0.3) - Downloading doctrine/inflector (2.0.3) - Downloading doctrine/lexer (1.2.1) - Downloading symfony/polyfill-ctype (v1.22.1) - Downloading webmozart/assert (1.10.0) - Downloading dragonmantank/cron-expression (v3.1.0) - Downloading symfony/polyfill-php80 (v1.22.1) - Downloading symfony/polyfill-mbstring (v1.22.1) - Downloading symfony/var-dumper (v5.2.6) - Downloading symfony/polyfill-intl-normalizer (v1.22.1) - Downloading symfony/polyfill-intl-grapheme (v1.22.1) - Downloading symfony/string (v5.2.6) - Downloading psr/container (1.1.1) - Downloading symfony/service-contracts (v2.4.0) - Downloading symfony/polyfill-php73 (v1.22.1) - Downloading symfony/console (v5.2.6) - Downloading psr/log (1.1.3) - Downloading monolog/monolog (2.2.0) - Downloading voku/portable-ascii (1.5.6) - Downloading phpoption/phpoption (1.7.5) - Downloading graham-campbell/result-type (v1.0.1) - Downloading vlucas/phpdotenv (v5.3.0) - Downloading symfony/css-selector (v5.2.4) - Downloading tijsverkoyen/css-to-inline-styles (2.2.3) - Downloading symfony/deprecation-contracts (v2.4.0) - Downloading symfony/routing (v5.2.6) - Downloading symfony/process (v5.2.4) - Downloading symfony/polyfill-php72 (v1.22.1) - Downloading symfony/polyfill-intl-idn (v1.22.1) - Downloading symfony/mime (v5.2.6) - Downloading symfony/http-foundation (v5.2.4) - Downloading symfony/http-client-contracts (v2.4.0) - Downloading psr/event-dispatcher (1.0.0) - Downloading symfony/event-dispatcher-contracts (v2.4.0) - Downloading symfony/event-dispatcher (v5.2.4) - Downloading symfony/error-handler (v5.2.6) - Downloading symfony/http-kernel (v5.2.6) - Downloading symfony/finder (v5.2.4) - Downloading symfony/polyfill-iconv (v1.22.1) - Downloading egulias/email-validator (2.1.25) - Downloading swiftmailer/swiftmailer (v6.2.7) - Downloading ramsey/collection (1.1.3) - Downloading brick/math (0.9.2) - Downloading ramsey/uuid (4.1.1) - Downloading psr/simple-cache (1.0.1) - Downloading opis/closure (3.6.2) - Downloading symfony/translation-contracts (v2.4.0) - Downloading symfony/translation (v5.2.6) - Downloading nesbot/carbon (2.46.0) - Downloading league/mime-type-detection (1.7.0) - Downloading league/flysystem (1.1.3) - Downloading league/commonmark (1.5.8) - Downloading laravel/framework (v8.40.0) - Downloading filp/whoops (2.12.1) - Downloading facade/ignition-contracts (1.0.2) - Downloading facade/flare-client-php (1.7.0) - Downloading facade/ignition (2.8.3) - Downloading fakerphp/faker (v1.14.1) - Downloading fideloper/proxy (4.4.1) - Downloading asm89/stack-cors (v2.0.3) - Downloading fruitcake/laravel-cors (v2.0.4) - Downloading guzzlehttp/promises (1.4.1) - Downloading ralouphie/getallheaders (3.0.3) - Downloading psr/http-message (1.0.1) - Downloading guzzlehttp/psr7 (1.8.2) - Downloading jaybizzle/crawler-detect (v1.2.105) - Downloading paragonie/constant_time_encoding (v2.4.0) - Downloading pragmarx/google2fa (8.0.0) - Downloading laravel/fortify (v1.7.12) - Downloading mobiledetect/mobiledetectlib (2.8.37) - Downloading jenssegers/agent (v2.6.4) - Downloading laravel/jetstream (v2.3.4) - Downloading laravel/sail (v1.5.0) - Downloading laravel/sanctum (v2.10.0) - Downloading psr/http-client (1.0.1) - Downloading guzzlehttp/guzzle (7.3.0) - Downloading league/oauth1-client (v1.9.0) - Downloading laravel/socialite (v5.2.3) - Downloading nikic/php-parser (v4.10.4) - Downloading psy/psysh (v0.10.8) - Downloading laravel/tinker (v2.6.1) - Downloading hamcrest/hamcrest-php (v2.0.1) - Downloading mockery/mockery (1.4.3) - Downloading nunomaduro/collision (v5.4.0) - Downloading phpdocumentor/reflection-common (2.2.0) - Downloading phpdocumentor/type-resolver (1.4.0) - Downloading phpdocumentor/reflection-docblock (5.2.2) - Downloading sebastian/version (3.0.2) - Downloading sebastian/type (2.3.1) - Downloading sebastian/resource-operations (3.0.3) - Downloading sebastian/recursion-context (4.0.4) - Downloading sebastian/object-reflector (2.0.4) - Downloading sebastian/object-enumerator (4.0.4) - Downloading sebastian/global-state (5.0.2) - Downloading sebastian/exporter (4.0.3) - Downloading sebastian/environment (5.1.3) - Downloading sebastian/diff (4.0.4) - Downloading sebastian/comparator (4.0.6) - Downloading sebastian/code-unit (1.0.8) - Downloading sebastian/cli-parser (1.0.1) - Downloading phpunit/php-timer (5.0.3) - Downloading phpunit/php-text-template (2.0.4) - Downloading phpunit/php-invoker (3.1.1) - Downloading phpunit/php-file-iterator (3.0.5) - Downloading theseer/tokenizer (1.2.0) - Downloading sebastian/lines-of-code (1.0.3) - Downloading sebastian/complexity (2.0.2) - Downloading sebastian/code-unit-reverse-lookup (2.0.3) - Downloading phpunit/php-code-coverage (9.2.6) - Downloading doctrine/instantiator (1.4.0) - Downloading phpspec/prophecy (1.13.0) - Downloading phar-io/version (3.1.0) - Downloading phar-io/manifest (2.0.1) - Downloading myclabs/deep-copy (1.10.2) - Downloading phpunit/phpunit (9.5.4) - Installing dasprid/enum (1.0.3): Extracting archive - Installing bacon/bacon-qr-code (2.0.3): Extracting archive - Installing doctrine/inflector (2.0.3): Extracting archive - Installing doctrine/lexer (1.2.1): Extracting archive - Installing symfony/polyfill-ctype (v1.22.1): Extracting archive - Installing webmozart/assert (1.10.0): Extracting archive - Installing dragonmantank/cron-expression (v3.1.0): Extracting archive - Installing symfony/polyfill-php80 (v1.22.1): Extracting archive - Installing symfony/polyfill-mbstring (v1.22.1): Extracting archive - Installing symfony/var-dumper (v5.2.6): Extracting archive - Installing symfony/polyfill-intl-normalizer (v1.22.1): Extracting archive - Installing symfony/polyfill-intl-grapheme (v1.22.1): Extracting archive - Installing symfony/string (v5.2.6): Extracting archive - Installing psr/container (1.1.1): Extracting archive - Installing symfony/service-contracts (v2.4.0): Extracting archive - Installing symfony/polyfill-php73 (v1.22.1): Extracting archive - Installing symfony/console (v5.2.6): Extracting archive - Installing psr/log (1.1.3): Extracting archive - Installing monolog/monolog (2.2.0): Extracting archive - Installing voku/portable-ascii (1.5.6): Extracting archive - Installing phpoption/phpoption (1.7.5): Extracting archive - Installing graham-campbell/result-type (v1.0.1): Extracting archive - Installing vlucas/phpdotenv (v5.3.0): Extracting archive - Installing symfony/css-selector (v5.2.4): Extracting archive - Installing tijsverkoyen/css-to-inline-styles (2.2.3): Extracting archive - Installing symfony/deprecation-contracts (v2.4.0): Extracting archive - Installing symfony/routing (v5.2.6): Extracting archive - Installing symfony/process (v5.2.4): Extracting archive - Installing symfony/polyfill-php72 (v1.22.1): Extracting archive - Installing symfony/polyfill-intl-idn (v1.22.1): Extracting archive - Installing symfony/mime (v5.2.6): Extracting archive - Installing symfony/http-foundation (v5.2.4): Extracting archive - Installing symfony/http-client-contracts (v2.4.0): Extracting archive - Installing psr/event-dispatcher (1.0.0): Extracting archive - Installing symfony/event-dispatcher-contracts (v2.4.0): Extracting archive - Installing symfony/event-dispatcher (v5.2.4): Extracting archive - Installing symfony/error-handler (v5.2.6): Extracting archive - Installing symfony/http-kernel (v5.2.6): Extracting archive - Installing symfony/finder (v5.2.4): Extracting archive - Installing symfony/polyfill-iconv (v1.22.1): Extracting archive - Installing egulias/email-validator (2.1.25): Extracting archive - Installing swiftmailer/swiftmailer (v6.2.7): Extracting archive - Installing ramsey/collection (1.1.3): Extracting archive - Installing brick/math (0.9.2): Extracting archive - Installing ramsey/uuid (4.1.1): Extracting archive - Installing psr/simple-cache (1.0.1): Extracting archive - Installing opis/closure (3.6.2): Extracting archive - Installing symfony/translation-contracts (v2.4.0): Extracting archive - Installing symfony/translation (v5.2.6): Extracting archive - Installing nesbot/carbon (2.46.0): Extracting archive - Installing league/mime-type-detection (1.7.0): Extracting archive - Installing league/flysystem (1.1.3): Extracting archive - Installing league/commonmark (1.5.8): Extracting archive - Installing laravel/framework (v8.40.0): Extracting archive - Installing filp/whoops (2.12.1): Extracting archive - Installing facade/ignition-contracts (1.0.2): Extracting archive - Installing facade/flare-client-php (1.7.0): Extracting archive - Installing facade/ignition (2.8.3): Extracting archive - Installing fakerphp/faker (v1.14.1): Extracting archive - Installing fideloper/proxy (4.4.1): Extracting archive - Installing asm89/stack-cors (v2.0.3): Extracting archive - Installing fruitcake/laravel-cors (v2.0.4): Extracting archive - Installing guzzlehttp/promises (1.4.1): Extracting archive - Installing ralouphie/getallheaders (3.0.3): Extracting archive - Installing psr/http-message (1.0.1): Extracting archive - Installing guzzlehttp/psr7 (1.8.2): Extracting archive - Installing jaybizzle/crawler-detect (v1.2.105): Extracting archive - Installing paragonie/constant_time_encoding (v2.4.0): Extracting archive - Installing pragmarx/google2fa (8.0.0): Extracting archive - Installing laravel/fortify (v1.7.12): Extracting archive - Installing mobiledetect/mobiledetectlib (2.8.37): Extracting archive - Installing jenssegers/agent (v2.6.4): Extracting archive - Installing laravel/jetstream (v2.3.4): Extracting archive - Installing laravel/sail (v1.5.0): Extracting archive - Installing laravel/sanctum (v2.10.0): Extracting archive - Installing psr/http-client (1.0.1): Extracting archive - Installing guzzlehttp/guzzle (7.3.0): Extracting archive - Installing league/oauth1-client (v1.9.0): Extracting archive - Installing laravel/socialite (v5.2.3): Extracting archive - Installing nikic/php-parser (v4.10.4): Extracting archive - Installing psy/psysh (v0.10.8): Extracting archive - Installing laravel/tinker (v2.6.1): Extracting archive - Installing hamcrest/hamcrest-php (v2.0.1): Extracting archive - Installing mockery/mockery (1.4.3): Extracting archive - Installing nunomaduro/collision (v5.4.0): Extracting archive - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive - Installing phpdocumentor/type-resolver (1.4.0): Extracting archive - Installing phpdocumentor/reflection-docblock (5.2.2): Extracting archive - Installing sebastian/version (3.0.2): Extracting archive - Installing sebastian/type (2.3.1): Extracting archive - Installing sebastian/resource-operations (3.0.3): Extracting archive - Installing sebastian/recursion-context (4.0.4): Extracting archive - Installing sebastian/object-reflector (2.0.4): Extracting archive - Installing sebastian/object-enumerator (4.0.4): Extracting archive - Installing sebastian/global-state (5.0.2): Extracting archive - Installing sebastian/exporter (4.0.3): Extracting archive - Installing sebastian/environment (5.1.3): Extracting archive - Installing sebastian/diff (4.0.4): Extracting archive - Installing sebastian/comparator (4.0.6): Extracting archive - Installing sebastian/code-unit (1.0.8): Extracting archive - Installing sebastian/cli-parser (1.0.1): Extracting archive - Installing phpunit/php-timer (5.0.3): Extracting archive - Installing phpunit/php-text-template (2.0.4): Extracting archive - Installing phpunit/php-invoker (3.1.1): Extracting archive - Installing phpunit/php-file-iterator (3.0.5): Extracting archive - Installing theseer/tokenizer (1.2.0): Extracting archive - Installing sebastian/lines-of-code (1.0.3): Extracting archive - Installing sebastian/complexity (2.0.2): Extracting archive - Installing sebastian/code-unit-reverse-lookup (2.0.3): Extracting archive - Installing phpunit/php-code-coverage (9.2.6): Extracting archive - Installing doctrine/instantiator (1.4.0): Extracting archive - Installing phpspec/prophecy (1.13.0): Extracting archive - Installing phar-io/version (3.1.0): Extracting archive - Installing phar-io/manifest (2.0.1): Extracting archive - Installing myclabs/deep-copy (1.10.2): Extracting archive - Installing phpunit/phpunit (9.5.4): Extracting archive Generating optimized autoload files > Illuminate\Foundation\ComposerScripts::postAutoloadDump > @php artisan package:discover --ansi Discovered Package: facade/ignition Discovered Package: fideloper/proxy Discovered Package: fruitcake/laravel-cors Discovered Package: jenssegers/agent Discovered Package: laravel/fortify Discovered Package: laravel/jetstream Discovered Package: laravel/sail Discovered Package: laravel/sanctum Discovered Package: laravel/socialite Discovered Package: laravel/tinker Discovered Package: nesbot/carbon Discovered Package: nunomaduro/collision Package manifest generated successfully. 76 packages you are using are looking for funding. Use the `composer fund` command to find out more! artisan serveもためしてみます OrganizationAccountAccessRole:~/environment/hoge(main) $ php artisan serve Starting Laravel development server: http://127.0.0.1:8000 いけてそうです! あとは .env作成コマンド php artisan key:generate php artisan migrate など必要に応じて打ってみてください
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

AWS Cloud9でlaravelの環境立てようとしたら面食らったので、Google先生に質問してみる

やりたいこと AWS cloud9 でとりあえずlaravelのprojectをgitcloneしたい。 免責事項 以下の手順は2021/6/20に実施しました。環境の更新によっては手順ができない可能性があります。 手順 PHPのバージョン確認をします OrganizationAccountAccessRole:~/environment $ php -v PHP 7.2.24 (cli) (built: Oct 31 2019 18:27:08) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies PHPのversionが7.2でした。このままgithubからcloneしたのちプロジェクトを動かそうとするとphpのバージョンの影響により動作しません。ご自身で使われているPHPのバージョを合わせる作業を実施します php7.3をインストールしようとします OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras install php7.3 Refusing because php7.3 could cause an invalid combination. 拒否されたので確認します。 OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras list | grep php 15 php7.2 available \ 17 lamp-mariadb10.2-php7.2=latest enabled \ _ php7.3 available \ _ php7.4 available [ =stable ] _ php8.0 available [ =stable ] lamp-mariadb10.2-php7.2=latest enabled が有効化しておりますので競合し拒絶されています。 競合となるものを無効化する OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras disable lamp-mariadb10.2-php7.2 Beware that disabling topics is not supported after they are installed. 0 ansible2 available \ [ =2.4.2 =2.4.6 =2.8 =stable ] 2 httpd_modules available [ =1.0 =stable ] 3 memcached1.5 available \ [ =1.5.1 =1.5.16 =1.5.17 ] 5 postgresql9.6 available \ [ =9.6.6 =9.6.8 =stable ] 6 postgresql10 available [ =10 =stable ] 9 R3.4 available [ =3.4.3 =stable ] 10 rust1 available \ [ =1.22.1 =1.26.0 =1.26.1 =1.27.2 =1.31.0 =1.38.0 =stable ] 11 vim available [ =8.0 =stable ] 15 php7.2 available \ [ =7.2.0 =7.2.4 =7.2.5 =7.2.8 =7.2.11 =7.2.13 =7.2.14 =7.2.16 =7.2.17 =7.2.19 =7.2.21 =7.2.22 =7.2.23 =7.2.24 =7.2.26 =stable ] 17 lamp-mariadb10.2-php7.2 available \ [ =10.2.10_7.2.0 =10.2.10_7.2.4 =10.2.10_7.2.5 =10.2.10_7.2.8 =10.2.10_7.2.11 =10.2.10_7.2.13 =10.2.10_7.2.14 =10.2.10_7.2.16 =10.2.10_7.2.17 =10.2.10_7.2.19 =10.2.10_7.2.22 =10.2.10_7.2.23 =10.2.10_7.2.24 =stable ] 18 libreoffice available \ [ =5.0.6.2_15 =5.3.6.1 =stable ] 19 gimp available [ =2.8.22 ] 20 docker=latest enabled \ [ =17.12.1 =18.03.1 =18.06.1 =18.09.9 =stable ] 21 mate-desktop1.x available \ [ =1.19.0 =1.20.0 =stable ] 22 GraphicsMagick1.3 available \ [ =1.3.29 =1.3.32 =1.3.34 =stable ] 23 tomcat8.5 available \ [ =8.5.31 =8.5.32 =8.5.38 =8.5.40 =8.5.42 =8.5.50 =stable ] 24 epel=latest enabled [ =7.11 =stable ] 25 testing available [ =1.0 =stable ] 26 ecs available [ =stable ] 27 corretto8 available \ [ =1.8.0_192 =1.8.0_202 =1.8.0_212 =1.8.0_222 =1.8.0_232 =1.8.0_242 =stable ] 28 firecracker available [ =0.11 =stable ] 29 golang1.11 available \ [ =1.11.3 =1.11.11 =1.11.13 =stable ] 30 squid4 available [ =4 =stable ] 31 php7.3 available \ [ =7.3.2 =7.3.3 =7.3.4 =7.3.6 =7.3.8 =7.3.9 =7.3.10 =7.3.11 =7.3.13 =stable ] 32 lustre2.10 available \ [ =2.10.5 =2.10.8 =stable ] 33 java-openjdk11 available [ =11 =stable ] 34 lynis available [ =stable ] 35 kernel-ng available [ =stable ] 36 BCC available [ =0.x =stable ] 37 mono available [ =5.x =stable ] 38 nginx1 available [ =stable ] 39 ruby2.6 available [ =2.6 =stable ] 40 mock available [ =stable ] 41 postgresql11 available [ =11 =stable ] 42 php7.4 available [ =stable ] 43 livepatch available [ =stable ] 44 python3.8 available [ =stable ] 45 haproxy2 available [ =stable ] 46 collectd available [ =stable ] 47 aws-nitro-enclaves-cli available [ =stable ] 48 R4 available [ =stable ] 49 kernel-5.4 available [ =stable ] 50 selinux-ng available [ =stable ] 51 php8.0 available [ =stable ] 52 tomcat9 available [ =stable ] 53 unbound1.13 available [ =stable ] 54 mariadb10.5 available [ =stable ] 55 kernel-5.10 available [ =stable ] 56 redis6 available [ =stable ] これで無効化できました。この時点ではphpのバージョンは変わりません。 次に無効化できたかどうか確認します。 OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras list | grep php 15 php7.2 available \ 17 lamp-mariadb10.2-php7.2 available \ 31 php7.3 available \ 42 php7.4 available [ =stable ] 51 php8.0 available [ =stable ] 7.3を有効化します OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras enable php7.3 0 ansible2 available \ [ =2.4.2 =2.4.6 =2.8 =stable ] 2 httpd_modules available [ =1.0 =stable ] 3 memcached1.5 available \ [ =1.5.1 =1.5.16 =1.5.17 ] 5 postgresql9.6 available \ [ =9.6.6 =9.6.8 =stable ] 6 postgresql10 available [ =10 =stable ] 9 R3.4 available [ =3.4.3 =stable ] 10 rust1 available \ [ =1.22.1 =1.26.0 =1.26.1 =1.27.2 =1.31.0 =1.38.0 =stable ] 11 vim available [ =8.0 =stable ] _ php7.2 available \ [ =7.2.0 =7.2.4 =7.2.5 =7.2.8 =7.2.11 =7.2.13 =7.2.14 =7.2.16 =7.2.17 =7.2.19 =7.2.21 =7.2.22 =7.2.23 =7.2.24 =7.2.26 =stable ] _ lamp-mariadb10.2-php7.2 available \ [ =10.2.10_7.2.0 =10.2.10_7.2.4 =10.2.10_7.2.5 =10.2.10_7.2.8 =10.2.10_7.2.11 =10.2.10_7.2.13 =10.2.10_7.2.14 =10.2.10_7.2.16 =10.2.10_7.2.17 =10.2.10_7.2.19 =10.2.10_7.2.22 =10.2.10_7.2.23 =10.2.10_7.2.24 =stable ] 18 libreoffice available \ [ =5.0.6.2_15 =5.3.6.1 =stable ] 19 gimp available [ =2.8.22 ] 20 docker=latest enabled \ [ =17.12.1 =18.03.1 =18.06.1 =18.09.9 =stable ] 21 mate-desktop1.x available \ [ =1.19.0 =1.20.0 =stable ] 22 GraphicsMagick1.3 available \ [ =1.3.29 =1.3.32 =1.3.34 =stable ] 23 tomcat8.5 available \ [ =8.5.31 =8.5.32 =8.5.38 =8.5.40 =8.5.42 =8.5.50 =stable ] 24 epel=latest enabled [ =7.11 =stable ] 25 testing available [ =1.0 =stable ] 26 ecs available [ =stable ] 27 corretto8 available \ [ =1.8.0_192 =1.8.0_202 =1.8.0_212 =1.8.0_222 =1.8.0_232 =1.8.0_242 =stable ] 28 firecracker available [ =0.11 =stable ] 29 golang1.11 available \ [ =1.11.3 =1.11.11 =1.11.13 =stable ] 30 squid4 available [ =4 =stable ] 31 php7.3=latest enabled \ [ =7.3.2 =7.3.3 =7.3.4 =7.3.6 =7.3.8 =7.3.9 =7.3.10 =7.3.11 =7.3.13 =stable ] 32 lustre2.10 available \ [ =2.10.5 =2.10.8 =stable ] 33 java-openjdk11 available [ =11 =stable ] 34 lynis available [ =stable ] 35 kernel-ng available [ =stable ] 36 BCC available [ =0.x =stable ] 37 mono available [ =5.x =stable ] 38 nginx1 available [ =stable ] 39 ruby2.6 available [ =2.6 =stable ] 40 mock available [ =stable ] 41 postgresql11 available [ =11 =stable ] _ php7.4 available [ =stable ] 43 livepatch available [ =stable ] 44 python3.8 available [ =stable ] 45 haproxy2 available [ =stable ] 46 collectd available [ =stable ] 47 aws-nitro-enclaves-cli available [ =stable ] 48 R4 available [ =stable ] 49 kernel-5.4 available [ =stable ] 50 selinux-ng available [ =stable ] _ php8.0 available [ =stable ] 52 tomcat9 available [ =stable ] 53 unbound1.13 available [ =stable ] 54 mariadb10.5 available [ =stable ] 55 kernel-5.10 available [ =stable ] 56 redis6 available [ =stable ] Now you can install: # yum clean metadata # yum install php-cli php-pdo php-fpm php-json php-mysqlnd 無事有効化できました。念のため確認ののち、以下のコマンドを実行します。 確認 OrganizationAccountAccessRole:~/environment $ sudo amazon-linux-extras list | grep php _ php7.2 available \ _ lamp-mariadb10.2-php7.2 available \ 31 php7.3=latest enabled \ _ php7.4 available [ =stable ] _ php8.0 available [ =stable ] 実行コマンド Now you can install: # yum clean metadata # yum install php-cli php-pdo php-fpm php-json php-mysqlnd # yum clean metadata OrganizationAccountAccessRole:~/environment $ yum clean metadata Loaded plugins: extras_suggestions, langpacks, priorities, update-motd Cleaning repos: amzn2-core amzn2extra-docker amzn2extra-epel amzn2extra-php7.3 epel hashicorp 14 metadata files removed 0 sqlite files removed 0 metadata files removed # yum install php-cli php-pdo php-fpm php-json php-mysqlnd OrganizationAccountAccessRole:~/environment $ yum install php-cli php-pdo php-fpm php-json php-mysqlnd Loaded plugins: extras_suggestions, langpacks, priorities, update-motd You need to be root to perform this command. 準備完了しました。ちなみにまだversionが上がっているわけではありません OrganizationAccountAccessRole:~/environment $ php -v PHP 7.2.24 (cli) (built: Oct 31 2019 18:27:08) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.2.0, Copyright (c) 1998-2018 Zend Technologies ここでupdateコマンドを打ちます OrganizationAccountAccessRole:~/environment $ sudo yum update -y Loaded plugins: extras_suggestions, langpacks, priorities, update-motd amzn2extra-docker | 3.0 kB 00:00:00 amzn2extra-epel | 3.0 kB 00:00:00 amzn2extra-php7.3 | 3.0 kB 00:00:00 (1/2): amzn2extra-php7.3/2/x86_64/updateinfo | 76 B 00:00:00 (2/2): amzn2extra-php7.3/2/x86_64/primary_db | 471 kB 00:00:00 235 packages excluded due to repository priority protections Resolving Dependencies --> Running transaction check ---> Package php-cli.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-cli.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-common.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-common.x86_64 0:7.3.28-1.amzn2 will be an update --> Processing Dependency: libzip.so.5()(64bit) for package: php-common-7.3.28-1.amzn2.x86_64 ---> Package php-devel.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-devel.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-fpm.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-fpm.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-json.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-json.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-mysqlnd.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-mysqlnd.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-pdo.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-pdo.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-process.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-process.x86_64 0:7.3.28-1.amzn2 will be an update ---> Package php-xml.x86_64 0:7.2.24-1.amzn2.0.1 will be updated ---> Package php-xml.x86_64 0:7.3.28-1.amzn2 will be an update --> Running transaction check ---> Package libzip.x86_64 0:1.3.2-1.amzn2.0.1 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================================================================================================================================================================= Package Arch Version Repository Size ================================================================================================================================================================================================================================= Updating: php-cli x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 4.8 M php-common x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 1.1 M php-devel x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 1.3 M php-fpm x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 1.7 M php-json x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 71 k php-mysqlnd x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 236 k php-pdo x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 132 k php-process x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 88 k php-xml x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 210 k Installing for dependencies: libzip x86_64 1.3.2-1.amzn2.0.1 amzn2-core 62 k Transaction Summary ================================================================================================================================================================================================================================= Install ( 1 Dependent package) Upgrade 9 Packages Total download size: 9.7 M Downloading packages: Delta RPMs disabled because /usr/bin/applydeltarpm not installed. (1/10): libzip-1.3.2-1.amzn2.0.1.x86_64.rpm | 62 kB 00:00:00 (2/10): php-common-7.3.28-1.amzn2.x86_64.rpm | 1.1 MB 00:00:00 (3/10): php-cli-7.3.28-1.amzn2.x86_64.rpm | 4.8 MB 00:00:00 (4/10): php-devel-7.3.28-1.amzn2.x86_64.rpm | 1.3 MB 00:00:00 (5/10): php-json-7.3.28-1.amzn2.x86_64.rpm | 71 kB 00:00:00 (6/10): php-fpm-7.3.28-1.amzn2.x86_64.rpm | 1.7 MB 00:00:00 (7/10): php-mysqlnd-7.3.28-1.amzn2.x86_64.rpm | 236 kB 00:00:00 (8/10): php-pdo-7.3.28-1.amzn2.x86_64.rpm | 132 kB 00:00:00 (9/10): php-process-7.3.28-1.amzn2.x86_64.rpm | 88 kB 00:00:00 (10/10): php-xml-7.3.28-1.amzn2.x86_64.rpm | 210 kB 00:00:00 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 20 MB/s | 9.7 MB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : libzip-1.3.2-1.amzn2.0.1.x86_64 1/19 Updating : php-common-7.3.28-1.amzn2.x86_64 2/19 Updating : php-json-7.3.28-1.amzn2.x86_64 3/19 Updating : php-cli-7.3.28-1.amzn2.x86_64 4/19 Updating : php-pdo-7.3.28-1.amzn2.x86_64 5/19 Updating : php-mysqlnd-7.3.28-1.amzn2.x86_64 6/19 Updating : php-devel-7.3.28-1.amzn2.x86_64 7/19 Updating : php-fpm-7.3.28-1.amzn2.x86_64 8/19 Updating : php-xml-7.3.28-1.amzn2.x86_64 9/19 Updating : php-process-7.3.28-1.amzn2.x86_64 10/19 Cleanup : php-devel-7.2.24-1.amzn2.0.1.x86_64 11/19 Cleanup : php-cli-7.2.24-1.amzn2.0.1.x86_64 12/19 Cleanup : php-mysqlnd-7.2.24-1.amzn2.0.1.x86_64 13/19 Cleanup : php-pdo-7.2.24-1.amzn2.0.1.x86_64 14/19 Cleanup : php-process-7.2.24-1.amzn2.0.1.x86_64 15/19 Cleanup : php-xml-7.2.24-1.amzn2.0.1.x86_64 16/19 Cleanup : php-fpm-7.2.24-1.amzn2.0.1.x86_64 17/19 Cleanup : php-json-7.2.24-1.amzn2.0.1.x86_64 18/19 Cleanup : php-common-7.2.24-1.amzn2.0.1.x86_64 19/19 Verifying : php-fpm-7.3.28-1.amzn2.x86_64 1/19 Verifying : php-cli-7.3.28-1.amzn2.x86_64 2/19 Verifying : php-xml-7.3.28-1.amzn2.x86_64 3/19 Verifying : php-json-7.3.28-1.amzn2.x86_64 4/19 Verifying : libzip-1.3.2-1.amzn2.0.1.x86_64 5/19 Verifying : php-process-7.3.28-1.amzn2.x86_64 6/19 Verifying : php-mysqlnd-7.3.28-1.amzn2.x86_64 7/19 Verifying : php-devel-7.3.28-1.amzn2.x86_64 8/19 Verifying : php-pdo-7.3.28-1.amzn2.x86_64 9/19 Verifying : php-common-7.3.28-1.amzn2.x86_64 10/19 Verifying : php-common-7.2.24-1.amzn2.0.1.x86_64 11/19 Verifying : php-fpm-7.2.24-1.amzn2.0.1.x86_64 12/19 Verifying : php-process-7.2.24-1.amzn2.0.1.x86_64 13/19 Verifying : php-cli-7.2.24-1.amzn2.0.1.x86_64 14/19 Verifying : php-pdo-7.2.24-1.amzn2.0.1.x86_64 15/19 Verifying : php-json-7.2.24-1.amzn2.0.1.x86_64 16/19 Verifying : php-mysqlnd-7.2.24-1.amzn2.0.1.x86_64 17/19 Verifying : php-xml-7.2.24-1.amzn2.0.1.x86_64 18/19 Verifying : php-devel-7.2.24-1.amzn2.0.1.x86_64 19/19 Dependency Installed: libzip.x86_64 0:1.3.2-1.amzn2.0.1 Updated: php-cli.x86_64 0:7.3.28-1.amzn2 php-common.x86_64 0:7.3.28-1.amzn2 php-devel.x86_64 0:7.3.28-1.amzn2 php-fpm.x86_64 0:7.3.28-1.amzn2 php-json.x86_64 0:7.3.28-1.amzn2 php-mysqlnd.x86_64 0:7.3.28-1.amzn2 php-pdo.x86_64 0:7.3.28-1.amzn2 php-process.x86_64 0:7.3.28-1.amzn2 php-xml.x86_64 0:7.3.28-1.amzn2 Complete! ここまでで完了です。確認するとバージョンが上がっています OrganizationAccountAccessRole:~/environment $ php -v PHP 7.3.28 (cli) (built: May 13 2021 22:37:44) ( NTS ) Copyright (c) 1997-2018 The PHP Group Zend Engine v3.3.28, Copyright (c) 1998-2018 Zend Technologies ここから対象のURLを元にgit cloneしていきます OrganizationAccountAccessRole:~/environment $ git clone yourURL Cloning into 'TOTONOI'... The authenticity of host 'github.com (52.69.186.44)' can't be established. RSA key fingerprint is SHA256:nThbg6kXUpJWGl7E1IGOCspRomTxdCARLviKw6E5SY8. RSA key fingerprint is MD5:16:27:ac:a5:76:28:2d:36:63:1b:56:4d:eb:df:a6:48. Are you sure you want to continue connecting (yes/no)? yes Warning: Permanently added 'github.com,52.69.186.44' (RSA) to the list of known hosts. Permission denied (publickey). fatal: Could not read from remote repository. Please make sure you have the correct access rights and the repository exists. 弾かれました。ここはsshの公開鍵をこの環境で作ってないので当然ですね。作っていきます。 ssh公開鍵登録作業 OrganizationAccountAccessRole:~/environment $ cd .. OrganizationAccountAccessRole:~ $ ls environment node_modules package-lock.json OrganizationAccountAccessRole:~ $ ls -a . .aws .bash_logout .bashrc .cache environment .gitconfig .mkshrc .npm .nvm .profile .ssh .zshrc .. .bash_history .bash_profile .c9 .config .gem .gnupg node_modules .npmrc package-lock.json .rvm .zlogin OrganizationAccountAccessRole:~ $ cd .ssh OrganizationAccountAccessRole:~/.ssh $ ls authorized_keys known_hosts OrganizationAccountAccessRole:~/.ssh $ ssh-keygen Generating public/private rsa key pair. Enter file in which to save the key (/home/ec2-user/.ssh/id_rsa): Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/ec2-user/.ssh/id_rsa. Your public key has been saved in /home/ec2-user/.ssh/id_rsa.pub. The key fingerprint is: SHA256:uqT24L1+8UDI0Ljs4XOco0CPz29sMw1iefTJumwYMOU ec2-user@ip-172-31-9-197.ap-northeast-1.compute.internal The key's randomart image is: your ssh OrganizationAccountAccessRole:~/.ssh $ OrganizationAccountAccessRole:~/.ssh $ ls authorized_keys id_rsa id_rsa.pub known_hosts OrganizationAccountAccessRole:~/.ssh $ cat id_rsa.pub ssh-rsa your ssh あとはsshをgithubに登録してください 再トライ OrganizationAccountAccessRole:~/environment $ git clone youtURL Cloning into 'hogehoge'... remote: Enumerating objects: 458, done. remote: Counting objects: 100% (458/458), done. remote: Compressing objects: 100% (258/258), done. remote: Total 458 (delta 214), reused 410 (delta 172), pack-reused 0 Receiving objects: 100% (458/458), 833.04 KiB | 1.28 MiB/s, done. Resolving deltas: 100% (214/214), done. できましたので、プロジェクトの設定をしていきます。 プロジェクトの設定をしていきます OrganizationAccountAccessRole:~/environment $ cd/ OrganizationAccountAccessRole:~/environment/hogehoge(main) $ ls app bootstrap composer.lock database package-lock.json public resources select storage tests artisan composer.json config package.json phpunit.xml README.md routes server.php tailwind.config.js webpack.mix.js OrganizationAccountAccessRole:~/environment/hoge(main) $ composer install bash: composer: command not found OrganizationAccountAccessRole:~/environment/hoge(main) $ curl -sS https://getcomposer.org/installer | php All settings correct for using Composer Downloading... Composer (version 2.1.3) successfully installed to: /home/ec2-user/environment/TOTONOI/composer.phar Use it: php composer.phar OrganizationAccountAccessRole:~/environment/hoge(main) $ sudo mv composer.phar /usr/local/bin/composer OrganizationAccountAccessRole:~/environment/hoge (main) $ composer ______ / ____/___ ____ ___ ____ ____ ________ _____ / / / __ \/ __ `__ \/ __ \/ __ \/ ___/ _ \/ ___/ / /___/ /_/ / / / / / / /_/ / /_/ (__ ) __/ / \____/\____/_/ /_/ /_/ .___/\____/____/\___/_/ /_/ Composer version 2.1.3 2021-06-09 16:31:20 Usage: command [options] [arguments] Options: -h, --help Display this help message -q, --quiet Do not output any message -V, --version Display this application version --ansi Force ANSI output --no-ansi Disable ANSI output -n, --no-interaction Do not ask any interactive question --profile Display timing and memory usage information --no-plugins Whether to disable plugins. -d, --working-dir=WORKING-DIR If specified, use the given directory as working directory. --no-cache Prevent use of the cache -v|vv|vvv, --verbose Increase the verbosity of messages: 1 for normal output, 2 for more verbose output and 3 for debug Available commands: about Shows a short information about Composer. archive Creates an archive of this composer package. browse Opens the package's repository URL or homepage in your browser. cc Clears composer's internal package cache. check-platform-reqs Check that platform requirements are satisfied. clear-cache Clears composer's internal package cache. clearcache Clears composer's internal package cache. config Sets config options. create-project Creates new project from a package into given directory. depends Shows which packages cause the given package to be installed. diagnose Diagnoses the system to identify common errors. dump-autoload Dumps the autoloader. dumpautoload Dumps the autoloader. exec Executes a vendored binary/script. fund Discover how to help fund the maintenance of your dependencies. global Allows running commands in the global composer dir ($COMPOSER_HOME). help Displays help for a command home Opens the package's repository URL or homepage in your browser. i Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json. info Shows information about packages. init Creates a basic composer.json file in current directory. install Installs the project dependencies from the composer.lock file if present, or falls back on the composer.json. licenses Shows information about licenses of dependencies. list Lists commands outdated Shows a list of installed packages that have updates available, including their latest version. prohibits Shows which packages prevent the given package from being installed. reinstall Uninstalls and reinstalls the given package names remove Removes a package from the require or require-dev. require Adds required packages to your composer.json and installs them. run Runs the scripts defined in composer.json. run-script Runs the scripts defined in composer.json. search Searches for packages. self-update Updates composer.phar to the latest version. selfupdate Updates composer.phar to the latest version. show Shows information about packages. status Shows a list of locally modified packages. suggests Shows package suggestions. u Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file. update Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file. upgrade Upgrades your dependencies to the latest version according to composer.json, and updates the composer.lock file. validate Validates a composer.json and composer.lock. why Shows which packages cause the given package to be installed. why-not Shows which packages prevent the given package from being installed. OrganizationAccountAccessRole:~/environment/TOTONOI (master) $ sudo yum install php php-mbstring php-pdo php-gd php-xml Loaded plugins: extras_suggestions, langpacks, priorities, update-motd amzn2-core | 3.7 kB 00:00:00 235 packages excluded due to repository priority protections Package php-pdo-7.3.28-1.amzn2.x86_64 already installed and latest version Package php-xml-7.3.28-1.amzn2.x86_64 already installed and latest version Resolving Dependencies --> Running transaction check ---> Package php.x86_64 0:7.3.28-1.amzn2 will be installed ---> Package php-gd.x86_64 0:7.3.28-1.amzn2 will be installed --> Processing Dependency: libXpm.so.4()(64bit) for package: php-gd-7.3.28-1.amzn2.x86_64 --> Processing Dependency: libX11.so.6()(64bit) for package: php-gd-7.3.28-1.amzn2.x86_64 ---> Package php-mbstring.x86_64 0:7.3.28-1.amzn2 will be installed --> Processing Dependency: libonig.so.2()(64bit) for package: php-mbstring-7.3.28-1.amzn2.x86_64 --> Running transaction check ---> Package libX11.x86_64 0:1.6.7-3.amzn2 will be installed --> Processing Dependency: libX11-common >= 1.6.7-3.amzn2 for package: libX11-1.6.7-3.amzn2.x86_64 --> Processing Dependency: libxcb.so.1()(64bit) for package: libX11-1.6.7-3.amzn2.x86_64 ---> Package libXpm.x86_64 0:3.5.12-1.amzn2.0.2 will be installed ---> Package oniguruma.x86_64 0:5.9.6-1.amzn2.0.4 will be installed --> Running transaction check ---> Package libX11-common.noarch 0:1.6.7-3.amzn2 will be installed ---> Package libxcb.x86_64 0:1.12-1.amzn2.0.2 will be installed --> Processing Dependency: libXau.so.6()(64bit) for package: libxcb-1.12-1.amzn2.0.2.x86_64 --> Running transaction check ---> Package libXau.x86_64 0:1.0.8-2.1.amzn2.0.2 will be installed --> Finished Dependency Resolution Dependencies Resolved ================================================================================================================================================================================================================================= Package Arch Version Repository Size ================================================================================================================================================================================================================================= Installing: php x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 3.2 M php-gd x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 190 k php-mbstring x86_64 7.3.28-1.amzn2 amzn2extra-php7.3 511 k Installing for dependencies: libX11 x86_64 1.6.7-3.amzn2 amzn2-core 606 k libX11-common noarch 1.6.7-3.amzn2 amzn2-core 164 k libXau x86_64 1.0.8-2.1.amzn2.0.2 amzn2-core 29 k libXpm x86_64 3.5.12-1.amzn2.0.2 amzn2-core 57 k libxcb x86_64 1.12-1.amzn2.0.2 amzn2-core 216 k oniguruma x86_64 5.9.6-1.amzn2.0.4 amzn2-core 127 k Transaction Summary ================================================================================================================================================================================================================================= Install 3 Packages (+6 Dependent packages) Total download size: 5.0 M Installed size: 17 M Is this ok [y/d/N]: y Downloading packages: (1/9): libX11-common-1.6.7-3.amzn2.noarch.rpm | 164 kB 00:00:00 (2/9): libXau-1.0.8-2.1.amzn2.0.2.x86_64.rpm | 29 kB 00:00:00 (3/9): libX11-1.6.7-3.amzn2.x86_64.rpm | 606 kB 00:00:00 (4/9): libXpm-3.5.12-1.amzn2.0.2.x86_64.rpm | 57 kB 00:00:00 (5/9): libxcb-1.12-1.amzn2.0.2.x86_64.rpm | 216 kB 00:00:00 (6/9): oniguruma-5.9.6-1.amzn2.0.4.x86_64.rpm | 127 kB 00:00:00 (7/9): php-gd-7.3.28-1.amzn2.x86_64.rpm | 190 kB 00:00:00 (8/9): php-mbstring-7.3.28-1.amzn2.x86_64.rpm | 511 kB 00:00:00 (9/9): php-7.3.28-1.amzn2.x86_64.rpm | 3.2 MB 00:00:00 --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- Total 11 MB/s | 5.0 MB 00:00:00 Running transaction check Running transaction test Transaction test succeeded Running transaction Installing : oniguruma-5.9.6-1.amzn2.0.4.x86_64 1/9 Installing : libXau-1.0.8-2.1.amzn2.0.2.x86_64 2/9 Installing : libxcb-1.12-1.amzn2.0.2.x86_64 3/9 Installing : libX11-common-1.6.7-3.amzn2.noarch 4/9 Installing : libX11-1.6.7-3.amzn2.x86_64 5/9 Installing : libXpm-3.5.12-1.amzn2.0.2.x86_64 6/9 Installing : php-gd-7.3.28-1.amzn2.x86_64 7/9 Installing : php-mbstring-7.3.28-1.amzn2.x86_64 8/9 Installing : php-7.3.28-1.amzn2.x86_64 9/9 Verifying : libX11-common-1.6.7-3.amzn2.noarch 1/9 Verifying : libX11-1.6.7-3.amzn2.x86_64 2/9 Verifying : php-gd-7.3.28-1.amzn2.x86_64 3/9 Verifying : libXau-1.0.8-2.1.amzn2.0.2.x86_64 4/9 Verifying : php-7.3.28-1.amzn2.x86_64 5/9 Verifying : libXpm-3.5.12-1.amzn2.0.2.x86_64 6/9 Verifying : php-mbstring-7.3.28-1.amzn2.x86_64 7/9 Verifying : libxcb-1.12-1.amzn2.0.2.x86_64 8/9 Verifying : oniguruma-5.9.6-1.amzn2.0.4.x86_64 9/9 Installed: php.x86_64 0:7.3.28-1.amzn2 php-gd.x86_64 0:7.3.28-1.amzn2 php-mbstring.x86_64 0:7.3.28-1.amzn2 Dependency Installed: libX11.x86_64 0:1.6.7-3.amzn2 libX11-common.noarch 0:1.6.7-3.amzn2 libXau.x86_64 0:1.0.8-2.1.amzn2.0.2 libXpm.x86_64 0:3.5.12-1.amzn2.0.2 libxcb.x86_64 0:1.12-1.amzn2.0.2 oniguruma.x86_64 0:5.9.6-1.amzn2.0.4 Complete! OrganizationAccountAccessRole:~/environment/TOTONOI (master) $ ls app bootstrap composer.lock database package-lock.json public resources select storage tests artisan composer.json config package.json phpunit.xml README.md routes server.php tailwind.config.js webpack.mix.js OrganizationAccountAccessRole:~/environment/TOTONOI (master) $ composer install Installing dependencies from lock file (including require-dev) Verifying lock file contents can be installed on current platform. Package operations: 116 installs, 0 updates, 0 removals - Downloading dasprid/enum (1.0.3) - Downloading bacon/bacon-qr-code (2.0.3) - Downloading doctrine/inflector (2.0.3) - Downloading doctrine/lexer (1.2.1) - Downloading symfony/polyfill-ctype (v1.22.1) - Downloading webmozart/assert (1.10.0) - Downloading dragonmantank/cron-expression (v3.1.0) - Downloading symfony/polyfill-php80 (v1.22.1) - Downloading symfony/polyfill-mbstring (v1.22.1) - Downloading symfony/var-dumper (v5.2.6) - Downloading symfony/polyfill-intl-normalizer (v1.22.1) - Downloading symfony/polyfill-intl-grapheme (v1.22.1) - Downloading symfony/string (v5.2.6) - Downloading psr/container (1.1.1) - Downloading symfony/service-contracts (v2.4.0) - Downloading symfony/polyfill-php73 (v1.22.1) - Downloading symfony/console (v5.2.6) - Downloading psr/log (1.1.3) - Downloading monolog/monolog (2.2.0) - Downloading voku/portable-ascii (1.5.6) - Downloading phpoption/phpoption (1.7.5) - Downloading graham-campbell/result-type (v1.0.1) - Downloading vlucas/phpdotenv (v5.3.0) - Downloading symfony/css-selector (v5.2.4) - Downloading tijsverkoyen/css-to-inline-styles (2.2.3) - Downloading symfony/deprecation-contracts (v2.4.0) - Downloading symfony/routing (v5.2.6) - Downloading symfony/process (v5.2.4) - Downloading symfony/polyfill-php72 (v1.22.1) - Downloading symfony/polyfill-intl-idn (v1.22.1) - Downloading symfony/mime (v5.2.6) - Downloading symfony/http-foundation (v5.2.4) - Downloading symfony/http-client-contracts (v2.4.0) - Downloading psr/event-dispatcher (1.0.0) - Downloading symfony/event-dispatcher-contracts (v2.4.0) - Downloading symfony/event-dispatcher (v5.2.4) - Downloading symfony/error-handler (v5.2.6) - Downloading symfony/http-kernel (v5.2.6) - Downloading symfony/finder (v5.2.4) - Downloading symfony/polyfill-iconv (v1.22.1) - Downloading egulias/email-validator (2.1.25) - Downloading swiftmailer/swiftmailer (v6.2.7) - Downloading ramsey/collection (1.1.3) - Downloading brick/math (0.9.2) - Downloading ramsey/uuid (4.1.1) - Downloading psr/simple-cache (1.0.1) - Downloading opis/closure (3.6.2) - Downloading symfony/translation-contracts (v2.4.0) - Downloading symfony/translation (v5.2.6) - Downloading nesbot/carbon (2.46.0) - Downloading league/mime-type-detection (1.7.0) - Downloading league/flysystem (1.1.3) - Downloading league/commonmark (1.5.8) - Downloading laravel/framework (v8.40.0) - Downloading filp/whoops (2.12.1) - Downloading facade/ignition-contracts (1.0.2) - Downloading facade/flare-client-php (1.7.0) - Downloading facade/ignition (2.8.3) - Downloading fakerphp/faker (v1.14.1) - Downloading fideloper/proxy (4.4.1) - Downloading asm89/stack-cors (v2.0.3) - Downloading fruitcake/laravel-cors (v2.0.4) - Downloading guzzlehttp/promises (1.4.1) - Downloading ralouphie/getallheaders (3.0.3) - Downloading psr/http-message (1.0.1) - Downloading guzzlehttp/psr7 (1.8.2) - Downloading jaybizzle/crawler-detect (v1.2.105) - Downloading paragonie/constant_time_encoding (v2.4.0) - Downloading pragmarx/google2fa (8.0.0) - Downloading laravel/fortify (v1.7.12) - Downloading mobiledetect/mobiledetectlib (2.8.37) - Downloading jenssegers/agent (v2.6.4) - Downloading laravel/jetstream (v2.3.4) - Downloading laravel/sail (v1.5.0) - Downloading laravel/sanctum (v2.10.0) - Downloading psr/http-client (1.0.1) - Downloading guzzlehttp/guzzle (7.3.0) - Downloading league/oauth1-client (v1.9.0) - Downloading laravel/socialite (v5.2.3) - Downloading nikic/php-parser (v4.10.4) - Downloading psy/psysh (v0.10.8) - Downloading laravel/tinker (v2.6.1) - Downloading hamcrest/hamcrest-php (v2.0.1) - Downloading mockery/mockery (1.4.3) - Downloading nunomaduro/collision (v5.4.0) - Downloading phpdocumentor/reflection-common (2.2.0) - Downloading phpdocumentor/type-resolver (1.4.0) - Downloading phpdocumentor/reflection-docblock (5.2.2) - Downloading sebastian/version (3.0.2) - Downloading sebastian/type (2.3.1) - Downloading sebastian/resource-operations (3.0.3) - Downloading sebastian/recursion-context (4.0.4) - Downloading sebastian/object-reflector (2.0.4) - Downloading sebastian/object-enumerator (4.0.4) - Downloading sebastian/global-state (5.0.2) - Downloading sebastian/exporter (4.0.3) - Downloading sebastian/environment (5.1.3) - Downloading sebastian/diff (4.0.4) - Downloading sebastian/comparator (4.0.6) - Downloading sebastian/code-unit (1.0.8) - Downloading sebastian/cli-parser (1.0.1) - Downloading phpunit/php-timer (5.0.3) - Downloading phpunit/php-text-template (2.0.4) - Downloading phpunit/php-invoker (3.1.1) - Downloading phpunit/php-file-iterator (3.0.5) - Downloading theseer/tokenizer (1.2.0) - Downloading sebastian/lines-of-code (1.0.3) - Downloading sebastian/complexity (2.0.2) - Downloading sebastian/code-unit-reverse-lookup (2.0.3) - Downloading phpunit/php-code-coverage (9.2.6) - Downloading doctrine/instantiator (1.4.0) - Downloading phpspec/prophecy (1.13.0) - Downloading phar-io/version (3.1.0) - Downloading phar-io/manifest (2.0.1) - Downloading myclabs/deep-copy (1.10.2) - Downloading phpunit/phpunit (9.5.4) - Installing dasprid/enum (1.0.3): Extracting archive - Installing bacon/bacon-qr-code (2.0.3): Extracting archive - Installing doctrine/inflector (2.0.3): Extracting archive - Installing doctrine/lexer (1.2.1): Extracting archive - Installing symfony/polyfill-ctype (v1.22.1): Extracting archive - Installing webmozart/assert (1.10.0): Extracting archive - Installing dragonmantank/cron-expression (v3.1.0): Extracting archive - Installing symfony/polyfill-php80 (v1.22.1): Extracting archive - Installing symfony/polyfill-mbstring (v1.22.1): Extracting archive - Installing symfony/var-dumper (v5.2.6): Extracting archive - Installing symfony/polyfill-intl-normalizer (v1.22.1): Extracting archive - Installing symfony/polyfill-intl-grapheme (v1.22.1): Extracting archive - Installing symfony/string (v5.2.6): Extracting archive - Installing psr/container (1.1.1): Extracting archive - Installing symfony/service-contracts (v2.4.0): Extracting archive - Installing symfony/polyfill-php73 (v1.22.1): Extracting archive - Installing symfony/console (v5.2.6): Extracting archive - Installing psr/log (1.1.3): Extracting archive - Installing monolog/monolog (2.2.0): Extracting archive - Installing voku/portable-ascii (1.5.6): Extracting archive - Installing phpoption/phpoption (1.7.5): Extracting archive - Installing graham-campbell/result-type (v1.0.1): Extracting archive - Installing vlucas/phpdotenv (v5.3.0): Extracting archive - Installing symfony/css-selector (v5.2.4): Extracting archive - Installing tijsverkoyen/css-to-inline-styles (2.2.3): Extracting archive - Installing symfony/deprecation-contracts (v2.4.0): Extracting archive - Installing symfony/routing (v5.2.6): Extracting archive - Installing symfony/process (v5.2.4): Extracting archive - Installing symfony/polyfill-php72 (v1.22.1): Extracting archive - Installing symfony/polyfill-intl-idn (v1.22.1): Extracting archive - Installing symfony/mime (v5.2.6): Extracting archive - Installing symfony/http-foundation (v5.2.4): Extracting archive - Installing symfony/http-client-contracts (v2.4.0): Extracting archive - Installing psr/event-dispatcher (1.0.0): Extracting archive - Installing symfony/event-dispatcher-contracts (v2.4.0): Extracting archive - Installing symfony/event-dispatcher (v5.2.4): Extracting archive - Installing symfony/error-handler (v5.2.6): Extracting archive - Installing symfony/http-kernel (v5.2.6): Extracting archive - Installing symfony/finder (v5.2.4): Extracting archive - Installing symfony/polyfill-iconv (v1.22.1): Extracting archive - Installing egulias/email-validator (2.1.25): Extracting archive - Installing swiftmailer/swiftmailer (v6.2.7): Extracting archive - Installing ramsey/collection (1.1.3): Extracting archive - Installing brick/math (0.9.2): Extracting archive - Installing ramsey/uuid (4.1.1): Extracting archive - Installing psr/simple-cache (1.0.1): Extracting archive - Installing opis/closure (3.6.2): Extracting archive - Installing symfony/translation-contracts (v2.4.0): Extracting archive - Installing symfony/translation (v5.2.6): Extracting archive - Installing nesbot/carbon (2.46.0): Extracting archive - Installing league/mime-type-detection (1.7.0): Extracting archive - Installing league/flysystem (1.1.3): Extracting archive - Installing league/commonmark (1.5.8): Extracting archive - Installing laravel/framework (v8.40.0): Extracting archive - Installing filp/whoops (2.12.1): Extracting archive - Installing facade/ignition-contracts (1.0.2): Extracting archive - Installing facade/flare-client-php (1.7.0): Extracting archive - Installing facade/ignition (2.8.3): Extracting archive - Installing fakerphp/faker (v1.14.1): Extracting archive - Installing fideloper/proxy (4.4.1): Extracting archive - Installing asm89/stack-cors (v2.0.3): Extracting archive - Installing fruitcake/laravel-cors (v2.0.4): Extracting archive - Installing guzzlehttp/promises (1.4.1): Extracting archive - Installing ralouphie/getallheaders (3.0.3): Extracting archive - Installing psr/http-message (1.0.1): Extracting archive - Installing guzzlehttp/psr7 (1.8.2): Extracting archive - Installing jaybizzle/crawler-detect (v1.2.105): Extracting archive - Installing paragonie/constant_time_encoding (v2.4.0): Extracting archive - Installing pragmarx/google2fa (8.0.0): Extracting archive - Installing laravel/fortify (v1.7.12): Extracting archive - Installing mobiledetect/mobiledetectlib (2.8.37): Extracting archive - Installing jenssegers/agent (v2.6.4): Extracting archive - Installing laravel/jetstream (v2.3.4): Extracting archive - Installing laravel/sail (v1.5.0): Extracting archive - Installing laravel/sanctum (v2.10.0): Extracting archive - Installing psr/http-client (1.0.1): Extracting archive - Installing guzzlehttp/guzzle (7.3.0): Extracting archive - Installing league/oauth1-client (v1.9.0): Extracting archive - Installing laravel/socialite (v5.2.3): Extracting archive - Installing nikic/php-parser (v4.10.4): Extracting archive - Installing psy/psysh (v0.10.8): Extracting archive - Installing laravel/tinker (v2.6.1): Extracting archive - Installing hamcrest/hamcrest-php (v2.0.1): Extracting archive - Installing mockery/mockery (1.4.3): Extracting archive - Installing nunomaduro/collision (v5.4.0): Extracting archive - Installing phpdocumentor/reflection-common (2.2.0): Extracting archive - Installing phpdocumentor/type-resolver (1.4.0): Extracting archive - Installing phpdocumentor/reflection-docblock (5.2.2): Extracting archive - Installing sebastian/version (3.0.2): Extracting archive - Installing sebastian/type (2.3.1): Extracting archive - Installing sebastian/resource-operations (3.0.3): Extracting archive - Installing sebastian/recursion-context (4.0.4): Extracting archive - Installing sebastian/object-reflector (2.0.4): Extracting archive - Installing sebastian/object-enumerator (4.0.4): Extracting archive - Installing sebastian/global-state (5.0.2): Extracting archive - Installing sebastian/exporter (4.0.3): Extracting archive - Installing sebastian/environment (5.1.3): Extracting archive - Installing sebastian/diff (4.0.4): Extracting archive - Installing sebastian/comparator (4.0.6): Extracting archive - Installing sebastian/code-unit (1.0.8): Extracting archive - Installing sebastian/cli-parser (1.0.1): Extracting archive - Installing phpunit/php-timer (5.0.3): Extracting archive - Installing phpunit/php-text-template (2.0.4): Extracting archive - Installing phpunit/php-invoker (3.1.1): Extracting archive - Installing phpunit/php-file-iterator (3.0.5): Extracting archive - Installing theseer/tokenizer (1.2.0): Extracting archive - Installing sebastian/lines-of-code (1.0.3): Extracting archive - Installing sebastian/complexity (2.0.2): Extracting archive - Installing sebastian/code-unit-reverse-lookup (2.0.3): Extracting archive - Installing phpunit/php-code-coverage (9.2.6): Extracting archive - Installing doctrine/instantiator (1.4.0): Extracting archive - Installing phpspec/prophecy (1.13.0): Extracting archive - Installing phar-io/version (3.1.0): Extracting archive - Installing phar-io/manifest (2.0.1): Extracting archive - Installing myclabs/deep-copy (1.10.2): Extracting archive - Installing phpunit/phpunit (9.5.4): Extracting archive Generating optimized autoload files > Illuminate\Foundation\ComposerScripts::postAutoloadDump > @php artisan package:discover --ansi Discovered Package: facade/ignition Discovered Package: fideloper/proxy Discovered Package: fruitcake/laravel-cors Discovered Package: jenssegers/agent Discovered Package: laravel/fortify Discovered Package: laravel/jetstream Discovered Package: laravel/sail Discovered Package: laravel/sanctum Discovered Package: laravel/socialite Discovered Package: laravel/tinker Discovered Package: nesbot/carbon Discovered Package: nunomaduro/collision Package manifest generated successfully. 76 packages you are using are looking for funding. Use the `composer fund` command to find out more! artisan serveもためしてみます OrganizationAccountAccessRole:~/environment/hoge(main) $ php artisan serve Starting Laravel development server: http://127.0.0.1:8000 いけてそうです! あとは .env作成コマンド php artisan key:generate php artisan migrate など必要に応じて打ってみてください
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[Laravel] XSS,CSRF,SQLインジェクションまとめ

はじめに 初学者が学ぶべきセキュリティ攻撃である、XSS,CSRF,SQLインジェクションについて、Laravelではどのように対策がされているのか、今一度おさらいしてみた。 検証環境 macOS Catalina ver 10.15.7 Docker ver 20.10.5 docker-compose ver 1.29.0 Laravel ver 7.30.4 MySQL ver 8.20.3 XSS(クロスサイトスクリプティング) XSSとは何か 3分でわかるXSSとCSRFの違いに書いてあるように「ユーザーがWebページにアクセスすることで不正なスクリプトが実行されてしまう脆弱性または攻撃手法」です。こちらの記事は大変わかりやすいので、ぜひ一読してください。 XSS対策のポイントは「特殊文字(< や > や " など)をエスケープする」ことです。そうすることでスクリプトではなく、単なる文字列として扱うことになるため、意図しない処理を防ぐことができます。 エスケープするためにはhtmlspecialchars関数を用います。 index.php $script = "<script>window.alert('hello world')</script>"; $script = htmlspecialchars($script,ENT_QUOTES,"UTF-8"); echo $script; // エスケープされるためalertは実行されない Laravelではどのように対策しているのか PostController.php public function create() { $script = "<script>window.alert('hello world')</script>"; return view('posts.create',compact( 'script' )); } posts/create.blade.php {{ $script }} // エスケープされるためalertは実行されない {{!! $script !!}} // ちなみに両端「!!」の場合は、alertが実行されますので注意です ドキュメントにも書いてある通り、{{ 変数 }}とすることでhtmlspecialchars関数が適用されます。 CSRF(Cross Site Request Forgeries) 脆弱なサイトと罠サイトを実際に作って学ぶ『CSRF』とその対策に書いてあるように「『罠サイト』から『標的サイト』へ HTTP リクエストを送信することで『標的サイト』を操作してしまおうという攻撃手法」です。 どのような被害が生まれるのかについて、上記記事でご確認ください。 CSRF対策のポイントは「リクエストが送信先が想定しているリクエストかどうか」です。 そのためリクエストを送信する側とそのリクエストを受信する側で合鍵のようなものを持っておけば、正しいリクエストかどうかわかるわけです。 Laravelではどのように対策しているのか input.blade.php <form action="" method="POST"> @csrf </form> この@csrfが <input type="hidden" name="_token" value="ランダムな文字列"> に置換され、このvalueを用いて正しいリクエストであるか否かを確認しているというわけですね。 まさに合鍵の役割を果たしています。 SQLインジェクション 【 Laravel 】クエリビルダ と Eloquent ORM の違いを整理!に書いてあるように、SQLインジェクションとは悪意のあるユーザーが不正なクエリ( データベースへの命令文 )を書き、データベースへアクセスしてデータの漏洩・改ざんを行う攻撃のことです。 SQLインジェクションのポイントは XSSと同様にエスケープ処理をする ユーザによる入力値を必要とするクエリはプリペアードステートメント(静的プレースホルダ)を用いる PDO::ATTR_EMULATE_PREPARES => false(Laravelではデフォルト) エミュレーションに関するまとめはPHPでデータベースに接続するときのまとめをご覧ください。 です。 プリペアードステートメント?ってなられた方は安全なSQLの呼び出し方をご覧ください。 Laravelではどのように対策しているのか 先ほど紹介させていただいた【 Laravel 】クエリビルダ と Eloquent ORM の違いを整理!に書いてあるように、SQLインジェクション対策は基本的になされているが、DB::rawなどの素のSQL文を使用するときは注意が必要です。 この点について、ドキュメントにもきちんと書かれています。 例えば以下のコードを見てみましょう。 PostController.php public function store(Request $request) { // 悪意のあるユーザによって送られてきたid $id = '5; delete from posts'; $posts = DB::table('posts')->whereRaw("id = ${id}")->get(); } こんなコードを書くことはまずありませんですが、この場合はpostsテーブルのデータが全て削除されてしまいます。 続けて、 PostController.php public function search(Request $request) { // ユーザによって検索がかけられた値 $word = "果汁100%";   // 正しくエスケープされないためエラー $results = DB::table('posts')->whereRaw("content like %${word}%")->get(); // 正しくエスケープされる $results = Post::where("content","like","%${word}%")->get(); return view('posts.search',compact( 'results' )); } このようにエスケープ処理を行っていないためSQLインジェクションの脆弱性を生む原因となってしまいます。 よってDB::rawなどの素のSQL文を使用するときは、エスケープ処理をして、しっかり対策を取らなければならないことがわかります。 rawメソッドをどうしても使わなければならない時は注意して使いましょう。 さいごに いかがだったでしょうか。 初学者が押さえておくべきセキュリティについて、Laravelではどのように対策を行っているのかを見てきましたが、普段それらを特に意識することなく、開発することができる点はやはりLaravelのすばらしい点だと思います。 一方で、「Laravelを使っていても、セキュリティ対策は不完全である」こともお分かりいただけたと思います。 Laravelでできることはフル活用して、できないことは補うようにしてセキュリティ対策をしていきたいですね。 参考サイト 3分でわかるXSSとCSRFの違い https://qiita.com/wanko5296/items/142b5b82485b0196a2da 脆弱なサイトと罠サイトを実際に作って学ぶ『CSRF』とその対策 https://www.hypertextcandy.com/csrf-hands-on-tutorial 【 Laravel 】クエリビルダ と Eloquent ORM の違いを整理! https://qiita.com/Tomo_rrow86/items/a0426ce17b978e3b05d5 PHPでデータベースに接続するときのまとめ https://qiita.com/mpyw/items/b00b72c5c95aac573b71#%E3%82%A8%E3%83%9F%E3%83%A5%E3%83%AC%E3%83%BC%E3%82%B7%E3%83%A7%E3%83%B3%E3%81%AB%E9%96%A2%E3%81%99%E3%82%8B%E3%81%BE%E3%81%A8%E3%82%81 安全なSQLの呼び出し方 https://qiita.com/Morinikiz/items/dfdb33f25df4df0f672c 駆け出しエンジニアの皆さんに知ってほしい脆弱性のこと。 https://zenn.dev/ad5/articles/5e4e67c9663e4e0d0cb0 【Laravel】敢えて試すSQLインジェクション【仕組みを知るには実装】 https://kimamacode.com/laravel-sql-injection/ PHP+PDO+MySQLの組み合わせではSQLインジェクション攻撃で複文呼び出しが可能 https://blog.tokumaru.org/2013/12/pdo-and-mysql-allow-multiple-statements.html
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

初学者がlaravel 8.xのBreezeでログイン機能を実装してみた

初学者が簡単なCRUDアプリにログイン機能を実装したいなと思ったとき、 公式ドキュメントより「まず、Breezeより始めよ」とのお告げがあったので Breezeでログイン機能を実装してみました。 環境 OS: Windows 10 home CPU: AMD Ryzen 2700X GPU: NVIDIA GTX 1060 RAM: 16GB 2666Mhz PHP: ver 8.0.3 Laravel: ver 8.45.1 MySQL(MariaDB): ver 15.1 1.laravelの認証機能 laravel 8.xでは認証機能構築のスターターキットとして、 jetstreamとbreeze、が提供されています。 jetstreamはログイン、ユーザー登録、メール検証、2要素認証、セッション管理等を含む 多機能な認証パッケージであるのに対して、breezeはログイン、ユーザー登録、パスワードのリセット、 メールの検証、パスワードの確認等の最小限の認証パッケージとなっています。 そのため、公式ドキュメントは「まず、Breezeより始めよ」とbreezeから始めることを推奨しています。 また、jetstreamとbreezeはCSSフレームワークがbootstrapからTailwind CSSに変わっていることに留意。 なんでTailwind CSS推しに...bootstrapでいいじゃないですか。 2.laravel Breezeのインストール 事前にlaravelプロジェクトを作成しておきます。 筆者はlaravel/installerで作成しているので以下のコマンドになります。 laravel new example-app ターミナルで作成したlaravelプロジェクトのディレクトリまで移動し、 ComposerでLaravel Breezeパッケージをインストールします。 composer require laravel/breeze --dev Laravel Breezeパッケージのインストールが完了したら Artisanコマンドでプロジェクトにインストールします。 php artisan breeze:install 最期にNode.jsモジュールのインストールとアセットのコンパイルを行いますが、 そのためにはNode.jsとnpm(Node Package Manager)が必要となります。 npm install npm run dev これでLaravel Breezeの実装は完了しました。 php artisan serveコマンドで簡易サーバーを立ち上げて確認すると、 画面右上赤丸内にloginとregisterが表示されます。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

LaravelでAWS SDKのS3を扱う

LaravelでS3を使うには AWS SDKを使う Flysystemを使う のどちらかになると思います。 とりあえず今回はSDKを使います。 AWS SDK composerでの導入 composer require aws/aws-sdk-php でSDKを導入します。 .envファイルに環境変数の設定 コード上にわざわざ接続情報を書く必要はありません。 環境変数から自動的に持ってきてくれるので、指定された環境変数名に キー情報を記載しておきます。 AWS_ACCESS_KEY_ID=AKIAIOSFODNN7EXAMPLE AWS_SECRET_ACCESS_KEY=wJalrXUtnFEMI/K7MDENG/bPxRfiCYEXAMPLEKEY S3への処理を書く 後はS3Clientを使って好きに操作することが可能です。 use Aws\S3\S3Client; ... $s3 = new S3Client([ 'version' => 'latest', 'region' => 'us-east-2' ]); $result = $s3->listObjects();
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

落ちこぼれSE日記 part1(Udemyでの学習)【PHP】【Laravel】

IntroDuction 新卒SEになって2年目になっても何もできないSEが這い上がるための日記 経歴 PHP歴:9ヶ月 フルスクラッチ(フレームワーク無し)の開発のみ Java歴:1ヶ月(研修:2ヶ月)⇦業務中 SpringBootでの実装中 今まで何を勉強していたのだろうかと後悔中 この記事のきっかけ ○フレームワークでの開発が当たり前になっているような風潮を感じた  ⇨でも、自分はフレームワーク開発もしてないし、実装経験もあまりない、テスト要員   ⇨実装は実装でも、先輩たちが作った基盤(テンプレート)などにコーディングしただけ  ⇨ひかれたレールを走るだけじゃ成長しない ○覚えたことをどんな形でもアウトプットして学習の生産性をあげたい  ⇨内容なんてなんのその 端末スペック MacBook Air メモリ:8 GB 3733 MHz LPDDR4X 使用歴:1年 Udemyの学習 知人の勧めからUdemyのコースを取得 学習コース 【2日でできる】はじめての PHP 7 x Laravel 6 入門 ※今回は下記のバージョンで利用 言語/FW Version PHP 7.4 Laravel 8.0 学習内容(概要) ・MacでのPHP,Laravel導入手順 Composer,homebrewによる導入 ・HTML,CSS,JavaScript(jQuery)の学習 HTML,CSSは既知の内容。jQueryの導入及びbxSliderの学習 ・DB(MySQL)の構築 MySQLにて、構築につまづく ・Laravelの実装 提供されているリソースを基に実装を進める。 →マイグレーション →モデル →ビュー →ルーティング →ログイン機能 学習内容 MacでのPHP,Laravel導入手順 Comporser :パッケージ・ライブラリの依存関係を管理するツール PHP プロジェクトで必要なパッケージ(ライブラリ)は何かを列挙すると、それらを自動的にインストールしてくれる機能 (自分解釈):PHP実装において、必要な機能(例えばメール機能)が欲しい時に、必要とするライブラリを一挙にダウンロードしてくれるもの HTML,CSS,JavaScript(jQuery)の学習 jQuery(bxslider[^1])の導入 test.js <!-- jQuery(slider) --> <link rel="stylesheet" href="lib/jquery.bxslider.css"> <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.1.1/jquery.min.js"></script> <script src="js/jquery.bxslider.min.js"></script> <main> <div class="test-slider"> <ul class="slider"> <li><img src="image/php_study.png" alt="いらすとや1"></li> <li><img src="image/php_study2.png" alt="いらすとや2"></li> </ul> </div> </main> <script> $(document).ready(function(){ $('.slider').bxSlider(); }); </script> ※公式サイトに英語だけれども簡単に使い方が記載されている →日本語ばかりに甘えないこと! DB(MySQL)の構築 「mysql.server start」コマンド が動作しない... mysql $ mysql.server start Starting MySQL .. ERROR! The server quit without updating PID file(/usr/local/var/mysql/****.pid). 【原因】パスが通っていないから 参照: 【MySQL】pid not foundが発生したときの対応集 mysql vim ~/.bash_profile 下記のようにパスを追加 mysql echo 'export PATH="/usr/local/opt/mysql@5.6/bin:$PATH"' >> ~/.bash_profile source ~/.bash_profile これで治りました。  一旦終了 次回、実際のUdemyの授業内容を記録。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Dockerで環境を作ってLaravelプロジェクトを作るまで(Windows)

WSL2のおかげかWindowsでもDockerが楽に動かせるようになったので。 とりあえずPHP環境を作って、そこにLaravelをインストールする感の流れを書いておきます。 動作環境 Windows10 VisualStudioCode Docker WSL2のインストール docker関連のファイルを準備 以下のようなファイルを準備。 記述内容は各自好きな感じに変えるといいと思います。 困ったらこちらでも読めば解決すると思います。 https://docs.docker.com/compose/ docker-compose.yml version: '3' services: laravel: container_name: laravel build: context: . dockerfile: ./docker/php/Dockerfile volumes: - ./laravel:/var/www/html/laravel ports: - "8080:80" # - "443:443" mysql: container_name: mysql build: context: . dockerfile: ./docker/mysql/Dockerfile environment: - MYSQL_ROOT_PASSWORD=password - MYSQL_USER=laravel - MYSQL_PASSWORD=password - MYSQL_DATABASE=test volumes: - ./mysql:/var/lib/mysql ports: - 3306:3306 docker/php/Dockerfile FROM php:8.0-apache RUN apt-get update \ && apt-get install -y git unzip \ && docker-php-ext-install pdo_mysql \ && a2enmod rewrite docker/mysql/Dockerfile FROM mysql:5.7 VSCodeからDockerの拡張機能を導入 ms-azuretools.vscode-dockerをインストール。 Dockerの起動 起動していないとエラーになるので忘れずに。 VSCode上でdocker-compose.ymlを使って動かす 拡張機能のDockerを入れておけば、docker-compose.ymlを右クリックした際にメニューがいくつか追加されてます。 右クリック > Compose RestartでLaravel用とMySQL用のDockerのコンテナが2つ立ち上がります。 composerでLaravelのインストール composerが入っている環境でコマンドを実行します。 (Dockerfileにcomposerを導入するように書き換えておくと楽かも) 以下のコマンドでlaravelがインストールされます。 バージョンは各自好きなものを指定すれば良いと思います。 cd /var/www/html composer create-project "laravel/laravel=8.5.*" laravel 構築完了 http://localhost:8080/laravel/publicにアクセスすれば、LaravelのWelcomeページが出ます。 ここからいろいろ作り始める感じですね。 URLが気になる方はDocumentRootとか変えると良いかも。 Failed to open stream: Permission deniedと出た時 The stream or file "/var/www/html/laravel/storage/logs/laravel.log" could not be opened in append mode: Failed to open stream: Permission denied よくある権限エラーです。 storageフォルダの権限を変えてしまいましょう。 chown -R www-data:www-data laravel/storage # もしくは chmod -R 777 laravel/storage
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

【Laravel】個人的によく使うEloquentのWhere句まとめ

Laravelは自由かつ何でも実現できるフレームワークなので (使いこなせているかは別として…)重宝しています。 今回は、個人的によく使うEloquentのWhere句を書き出してみました。 基本 $adminUsers = User::where('role', '=', 'admin')->get(); AND検索・OR検索 whereを付け足せばAND検索になります。 OR検索をするにはorWhereを使います。 AND検索 $users = User::where('role', '=', 'admin') ->Where('id', '>', 10); ->get(); OR検索 $adminers = User::where('role', '=', 'admin') ->orWhere('role', '=', 'maintainer'); ->get(); IN句で検索 IN句で検索します。 たとえば、Idが0か999のユーザを取得します。 IN句 $specialUsers = User::whereIn('in', [0,999])->get(); NULLのレコードを検索 NULLの値になっているレコードを取得します。 whereNullを使います。 NULL $invalidUsers = User::whereNull('nickname')->get(); NULLでないレコードを検索 NULLでないレコードを取得します。 whereNotNullを使います。便利ですね。 NOTNULL $validUsers = User::whereNotNull('nickname')->get(); ソート orderByを使います。 降順は'desc'、昇順は'asc'を指定します。 またorderByではなく、latest、oldestを使っても良いです。 ソート $users = User::orderBy('id','desc')->get(); $users = User::orderBy('id','asc')->get(); $users = User::latest('id')->get(); $users = User::oldest('id')->get(); 動的にWhereを追加する 条件によってクエリを変更したいとき。 $userQuery = User::query(); $userQuery = $userQuery->where('role', '=', 'member'); if ($condition1) { $userQuery = $userQuery->where('condition', '=', '1'); } if ($condition2) { $userQuery = $userQuery->where('condition', '=', '2'); } $users = $userQuery->get(); 他にも思い出したら追記していこうと思います。 「他にもこれよく使う!」 というWhere句がありましたら是非コメント頂ければと思います!
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

Laravelの2種類のテストの比較(FeatureテストとUnitテスト)

はじめに Laravelのtests/ディレクトリ以下にはFeature/とUnit/の二つのディレクトリが自動で作成されます。それぞれのディレクトリにはExampleTest.phpが最初からありますが、これら二つの違いは「素のPHPUnitのTestCaseクラスを継承している」か「Laravel用に拡張されたTestCaseクラスを継承しているか」です。 Feature/ExampleTest.phpはLaravel用に拡張されたTestCaseクラスを継承しているので、DBアクセスを含むLaravelの機能がテスト内で全て使えます。Unit/ExampleTest.phpは素のPHPUnitのTestCaseクラスを継承しているため、Laravelの機能が使えず、素のPHPコードとしてのロジックテストを書くものになっています。 Featureテストは便利なのですが、Laravel用に拡張されている分テストの実行に時間がかかります。なので、Laravelに依存しない形で書けるテストは極力Unitテストにするべきです。 FeatureテストとUnitテストの比較 次のようなUser Modelがあります。isAdmin()メソッドでは、 roleカラムの値が「ADMIN」の場合にtrueを返します。このメソッドについて、FeatureテストとUnitテストを書いて比較します。 <?php namespace App\Models; use Illuminate\Database\Eloquent\Factories\HasFactory; use Illuminate\Foundation\Auth\User as Authenticatable; use Illuminate\Notifications\Notifiable; class User extends Authenticatable { use HasFactory, Notifiable; protected $fillable = [ 'name', 'email', 'password', 'role', ]; protected $hidden = [ 'password', 'remember_token', ]; public function isAdmin(): bool { return $this->role === 'ADMIN'; } } Featureテストの場合 isAdmin()メソッドを呼び出すと、Userモデルは内部でDBアクセスを行い、roleカラムの値をDBから読み出そうとします。なので、Featureテストの場合、実際にDBへデータを登録してからisAdmin()メソッドを呼び出すことになります。 <?php namespace Tests\Feature; use App\Models\User; use Tests\TestCase; class UserTest extends TestCase { public function test_isAdmin() { $user = User::factory()->create(['role' => 'ADMIN']); self::assertTrue($user->isAdmin()); } } 実行結果はこちらです。実行時間は[0.38s]でした。 sail test tests/Feature/UserTest.php PASS Tests\Feature\UserTest ✓ is admin Tests: 1 passed Time: 0.38s Unitテストの場合 Unitテストの場合は、DBアクセスができません。では、どうするかというと、Userモデルをインスタンス化した後に、roleプロパティへ自分でデータをセットします。 <?php namespace Tests\Unit; use App\Models\User; use PHPUnit\Framework\TestCase; class UserTest extends TestCase { public function test_isAdmin() { $user = new User(); $user->role = 'ADMIN'; // これでもOK // $user = new User(['role' => 'ADMIN']); self::assertTrue($user->isAdmin()); } } 実行結果はこちらです。実行時間は[0.06s]でした。Featureテストの1/6程度の時間で終わっています。 sail test tests/Unit/UserTest.php PASS Tests\Unit\UserTest ✓ is admin Tests: 1 passed Time: 0.06s まとめ 今回はFeatureテストとUnitテストの実行時間の比較を行いました。テスト対象のコードはとてもシンプルなものでしたが、それでも6倍以上の差でUnitテストの方が高速ということがわかりました。プロジェクトの全てのテストをFeatureテストにしてしまうと、少なくともこれだけ実行時間に差が出てしまうということですね。 また、実際のFeatureテストでは、裏でLaravelがよしなにやってくれていることも含めると、更に多くのLaravelの便利機能を使うことになると思います。そう考えるとFeatureテストとUnitテストでは6枚以上の実行時間の差が出るのではと思います。みなさん、Unitテスト書いていきましょう。そしてUnitテストが書けるような設計をしましょう。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

データベースの全テーブル情報をPHPでCSV出力する方法

はじめに データベースにあるテーブルの情報をCSV出力するためのベストな方法を模索し、速度を計測したので記事にまとめたいと思います。 動作確認環境 PHP 8.0 Laravel 8.0 ※下位環境でも動作する場合がございます 補足 Dockerを使っていて、PHPコンテナからMySQLコンテナにコマンドが通らない場合はこちらの記事に解決法が記載されています。 Laravel(PHP)でのCSV出力方法について 主に以下の3つの方法がありました fwrite fputcsv mysqlコマンドを直接実行する fwriteとfputcsvの違いについては、こちらの記事が勉強になりました。 fwriteとfputcsvではCSV化したものをExcelで開くことがある場合は、fputcsvの方が軍配が上がる印象です。 ということで、今回はfwriteは候補から除外し、fputcsvとmysqlとでどちらが便利かを調査しました。 計測条件 1つのテーブルに一千万のレコードが入っている テーブルから指定期間のデータをCSV出力する その際出力するデータ量は約100万レコードとする 計測データ 計測に使ったソースコード $sumCount = DB::table('samples') ->where('created_at', '>=', '2026-06-22 00:00:00') ->where('created_at', '<', '2026-12-22 00:00:00') ->count(); $fetchNeedCount = (int)ceil($sumCount / 50000); for ($i = 0; $i < $fetchNeedCount; $i++) { $records = DB::table('samples') ->where('created_at', '>=', '2026-06-22 00:00:00') ->where('created_at', '<', '2026-12-22 00:00:00') ->skip($i * 50000) ->take(50000) ->get(); $stream = fopen('php://temp', 'r+b'); foreach ($records as $record) { fputcsv($stream, (array)$record); } rewind($stream); $csv = str_replace(PHP_EOL, "\r\n", stream_get_contents($stream)); $csv = mb_convert_encoding($csv, 'SJIS-win', 'UTF-8'); file_put_contents('test.csv', $csv, FILE_APPEND); } $cmd = 'mysql -B -N -u phper -h db -psecret -D local_laravel -e "SELECT * FROM samples where created_at >= \'2026-06-22 00:00:00\' and created_at < \'2026-12-22 00:00:00\'" | sed -e "s/\t/,/g" > test.csv'; exec($cmd); 結果 項目 計測時間 fputcsv 2m45s mysqlコマンド 35s なお、下記SQLを生でDBに叩いた時の計測時刻は24sでした。 SELECT * FROM samples where created_at >= '2026-06-22 00:00:00' and created_at < '2026-12-22 00:00:00'; まとめ 取得件数が少ない場合は、fputcsvとmysqlコマンドの差はそれほどなかったのですが、CSV化の対象が多くなると、fputcsv側ではメモリオーバーの発生を避けるためにクエリー発行を複数回に分ける必要が出てきたため、より時間がかかってしまう結果となりました。 なお、今回はcreated_atの型はTIMESTAMP型としましたが、時刻をUNIXタイムスタンプでも管理し、そのカラムで絞り込むというチューニング方法を用いるとさらに処理が速くなりそうです。 [追記] 実際にint型でタイムスタンプを挿入し、その値基準でしぼりこみを行うと5秒程度速くなること確認できました。 完成版コード mysqlコマンドの方がベターであることが分かったので、これを基準としてLaravelで全テーブルの情報をCSV化するコマンドを作成しましたので合わせて記載したいと思います。 <?php namespace App\Console\Commands; use Carbon\Carbon; use DB; use Illuminate\Console\Command; use Illuminate\Filesystem\Filesystem; use LogicException; /** * Class ConvertCSV. */ class ConvertCSV extends Command { /** * The filesystem instance. * * @var \Illuminate\Filesystem\Filesystem */ protected $file; /** * The name and signature of the console command. * * @var string */ protected $signature = 'convert_csv {--day=} {--period=1}'; /** * The console command description. * * @var string */ protected $description = 'convert_csv'; /** * List of connection names to be output. * * @var array */ protected $targetConnectionNames = [ 'mysql', ]; /** * FileOperation constructor. */ public function __construct( Filesystem $file ) { $this->file = $file; parent::__construct(); } /** * Execute the console command. */ public function handle(): void { [$startDate, $endDate] = $this->getStartEndTime(); $this->createDirectory(storage_path(sprintf('dump_csv/%s', $startDate))); foreach ($this->targetConnectionNames as $connectionName) { $configConnection = config('database.connections.'.$connectionName); if (empty($configConnection)) { throw new LogicException(sprintf('The target was not found:%s', $connectionName)); } $databaseName = $configConnection['database']; $username = $configConnection['username']; $password = $configConnection['password']; if (empty($databaseName) || empty($username) || empty($password)) { throw new LogicException(sprintf( 'Incorrect config settings:databaseName[%s] username[%s] password[%s]', $connectionName, $username, $password)); } $schema = DB::connection($connectionName)->getDoctrineSchemaManager(); $tableNames = $schema->listTableNames(); foreach ($tableNames as $tableName) { $mysqlBaseCommand = sprintf('mysql -B -N -u %s -h db -p%s -D %s -e', $username, $password, $databaseName); $mysqlCommand = sprintf("SELECT * FROM %s where created_at >= '%s 00:00:00' and created_at < '%s 00:00:00'", $tableName, $startDate, $endDate ); $outputFilePath = storage_path(sprintf('dump_csv/%s/%s.csv', $startDate, $tableName)); $cmd = sprintf('%s "%s" | sed -e "s/\t/,/g" > %s', $mysqlBaseCommand, $mysqlCommand, $outputFilePath); exec($cmd); $this->comment(sprintf('Completed:%s', $tableName)); } } } /** * Directory creation. * * @param string $directoryPath */ protected function createDirectory(string $directoryPath): void { if (! is_dir($directoryPath)) { $result = $this->file->makeDirectory($directoryPath, 0777, true); if (! $result) { throw new LogicException(sprintf('Directory creation failure:%s', $directoryPath)); } } } /** * Get start date and time and end date and time. */ protected function getStartEndTime(): array { $period = $this->option('period'); if ($this->option('day')) { $startDate = $this->option('day'); $endDate = Carbon::parse($startDate)->addDays($period)->format('Y-m-d'); } else { $carbon = Carbon::now(); $startDate = $carbon->format('Y-m-d'); $endDate = $carbon->addDays($period)->format('Y-m-d'); } if ($startDate > $endDate) { return [$endDate, $startDate]; } return [$startDate, $endDate]; } } 解説 mysqlのコマンド部分を変数化してより汎用性ある形にしました。 出力先は日付単位でstorage直下に出力されるようにしてあります。 Laravelではconfigでデータベース関連の値を記述する仕組みとなっているため、mysqlコマンドに使う値はそこから取得しています。 また、テーブル名一覧においてもLaravelであれば下記記事の方法で取得することが可能です。 なお、CSVファイルの先頭にヘッダーを付けたい場合はmysqlコマンドの「-N」を外すだけで大丈夫です。 勉強に使った関連記事やサイト一覧
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む