- 1. Laravelのジョブ内で通信を行う場合の注意点
- 2. 【Laravel】Eager LoadとLazy Loadの違いと使い分け
- 3. 業務レベルの実例で理解するProxyパターン
- 4. DBのトランザクションの概要について理解する
- 5. 【自分用メモ】PHP で時刻が正常に表示されないときの対処法
- 6. 高度なLaravelテクニックを活用した家計管理アプリケーション開発ガイド
- 7. Laravelの開発環境で php artisan serve が停止しない時の解決策
- 8. ある日アプリが動作しないと言われたら
- 9. Laravel 11.16.0 にアップグレードしてから file_put_contents() エラーが発生する
- 10. 【Laravel】テストデータの登録をTraitで共通化する方法!
- 11. 【パーティションキー】MySQLにパーティションキーを設定したら5倍クエリが早くなった件【Laravel】
- 12. 加算子/減算子は$i++,$i–だけじゃない
- 13. 01.PHPってなに?
- 14. 【Laravel】development環境で問題ないアプリがproduction環境で全く動かない事象に遭遇した
- 15. 【Laravel × React】業務フローを明瞭に!ポートフォリオMATRIXFLOWを作成しました
- 16. Composer.phar で GitHub の Repository を require したい
- 17. FuelPHPの例外エイリアスがキャッチできない理由を探る
- 18. PHPのエイリアスと例外処理の関係を検証してみた
- 19. 【PHP】無名関数について
- 20. Laravelのchunkメソッドで全レコードが更新されなかった話
Laravelのジョブ内で通信を行う場合の注意点
## 概要
LaravelのジョブでSFTPを行う際に`Connection closed prematurely`エラーが起きました。
この記事では
– 原因
– 解決策を解説します。
## 前提
– SFTP通信には`league/flysystem-sftp: ^1.1`を使用
– ジョブの処理には`php artisan queue:work`を使用## 原因
シンプルに**前のコネクションが残っておりタイムアウトしたから**です😭### なぜ前のコネクションが残っていた?
`queue:work`でジョブの処理を行う際、Laravelはワーカープロセスを常駐させ処理毎にアプリの更新を行いません。
つまり、**シングルトンインスタンスに設定されたプロパティがジョブ毎にリセットされません。**
(通常のリクエスト=>アプリ生成=>処理実行=>アプリ停止の流れだとリセットされます)`league/flysystem-sftp`ではプロパティにコネクションが設定されていれば、そのまま使用します。そのため、以下の流れでエラーが発生してしまいます。
1. プロセス立ち上
【Laravel】Eager LoadとLazy Loadの違いと使い分け
## はじめに
モデル間のリレーションを扱う場合、データのロード方法によってパフォーマンスやメモリ使用量に大きな影響を与えることがあります。今回は、「Eager Load(イーガーロード)」と「Lazy Load(レイジーロード)」について解説します。
## Eager Load(イーガーロード)とは?
### 特徴
**Eager Load**は、一度のクエリでまとめてデータを取得する方法です。これにより、後からデータをアクセスする際に追加のクエリを発行する必要がなくなります。Laravelでは、`with`メソッドを使用してEager Loadを実装できます。“`php
$users = User::with(‘posts’)->get();
“`
この例では、Userモデルに関連するpostsが一緒に取得され、各ユーザーの投稿を表示する際に追加のクエリが発生しません。**メリット:**
– **クエリ数を削減:** データベースへのアクセス回数を減らせる
– **パフォーマンス向上:** 複数のリレーションを持つデータを一括で処理する場合に効果的
– **データの一
業務レベルの実例で理解するProxyパターン
## はじめに
この記事のゴールは、**適切な場面でProxyパターンを使えるようになる**ことです。
不適切な場面におけるデザインパターンの適用は大きな技術的負債をもたらしますので気をつけましょう。対象読者は、Proxyパターンのことをなんとなく知っているものの仕事では自信を持って使えない人です。
:::note warn
筆者はPHPerなのでサンプルコードはPHPです。
:::完成版はこちらです。
https://github.com/jnkmtsd/qiita-php-sample/tree/v0.1.1
## Proxyパターンとは
以下がわかりやすいです。
> Proxyパターンは、すでにあるオブジェクト関係の間に、透過的に別のオブジェクトを割り込ませて、元のコードを変更せずに、同じ機能呼び出しの振る舞いを拡張するためのパターンです。
>
> 田中ひさてる (2022). ちょうぜつソフトウェア設計入門――PHPで理解するオブジェクト指向の活用 技術評論社クラス図は以下のようになります。
“`plantuml
@startuml
interfac
DBのトランザクションの概要について理解する
:::note
### 概要
トランザクションとは
複数の SQL 文によるデータ更新を1つの処理としてまとめてデータベースに反映させることです。
一部だけがデータベースに反映されると、データベース全体としてデータが不整合な状態になる場合に有効です。
:::# 背景 🖼️
業務でトランザクションを使ったのですが、口で説明できるほど概要がつかめていないので今回復習します。
# トランザクションとは 💡
https://oss-db.jp/dojo/dojo_01
複数の SQL 文によるデータ更新を1つの処理としてまとめてデータベースに反映させることを言います。
一部だけがデータベースに反映されると、データベース全体としてデータが不整合な状態になる場合に有効です。
たいせい君がお父さんに送金する際の処理を考えます。(本当に送金してるかはそっとしておいてください)
:::note
Laravelで検証します。
:::こちらで動作確認可能です。
https://github.com/yamatai12/transaction-app
以下に公式docを参考にします。
【自分用メモ】PHP で時刻が正常に表示されないときの対処法
## 手順
①php.ini ファイルに、`date.timezone` を追加
(日本の場合は以下の通り)“` php.ini
date.timezone = “Asia/Tokyo”
“`②サーバーを再起動する
高度なLaravelテクニックを活用した家計管理アプリケーション開発ガイド
## はじめに
Laravelは、PHPのウェブアプリケーションフレームワークとして人気があり、多くの開発者に愛用されています。この記事では、家計管理アプリケーションを例に、Laravelの高度な機能について詳しく解説します。各章では、実際のコード例と詳細な説明を提供し、Laravelの高度な概念を理解しやすくします。
## サンプルデータ
まず、以下の50件の家計データを使用して説明を進めていきます。このデータは、日付、カテゴリ、金額、メモの4つの列で構成されています。
“`php
$household_expenses = [
[‘date’ => ‘2023-01-01’, ‘category’ => ‘食費’, ‘amount’ => 5000, ‘memo’ => ‘新年会’],
[‘date’ => ‘2023-01-02’, ‘category’ => ‘交通費’, ‘amount’ => 1200, ‘memo’ => ‘通勤’],
[‘date’ => ‘2023-01-03’, ‘category’ => ‘光熱費’, ‘amoun
Laravelの開発環境で php artisan serve が停止しない時の解決策
## はじめに
`php artisan serve` を停止したいけれど、方法がわからない。または停止できない問題を解決する方法を紹介します。
## `php artisan serve` の基本的な停止方法
基本的vscodeのターミナルなどで `php artisan serve` していると `Control + c` で停止することができます。
## 例外1
`php artisan serve` したターミナルを閉じてしまった方は `ps` コマンドを実行してプロセスを確認します。“`
$ ps
“`プロセス一覧を確認すると、以下のような表示が出ると思います
“`
PID TTY TIME CMD
“`プロセスの「CMD」の列に 127.0.0.1:8000 と表示されている行が、ローカルサーバーを指しているはずです。この行に表示されているPIDが対象となります。
該当するPIDを見つけたら、以下のように入力してプロセスを停止します。
“`
kill -9 1234
“`
ちなみに、`-9` はプロセスを強制終了させるオプション
ある日アプリが動作しないと言われたら
# 前置き
先日、自社で納品したWEBアプリを使用しているクライアントから
『今朝いきなりログインができなくなり、アプリケーションが表示できない。早急に原因を調査し解決して欲しい。』と連絡があり、対処する機会があった。# 推測してみる
いったんrebootコマンドでサーバーを再起動してみるが動作は解消せず。
色々な原因が考えられたがその時までアプリケーションは2年近く問題なく動作していたため、格納されているオンプレミスサーバー内ディスクのメモリが何らかの原因で容量ギリギリまで使用されていたのではないかと推測し、調査した。# 調査した
まずteratermでサーバーに接続後、以下のdf -hでサーバー内全体のディスクの容量を確認した。
“`
df -h
“`
画像はないが、何故か/varディレクトリ以下が88%使用となっており、仮説が正しそうと思い始める。次にディレクトリを移動しながらdu -sh/*でディレクトリごとの容量を確認していく。
“`
du -sh/*
“`
すると/var/spool/mail/rootディレクトリで80%以上使用しており、このディレクトリ
Laravel 11.16.0 にアップグレードしてから file_put_contents() エラーが発生する
## はじめに
Laravelで開発をしていると以下のようなエラーが発生した人向けの解決策です。
“`
Notice: file_put_contents(): Write of 61 bytes failed with errno=32 Broken pipe in /Users/[redacated]/Projects/fpwr/vendor/laravel/framework/src/Illuminate/Foundation/resources/server.php on line 21
“`
## このエラーが発生した原因
私の場合、Laravelでデータベース接続の設定を行うために `.env` ファイルを編集して更新したところ、「該当するデータベースが存在しない」とエラーが表示されました。再度 `.env` を修正し、ブラウザをリロードすると表示がされるようになったものの、画面の上部に以下のエラーが表示されました。
“`
Notice: file_put_contents(): Write of 61 bytes failed with errno=32 Broke
【Laravel】テストデータの登録をTraitで共通化する方法!
泉([@izumin_0401](https://twitter.com/izumin_0401))です。
今回は、Laravelでテストデータの登録を共通化する方法を解説しやす!
# ブログ記事はこちら
https://traveler0401.com/laravel-testdata-trait/
# Laravelでテストデータの登録を共通化する方法
## Traitの作成
“`php
insert([
‘hoge’ => ‘1’,
]);
}
}
“`
データを登録するTraitを作成します。## テストデータでTraitを使う
“`php
【パーティションキー】MySQLにパーティションキーを設定したら5倍クエリが早くなった件【Laravel】
# 結論
100,000件のtestsテーブルからyearカラムに対してパーティションキーを設定して比較した結果はこちら
“`php
// クエリ
DB::table(‘tests’)->where(‘year’, 2023)->get();// パーティションを設定した結果
結果: 0.47547888755798 seconds// パーティションを設定していない結果
結果: 2.206062078476 seconds
“`
**約5倍** は早くなりました…タイトルとおりです。# パーティションキーとは
パーティション = 仕切り というようにデータを指定した値ごとに仕切ることで、読み込み速度が高速化されます。2022年、2023年、2024年…ごとにデータが積まれていく場合、年カラムにパーティションキーを設定することで検索結果が早くなります。
※パーティションキーにはいくつかの種類がありますが、今回は特定の範囲に絞り込む「レンジパーティション」に絞り込んで紹介します。
# migrationファイルで設定する
Laravelの機能でパーティシ
加算子/減算子は$i++,$i–だけじゃない
# 前談
転職して情シスから開発エンジニアに戻った
この前初出社を迎えました。
その時新卒の社員と話したところ、プログラムの話をしました。
いきなりプログラムの話とは、やっぱり開発エンジニアが150名以上いると違うんですかね。
僕の新卒は上司と二人だったので、ある意味プログラムとアニメとかの話しかしませんでしたねw# 本編
新卒の社員とプログラムの話をした時にPHPリファレンスの話になり、加算子・減算子の話をしました。“$i++と++$iって同じじゃないんですか?”
確かにプラスすることには変わらない。だが違うのだ。違うのは加算されるタイミングなんだよ。
僕にはリファレンスお兄さんことA上司がいたから知っている。テストコードは以下の通りです。
“`php
01.PHPってなに?
## PHPって何?
PHPは、バックエンドで動くプログラミング言語です。
バックエンドとは、ざっくり説明すると、データの保存や出力といったユーザーが目に見えないところで行っている処理を行っている部分のことです。(何かのデータを保存したり、取得したデータを出力したり…)反対に、ユーザーが目に見える部分はフロントエンドといいます。(ブログやWebサイト。いわゆる画面デザインを作っているものです。)
## PHPはどこで使われている?
WikipediaやFacebook、Slackで使用されている言語です。
## PHPが得意なこと
– Webアプリの開発
– WordPressオリジナルテーマの開発## PHPが苦手なこと
– デスクトップアプリの開発
– スマホアプリの開発## 勉強するにあたっての前提知識
勉強する際はHTML・CSS・JavaScriptがある程度できれば問題ないと思います。
これらの勉強はProgateや、侍テラコヤというサイトで勉強するのがおすすめです。(有料)
独学で進めていける方はProgateで、自分で進めていけるか不安という
【Laravel】development環境で問題ないアプリがproduction環境で全く動かない事象に遭遇した
### ことの始まり
ポートフォリオMATRIXFLOWを作成している最中に事は起こりました。※ MATRIXFLOWについてはこちらをご覧ください↓
https://qiita.com/maixhashi/items/5da649e290ec13e71465
一度、production環境(Heroku)にデプロイして問題ないことを確認したポートフォリオが機能追加後に再度pushすると画面真っ白になり何も動かず。
### ことの詳細
次のような流れでした。
– ① [担当者(Membersモデルレコード)追加機能](https://qiita.com/maixhashi/items/5da649e290ec13e71465#%E6%8B%85%E5%BD%93%E8%80%85%E3%81%AE%E8%BF%BD%E5%8A%A0)の実装
– ② [フローステップ(FlowStepモデルレコード)追加機能](https://qiita.com/maixhashi/items/5da649e290ec13e71465#%E3%83%95%E3%83%AD%E3%83%B
【Laravel × React】業務フローを明瞭に!ポートフォリオMATRIXFLOWを作成しました
### はじめに
初めまして、はしと申します。
現在、とあるスタートアップのバックオフィス部署で働いており、
バックエンドエンジニアを志して転職活動中です。この度、ポートフォリオ「[MATRIXFLOW](https://matrixflow-d2987557bad9.herokuapp.com/)」をリリースしましたので、投稿いたします!
https://matrixflow-d2987557bad9.herokuapp.com/
バックオフィス部署で働いていてきた経験から、
いわゆる「バックオフィス部署のつらみ」に着目してこのポートフォリオを作成いたしました。#### バックオフィスのつらみ??
私のバックオフィス部署で経験したつらみは
「いざ上場準備!📢」「いざシステム導入!📢」「いざ業務改善!📢」という様々なフェーズ
に関わる際に「今の業務フローって結局どうなっているんだっけ?🤔」となるシーンです。このとき困るのが業務フローを変更・改善を加えたことによって
現状の業務フローが不明瞭になったり、再度整理する必要が出てくるため
定常業務に加えて、業務フローの整理もし
Composer.phar で GitHub の Repository を require したい
# やりたいこと
以下のように GitHub の Repository を composer で使いたい
“`bash
./composer.phar r github/repository
“`# どうすれば
`composer.json` を編集すればいけた
“`composer.json
{
…
“repository”: [
// ここから
{
“type”: “git”,
“url”: “git@github.com:github/repository.git”
}
// ここまでを追加
],
…
}
“`:::note info
編集後、実行時に Token を求められたら GitHub の Developer Settings から Generate Token しましょう
:::# 参考
https://qiita.com/mokemokechicken/items/d3a3944bfa999c2582b7コマンドでのやり方もある↓
https://qiita.c
FuelPHPの例外エイリアスがキャッチできない理由を探る
以下に清書した記事をお送りします。
—
## FuelPHPのAutoloaderとエイリアスの例外キャッチに関する検証
FuelPHPでエイリアスによる例外キャッチの動作について気になる点があったため、検証を行いました。弊社ではFuelPHPフレームワークを使用しており、404エラーなどに`HttpNotFoundException`を利用しています。この例外は`Fuel\Core\HttpNotFoundException`のエイリアスとして定義されているはずですが、`Fuel\Core\HttpNotFoundException`を投げた場合に`HttpNotFoundException`でキャッチできないケースが発生しました。これを踏まえ、具体的に調査を行いました。
### 検証環境
本検証はPHP8.0の環境で実施しました。
“`bash
$ php -v
PHP 8.0.30 (cli) (built: Apr 10 2024 07:34:47) ( NTS gcc x86_64 )
“`### 検証内容
エイリアスとオリジナルの例外がどのようにキ
PHPのエイリアスと例外処理の関係を検証してみた
## PHPのエイリアスと例外の関係について
PHPでエイリアスを利用する際、エイリアス元と同じように例外をキャッチできるかどうか気になったので、実際に検証してみました。今回の検証はPHP 8.0を前提に行っています。
### 環境情報
“`bash
$ php -v
PHP 8.0.30 (cli) (built: Apr 10 2024 07:34:47) ( NTS gcc x86_64 )
Copyright (c) The PHP Group
Zend Engine v4.0.30, Copyright (c) Zend Technologies
“`### サンプルコード
次のコードで、エイリアスと例外の関係を検証します。
“`php
【PHP】無名関数について
# 初めに
前略、無名関数についてよく分かっていなかったので調べました。# 参考
公式ドキュメントhttps://www.php.net/manual/ja/class.closure.php
# 無名関数とは
無名関数とは、関数名を指定せずに関数を作ることができる機能です。
作った関数は変数に代入したり、コールバック関数として使うことができます。“`php: 無名関数の例
// $testに無名関数を代入
$test = function() {
echo “Hello PHP!”;
};// 代入した無名関数を呼び出す
$test(); // Hello PHP!
“`# 無名関数を試してみる
ということで、いろいろ試してみます。## 引数の渡し方
無名関数で使う値を引数の渡し方は2種類あります。### 1. 変数を引数で値を渡す
無名関数の呼び出し時に引数を渡す方法です。
動的な値の受け渡しに適しています。
“`php: 無名関数呼び出し時、通常の引数を渡すことができる
// 引数を渡すことができる
$test = function
Laravelのchunkメソッドで全レコードが更新されなかった話
:::note
## 概要
chunkは一度にクエリの結果の小さな塊(チャンク)を取得し、各チャンクをクロージャーに送り込んで処理します。
注意点としてはチャンクのクロージャー内でレコードの更新や削除を行う場合、主キーや外部キーの変更がチャンクのクエリ結果に影響する可能性があります。
:::# chunkとは 💡
[公式 doc](https://laravel.com/docs/11.x/queries#chunking-results)
chunkメソッドは、一度にクエリの結果の小さな塊(チャンク)を取得し、各チャンクをクロージャーに送り込んで処理します。
何千ものデータベース・レコードを扱う必要がある場合に有効です。例)usersテーブル全体を一度に100レコードのチャンクで取得
“`php
use Illuminate\Support\Collection;
use Illuminate\Support\Facades\DB;DB::table(‘users’)->orderBy(‘id’)->chunk(100, function (Collection