PHP関連のことを調べてみた

PHP関連のことを調べてみた

Laravelにおけるデータ取得のリファクタリング〜実体験を添えて〜

:::note info
これは [フェンリル デザインとテクノロジー Advent Calendar 2023](https://adventar.org/calendars/9360) 21日目の記事です
:::

## はじめに
今年新卒で入社して、主にバックエンドを担当しているせーと申します。
入社してからあっという間に8ヶ月が経過し、アドベントカレンダーの季節がやってきました。ハヤイ。
当記事では、私が入社後初のプロジェクトで意識したデータ取得方法について共有します。

## TL; DR
– N+1問題を引き起こさないように
– Eager Loadingを利用する
– selectメソッドで取得するカラムを制限し、メモリを節約する

## 何が起こったか
初めてプロジェクトにアサインされ、Laravel10・MySQL8という環境でコーディングをしていました。
ローカルで開発していたときはデータ数が少なかったので、何事もなくコードを書いていました。
しかし、開発環境にデプロイして数万のデータが入った途端、APIの取得に10秒ほどかかってしまう状況になってしまいました。

元記事を表示

unset()の注意点

## はじめに
私は株式会社qnoteにて、勉強会の幹事を務めております。
2023年度勉強会の珠玉のネタを2023Qiitaアドベントカレンダーに投稿していこうと思います。

## 対象者
この記事は下記のような人を対象にしています。

– 駆け出しエンジニア
– プログラミング初学者

## 結論
unset()の引数として、配列/連想配列の存在しないインデックスorキーを指定してもエラー出ないので要注意!

## 解説
ループ分の中でunset()を利用している場合、存在しないキーを指定するものの、エラーが出ず、処理が先に進んでしまうケースがあります。
別途、「配列内にキーが存在するかどうか」を判定する記述を入れる必要上がるかどうか、検討したほうがよさそうです。

### 配列の場合

“`php
$array = [1,2,3];
unset($array[3]);
print_r($array);

// 出力
Array
(
[0] => 1
[1] => 2
[2] => 3
)
“`

### 連想配列の場合
“`php
$

元記事を表示

ZendFramework1 future の Zend_Db_Adapter_Db2#limitメソッド

[ZendFramework1 future](https://github.com/Shardj/zf1-future) は **PHP8.1** コンパチで動作する、ありがたいライブラリ。(※8.1 も 2024/11/25 で [セキュリティサポート](https://qiita.com/bezeklik/items/72d1ff8393f66673e2bc) が来てしまいますが…)
過去の資産を使い、未だに多くの **IBMi** ユーザーが PHP 開発で、**ZF1** を使用しており、PHPのバージョンアップでは、非常に助かっている。
しかし、旧ZF1時代から、`Zend_Db_Adapter_Db2#limitメソッド` に問題があり(※DB2 LUW 試していないのでわかりません)我々が `IBMi` で使用する際には、一工夫が必要。

## 参考リンク
– [repo – Shardj/zf1-future](https://github.com/Shardj/zf1-future)
– [issue – Zend_Db_Adapter_Db2 limit do

元記事を表示

ファイルを探すよ、”Finder”

[Symfony Component Advent Calendar 2023](https://qiita.com/advent-calendar/2023/symfony-component)の21日目の記事です。

## ファイルを探すよ、”Finder”

[Finder](https://symfony.com/doc/current/components/finder.html)は、ファイルやディレクトリを探すコンポーネントです。Symfony以外でも使えます。

### インストール

“`shell
composer require symfony/finder
“`

### 使い方

“`php
use Symfony\Component\Finder\Finder;

$finder = new Finder();

// /var/www/html/assets/内の*.jsを探す
$finder->files()->in(‘/var/www/html/assets’)->name(“*.js”);

// 探した結果があるか確かめる
if ($find

元記事を表示

PHP: Symfony Mailer の使い方

こちらと同じことを、Symfony Mailer で行いました。
[PHP: Swift Mailer の使い方](https://qiita.com/ekzemplaro/items/16d3bc53fbf57f352b72)

## ライブラリーのインストール

“`bash
composer require symfony/mailer
“`

## プログラム

ツリー構造

“`text
$ tree -L 2
.
├── composer.json
├── composer.lock
├── symfonymailer.php
└── vendor
├── autoload.php
├── composer
├── doctrine
├── egulias
├── psr
└── symfony
“`

“`php:symfonymailer.php

元記事を表示

PHP: Swift Mailer の使い方

## ライブラリーのインストール

“`bash
composer require swiftmailer/swiftmailer
“`

次の警告が出ますが、使えます。

“`text
Package swiftmailer/swiftmailer is abandoned, you should avoid using it. Use symfony/mailer instead.
“`

## プログラム

ツリー構造

“`text
$ tree -L 2
.
├── composer.json
├── composer.lock
├── swiftmailer.php
└── vendor
├── autoload.php
├── composer
├── doctrine
├── egulias
├── swiftmailer
└── symfony
“`

“`php:swiftmailer.php

元記事を表示

E2Eテストをより簡単に?!〜Playwrightってなんですか?~

## はじめに
こんばんわ。今日はEC-CUBEアドベントカレンダーの20日目です。
アドベントカレンダーというものに初めて参加するため、何書いたらいいのか先輩方のを参考に悩んでました。
いろいろ考えてたら何やら、E2Eテストについての声が聞こえて来ました。
Playwrightというのがあるらしい。

## 気になった経緯
一番気になっている理由は、非同期処理に強いことです。
現在のE2Eテストはcodeceptionで書かれているのですが、不安定なことがあります。
ページの要素が見つからないという理由で落ちている事が多く、再実行したらクリアするという謎現象。。。
テストコードを見ていると、Sleep関数がいくつかあります。

上記から、非同期処理に強いPlaywrightが気になりました。
(ちなみにTypeScriptはよくわからないので、雰囲気で書きます。:v:)

## Playwrightについて
Microsoftさんが主体となって開発しているツールです。
一時期、GitHubのトレンドにもなりました。

機能について、ざっとまとめると以下になります。
– 対象ブラウザ

元記事を表示

ペネトレーションテスト

今回は私達が昨年度作ったSNSサイトにvpn上で攻撃を仕掛けそのパケットを遮断するWAFを作るという事で素人ながらペネトレーションテストをやってみる

今回使うソースコード
https://github.com/21c1100017/WELP
※xammppで動かす場合はドキュメントルートの設定を変えてください

ローカル環境で動かす人用
データーベース情報
# データーベース情報

| データーベース名 | welp |
| — | — |
| ユーザー名 | welp_admin |
| パスワード | welp_admin |

# 以下SQL文
“`SQL:welp.sql

SET SQL_MODE = “NO_AUTO_VALUE_ON_ZERO”;
START TRANSACTION;
SET time_zone = “+09:00”;

/*!40101 SET @OLD_CHARACTER_SET_CLIENT=@@CHARACTER_SET_CLIENT */;
/*!40101 SET @OLD_CHARACTER_SET_RESULTS=@@CHARA

元記事を表示

Laravel SailをPHP 8.3でインストールする

別の記事を書く目的で新しいLaravelプロジェクトをインストールしようとしたときに、どうせならPHP 8.3を使ってみようと思ったものの、環境構築で一瞬悩んだので備忘録。

# 新規Laravelプロジェクトダウンロード & インストール

公式ドキュメントの通りインストールしてみます。

“`sh
curl -s https://laravel.build/php83-laravel | bash
“`

https://laravel.com/docs/10.x/installation#sail-on-windows

たちあげてバージョンを確認してみると・・・8.2ですね。

“`sh
# Laravelのプロジェクトディレクトリに移動
cd php83-laravel

# コンテナ立ち上げ
./vendor/bin/sail up -d

# コンテナ名確認
docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS

元記事を表示

オプション設定をシンプルに、”OptionsResolver”

[Symfony Component Advent Calendar 2023](https://qiita.com/advent-calendar/2023/symfony-component)の20日目の記事です。

## オブジェクトのプロパティ設定をシンプルに、”OptionsResolver”

[OptionsResolver](https://symfony.com/doc/current/components/options_resolver.html)は、配列でオプションの値を管理している際に、デフォルト値をシンプルに定義するレゾルバを提供します。

### インストール

“`shell
composer require symfony/options-resolver
“`

### 使い方

通常、配列でオプションの値を管理して、メソッドで値を設定できるようにするには、ちょっとめんどくさいことをしなければいけません。

“`php
class SomeService;
{
private array $options;

publi

元記事を表示

PHP ぼやき日記 2023-12-19

– [前回](https://qiita.com/sj-i/items/bda185bfd574d3cbb89d)

不定期に誰に向けるでもなく PHP に関する雑な殴り書きをしている。日付が変わってから変わる前の日付の奴だと言い張って投稿するくらいの雑さ加減。

# Reli 0.11.0 をリリースした
– https://github.com/reliforp/reli-prof/releases/tag/0.11.0
– PHP の `memory_limit` 超過で `Allowed memory size of 〜 bytes exhausted` が出た時にメモリ内容の内訳を吐ける奴
– [メモリ解析機能のドキュメント](https://github.com/reliforp/reli-prof/blob/0.11.0/docs/memory-profiler.md) をわりと充実させたりした

# OSS で `memory_limit` 超過の issue を見つけては[急にメモリ計測をとって去っていく PHP 界の妖怪](https://twitter.com/s

元記事を表示

phpのfile_get_contentsを利用して、APIを実行しようとしたら403が帰ってきた

## 現象が発生した背景
業務にて利用をしていたAPIの仕様が変化したようで、極力ソースコードをいじらないよう進めようとしたら、403エラーが発生した

## 確認内容
Postman・Curlにては正常に動くけど何故か、PHPのfile_get_contentsにて処理実行時は403が発生した

## 修正内容など
file_get_contentsではなく、curl_execにする事により200が返ってきて正常に動作するようになった

## 補足
リクエスト時のヘッダー・レスポンスなどからAWSにてAPIサーバーを立てていることまでは理解できた
余裕があれば自信で環境構築して原因について追求してゆきたい

元記事を表示

LaravelでJobとQueueを触ってみる

## はじめに
:::note info
1年前にJobを使用する際、動かしながら残していた実装メモを投下させていただきます。
情報が古かったり、間違いがあればご指摘いただければ幸いです。
:::

使用言語:Laravel(8.X)

### ①jobをスタックする為のテーブルを作成する。
【コマンド】
“`ter
php artisan queue:table
“`
– ジョブをキューに保持するテーブルを作成する為のmigrationファイルを作成。
– [App\Jobs;] 配下にjobのClassも一緒に作成される。
※実行順序は、先入れ先出し方。

【コマンド】
“`terminal
[php artisan queue:failed-table]
“`
– 失敗ジョブを登録するテーブルを作成する為のmigrationファイルを作成。

【作成されるmigrationファイル】
“`php

元記事を表示

捕まえたWebシェルを調べてみる

# はじめに
以前作成した資料を探すためにサーバのバックアップを漁っていたら、過去に捕まえたWebシェルが出てきたので記事を書いてみることにした。確か2018年ごろにハニーポット的なやつで捕まえたファイルだけど、当時は簡単な調査をして終わりにしていた記憶しかない。

夏頃に書き始めてすぐ公開するつもりだったが、後回しにし続けてしまったので、アドベントカレンダーを機に完成させることにした。記事自体はWebシェルの内容を説明するだけとなる。

# 捕まえたファイル
POSTリクエストを残していなかったので詳細は確認できないが、どうもWordPressのプラグイン **Slider Revolution** に存在していた脆弱性を利用して設置する攻撃だった様子。

https://wpscan.com/vulnerability/e8a8e1c6-2c43-487a-9f11-6abd5ce6d82d

脆弱性を利用することでプラグインをインストールするように見せかけ、任意のzipファイルを展開することができる仕組みとなっている。
https://github.com/rapid7/meta

元記事を表示

AWS Distro for OpenTelemetry で Laravel から AWS X-ray に trace を送ってみる

この記事は、AWS Containers Advent Calendar 2023 の 19 日目 (12/19) のエントリーです。

PHP のフレームワーク Laravel で、ADOT (AWS Distro for OpenTelemetry) を利用した trace の送信を試した備忘録です。
正直、設定の書き方がわかっていないので、正しい書き方などのツッコミをお待ちしております。

[AWS Distro for OpenTelemetry](https://aws-otel.github.io/) とは、OpenTelemetry プロジェクトの AWS がサポートするディストリビューションです。

各言語ごとの対応状況は以下にあります。
https://opentelemetry.io/docs/instrumentation/#status-and-releases
PHP が trace に対応しているため、PHP Laravel を利用して trace の送信を試してみます。

基本的には[こちらの手順](https://opentelemetry.io/doc

元記事を表示

現在時刻が関わるアプリケーションの複雑性に立ち向かうにはどうすれば良いか?(PHP)

答え

![現在時刻なし.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3604824/b5200db1-77da-86e0-464d-c0e818a60905.png)

## 参考
– 現在時刻が関わるユニットテストから、テスト容易性設計を学ぶ
– https://t-wada.hatenablog.jp/entry/design-for-testability
– 時計オブジェクト(ドメインクロック)を導入してテスト容易性と意図性を高める
– https://phpmentors.jp/post/46982737824
– PSR-20: Clock
– https://www.php-fig.org/psr/psr-20/
– PSR-20 Meta Document
– https://www.php-fig.org/psr/psr-20/meta/
– 『単体テストの考え方/使い方』
– https://book.mynavi.jp/ec/produ

元記事を表示

Goで書かれたPHPアプリケーションサーバーのFrankenPHPを触ってみた

![スクリーンショット 2023-12-19 0.43.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/765794/3317b5d1-125c-60b4-9637-e522a76e57a4.png)
Goで書かれたPHPアプリケーションサーバーである[FrankenPHP](https://frankenphp.dev/)を触ってみました。
2023/12/11にバージョン1.0.0がリリースされたPHPアプリケーションサーバーです。やっと触れました。

https://frankenphp.dev/

## FrankenPHPとは
[公式](https://frankenphp.dev/docs/)より
> FrankenPHP is a modern application server for PHP built on top of the Caddy web server.

*FrankenPHPは、Caddy Webサーバー(※1)の上に構築されたPHP用のモダンなアプリケーションサ

元記事を表示

[Laravel]脱FatController

## はじめに
こんにちは。この記事は[ラクス Advent Calender 2023](https://qiita.com/advent-calendar/2023/rakus-partners) 19日目の記事です。
エンジニア歴1年で、現在はPHPのLaravelを使用して個人開発を行っています。
今までは何もわからず全てのコードをControllerに書いており、いわゆる典型的なFatControllerで修正のしにくいコードでした。
そこで、SkinnyControllerを目指すことにしました。

## FatControllerとは
文字通り太った(記述量が多い)Controllerのことを指します。
Controllerはただ一つの責任だけを持たないといけないのに、複数の責任を持ってしまっている状態です。

これの何が問題なのかというと、「コードの可読性が落ちる」ことです。
コードが長すぎると、どこに処理を書いたのかがわからなくなります。
また、同じ処理を至る所で書いている場合が多く、改修漏れが生じやすくなってしまいます。
以下が今まで書いていたFatControl

元記事を表示

学校向けWEBアプリのプロジェクトを立ち上げてみた

:::note info
[Qiita全国学生対抗戦 Advent Calendar 2023](https://qiita.com/advent-calendar/2023/student)の19日目の記事です。
:::

## はじめに

こんにちは。ご覧いただきありがとうございます。
前振りもなく突然ですが,今回は友人と行っているプロジェクトについてご紹介したいと思います。
有益な技術的要素は含まれませんが,最後までご覧いただけますと幸いです。

## プロジェクトの概要

昨今,学校現場はブラックと言われています。
日々の業務が多忙を極め,定時出勤・退勤が難しいのが現状です。
しかしながら,昔に比べ業務の効率化は進んだものの,依然としてIT化はほとんど進んでいないと言っても過言ではありません。(コロナ禍でスクールGIGAは進みましたが)

### 現状の問題点

例えば,日々の業務の1つである時間割作成はおそらく多くの学校がExcelを用いて作成しています。
時数の計算はさすがに電卓ではなく,Excel関数を用いていると考えられますが,年間1000時間を超える授業をクラス別に集

元記事を表示

MIMEを扱うよ、”Mime”

[Symfony Component Advent Calendar 2023](https://qiita.com/advent-calendar/2023/symfony-component)の19日目の記事です。

## MIMEを扱うよ、”Mime”

[Mime](https://symfony.com/doc/current/components/mime.html)は、MIMEを扱うためのコンポーネントです。

### インストール

“`shell
composer require symfony/mime
“`

### 使い方 その1

“`php
use Symfony\Component\Mime\Email;

$email = new Email();
$email
->from(‘info@qiita.com’)
->to(‘test@qiita.com’)
->subject(‘テストメール’)
->priority(Email::PRIORITY_HIGH)
->attachFromPath(‘/var/

元記事を表示

OTHERカテゴリの最新記事