🥇

「Laravelのデッドロック対策、あなたの現場ではどうしてる?」~【php】今週の人気記事TOP5(2025/10/26)

に公開

【2025/10/26】「Laravelのデッドロック対策、あなたの現場ではどうしてる?」今週の人気記事TOP5(2025/10/26)

Shardを横断してクエリを実行するツールを作った話

フルスタックエンジニアのTom Higuchi氏が、シャーディングされたMySQL環境で横断検索を効率化するツールを開発。ソーシャルゲーム運用時の課題から着想し、Adminerにない機能を実装した。PHP7.0, MySQL5.7対応、クラスター設定、更新クエリ制限、複数クエリ同時実行、CSV/XLSX出力、シャード一覧機能などを搭載。フロントエンドはjQuery, Bootstrap, AG Grid等を使用。開発にはClaude Desktop MCPを活用し、画面レイアウト作成を効率化。大規模DB以外でも、分散環境での利用に可能性を見出している。

v-cloakで“既読判定が終わるまで完全非表示”にするモーダル実装(Vue 3 + TS + Laravel Blade + Vite)

Vue 3 + TypeScript、Laravel Blade、Viteを用いたモーダル実装に関する記事です。リロード時のチラつきを解消するため、v-cloakで既読判定完了までモーダルを非表示にします。v-showで表示を切り替え、localStorageで既読/未読を管理。SCSSでレスポンシブ対応と中央寄せを実現し、TypeScriptでスクロール抑止やキー操作を実装しています。@include@viteでBladeテンプレートに組み込みます。

[Laravel] 他システムとのデッドロック発生時の対応メモ

自システムと他システム間で発生したデッドロックの対応事例。原因は、自システムでのモデルA作成後のイベント処理における更新と、他システムからのモデルA更新が競合したこと。

暫定対応: Laravelのトランザクションリトライ機能を活用し、DB::transaction(function () { ... }, 2);で一時的にエラーを抑制。

恒久対応: 自システムでのモデルA更新処理で、Sロック取得後にXロックを取得していたのを、最初からXロック(ModelA::lockForUpdate())を取得するように変更。これにより、他システムからの更新処理を待機させ、デッドロックを根本的に解消。

配列の基本 [PHP入門]

この記事は、PHPにおける配列の基本的な概念と操作方法を解説しています。配列は複数のデータを1つの変数で管理する仕組みで、要素と添字を持ちます。宣言、要素の追加・参照・上書きといった基本的な操作に加え、unset()による削除は非推奨であること、代わりに配列の再構築を推奨しています。記事では、具体例としてメンバー管理の配列を実装し、配列の柔軟性を示しています。

PHP AST(Abstract Syntax Tree)入門

PHPのコードを構造的なツリーとして表現するAST(Abstract Syntax Tree)について解説。PHPにはZend ASTとnikic/php-parser ASTの2種類が存在し、学習には後者が推奨される。nikic/php-parser ASTはPhpParser\Nodeを継承し、Stmt(文)とExpr(式)に大別される。composer require nikic/php-parserでインストール後、パーサーでコードを解析し、NodeVisitorでASTを走査することで構造を確認できる。StmtとExprの区別、Node名の理解、ダンプによる可視化が学習の軸となる。

【2025/10/19】「Laravel、マイグレーション、静的解析…置いていかれてない?」今週の人気記事TOP5(2025/10/19)

Laravelのマイグレーション機能をちゃんと知る

Laravelのマイグレーション機能は、PHPコードでDBのテーブル定義変更を管理する仕組みです。マイグレーションファイルを作成し、DDLを記述して実行します。Eloquentとは異なり、DDL(テーブル定義)を操作対象とします。

ファイルの生成はphp artisan make:migrationコマンドで行い、--table--createオプション、命名規則で初期コードを調整可能。upメソッドにDDL、downメソッドにその取り消しを記述します。

php artisan migrateで未実行のマイグレーションが実行され、migrationsテーブルで管理。バッチとステップの概念があり、ロールバックやリフレッシュも可能です。

PHPカンファレンス広島2025に参加しました

PHPカンファレンス広島2025に参加した記録。DBリファクタリング、PHPバージョンアップの重要性、静的解析の復習、PHP8.5の新機能(パイプ演算子)、技術的負債の捉え方、コンピュータアーキテクチャの再認識、AI生成コードとの向き合い方など多岐にわたるセッションから学びを得た。特に、DB設計、脆弱性対策、静的解析、PHP最新機能、技術的負債の活用、低レイヤーの理解、AIコードの客観視などが印象的だった。

Laravel版のAPI PlatformでSystem ProviderやSystem Processorをデコレートするのが難しかった話

Laravel版API PlatformでSystem Processorをデコレートする際、循環依存が発生。原因はAPI Platformの内部構造で、ProcessorInterface実装クラスにタグ付けされ、CallableProcessorの依存に含まれるため。

解決策として、SkipAutoconfigure属性を定義し、デコレーターに付与することで、自動構成から除外するPRを提案。現状の実装ではSystem Processorのデコレートが想定されておらず、改善が必要。

Laravelで大量のリクエストパラメータを送るときにFormRequestはやめたほうがいい話

Laravelで大量の配列パラメータをFormRequestで検証すると、アスタリスク指定 (key.*.value) のバリデーション処理が遅くなる問題が発生。原因は計算量がn^nになるため。

対策として、Respect\Validation\Validatorライブラリを導入し、ループ処理で個別に検証することで大幅な速度改善を実現。エラー発生箇所の特定も可能。既存のFormRequestからの移行は生成AIで効率化できる。

PHPのempty()が__getだけでは正しく動作しない理由

PHPで__getマジックメソッドを実装したクラスに対しempty()を使用すると、プロパティが存在してもtrueを返すことがある。これはempty()が内部的に__isset()を呼び出し、未定義の場合プロパティが存在しないと判断されるため。解決策として、__isset()も実装し、プロパティの存在を正しく判定させる必要がある。PHP8.1以降であれば、public readonlyプロパティの利用も検討できる。

【2025/10/12】「Laravel開発、ボトルネックはどこ?最適化、試してみる?」今週の人気記事TOP5(2025/10/12)

Laravelで知ってると差がつくEloquentとQuery Builder(+おまけで現場Tipsも)

LaravelにおけるEloquent、Query Builder、Collectionの使い分けに関する記事です。Query Builderは複雑なJOINや集計、バルク処理、生SQL実行に強く、Eloquentはモデルイベント、リレーション、アクセサ/ミューテータなどオブジェクト指向的なDB操作に向いています。Collectionは取得後のデータ整形に利用しますがSQLは発行しません。現場で役立つSQL確認、条件グルーピング、遅延ロード検知、hydrate()などのTipsや、モデルイベント、tap()の活用例も紹介されています。各層の役割を理解することで、より効率的な開発とチューニングが可能になります。

[php] Slim4 を完全に理解したい

この記事は、PHPマイクロフレームワークSlim4のライフサイクルを詳細に解説しています。

Slimの初期化では、PSR-17準拠のAppFactoryでAppインスタンスが生成され、依存関係が設定されます。ルーティング登録では、AppがRouteCollectorProxyとして機能し、Middlewareも追加可能です。

リクエスト処理は、PSR-7準拠のServerRequestを作成し、MiddlewareDispatcherで処理されます。RouteRunnerがルーティングを実行し、nikic/FastRouteを用いてハンドラを特定します。最終的に、ResponseEmitterがレスポンスを送信し、HTTPヘッダーとボディを出力します。

Laravel12でmake:configコマンドがしれっと追加された

Laravel 12.26.4でmake:config Artisanコマンドが追加されました。これはconfigディレクトリに設定ファイルを作成するもので、php artisan make:config <ファイル名>で使用します。過去にLaravel 6と9で提案されたものの却下され、Laravel 12でようやく実装されました。コマンド自体は単純ですが、設定ファイルの確実な作成に役立ち、生成AIと組み合わせることで開発体験向上の可能性があります。

PHP 5.6で運用していたWordPressを段階的にアップデートしたメモ

PHP 5.6で動作していたWordPressをPHP 8.4へ段階的にアップデートした事例。Dockerを用いてPHP 5.6 + MySQL 5.7環境を構築し、DBをリストア。WordPressを段階的にバージョンアップ(6.2→最新)後、PHP 7.2, 8.4 + MySQL 8.0へ移行。運用環境への反映では、All-in-One WP Migrationでデータを移行。MySQL 8.0のcomment_dateエラーをCURRENT_TIMESTAMPで回避し、最新版WordPressの動作に成功。プラグインの状況がバージョンアップの難易度に影響することに言及。

「AI任せ」にしないパフォーマンス最適化:開発者こそ知るべき計算量の知識

AIが生成するコードは非効率な場合があるため、開発者は計算量(O記法)の知識を持つべき。特にPHP(Laravel)では、ネストループによるO(n²)やN+1クエリ問題に注意。keyBy()等で連想配列化、Eager LoadingでN+1問題を回避し、O(n)やO(1)の処理を目指す。データ量増加時の性能劣化を防ぐため、開発者は計算量を意識したコードレビューが必要。AIによるパフォーマンス分析も有効。

【2025/10/5】「Laravel周辺技術、暗号化…置いていかれてない?」今週の人気記事TOP5(2025/10/05)

【Laravel】ZiggyからWayfinderに移行した理由と手順

この記事では、Laravelのルーティング情報をフロントエンドで扱うZiggyからWayfinderへの移行について解説しています。WayfinderはLaravel公式のパッケージで、セキュリティ(不要なルート情報の露出を防ぐ)、パフォーマンス(必要なルートのみをバンドル)、開発体験(TypeScriptネイティブサポート)の向上に貢献します。移行手順は、Wayfinderのインストール、Vite設定の変更、フロントエンドコードの書き換え、Ziggyの削除です。プロジェクトへの早期導入で将来的な移行コストを抑えられる可能性があります。

Webシステムのデータ暗号化を調べてみた【OpenSSL】

Webシステムのデータ暗号化について、OpenSSLを用いた実装をPHP, Laravel, Ruby, Railsで解説。暗号化は双方向、ハッシュ化は一方向。OpenSSLは暗号化・復号、証明書生成等を提供するOSSライブラリで、多くの言語でラッパーが提供されている。暗号化にはキーと初期ベクトル(IV)を使用。RailsではActiveRecordでモデル側の暗号化も可能。システム全体視点では、暗号化処理は抽象化されており、プログラマは要件を満たす実装に注力すべき。

CakePHPのAuthComponentからAuthenticationへの移行

CakePHP 2系のAuthComponentから5系のAuthenticationへの移行について。AuthComponentは5系で削除され、AuthenticationとAuthorizationプラグインへの移行が必要。公式ドキュメントのマイグレーションガイドに従えば比較的容易に移行可能。特に、パスワードハッシュ方式の変更は、Authenticationプラグインが提供するFallback Hasherを使用することで、bcryptとsha1の併用を実現し、既存ユーザーへの認証を維持できる。

wordpress用cliコマンド「WP-CLI」が結構便利

WP-CLIはWordPressのDB操作やプラグイン管理をCLIから行うツールであり、ドメイン変更作業を効率化できる。wp db searchでDB内を検索、wp db queryでクエリ実行が可能。特にwp search-replaceはドメイン変更に有効で、--all-tablesオプションでプラグインのテーブルも置換できる。ただし、--skip-columnsでguid等の特定カラムは除外する必要がある。プラグイン操作ではwp plugin listで一覧表示、wp plugin activate/deactivateで有効/無効を切り替えられる。

Carbon使用時の注意点

LaravelのCarbonライブラリで日時操作を行う際、addHours()などのメソッドは元のCarbonオブジェクトを直接変更(破壊的操作)するため、意図しない結果になる可能性がある。
元のオブジェクトを保持したい場合は、Carbonの代わりにCarbonImmutableを使用することで、新しいインスタンスが生成され、元のオブジェクトが変更されるのを防ぐことができる。日時処理では安易なCarbon利用を避け、破壊的操作に注意すべきである。

CareNet Engineers

Discussion