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

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

【Golang, PHP】PDFスライド画像変換&S3保存処理のパフォーマンス改善

大学の学部四年生でエンジニアをしている者です。
普段は業務委託でバックエンド開発をメインに行っています。
今回はPHPのプロダクト内で起きていた問題解消にGolangの機能(Go routine, channel)を使用して解消をしました。
その概要をまとめます。
コード自体はプロダクトに反映してしまったので載せるのは控えます。

## プロダクト使用技術
– AWS EC2 (t3.medium)
– AWS S3
– PHP (Laravel)
– poppler-utils (pdftoppmコマンド) ⇒ PDFの画像変換処理で使用
– Golang ⇒ 改善のために使用

## 開発機能詳細

ピッチ資料を生成する機能です。

https://www.hear.co.jp/recruit/saiyoupitch-100sen

機能の内部処理の流れとしては以下の通りです。(AS IS)
1️⃣ **ユーザーはPDFファイルをアップロード**
2️⃣ **アップロードされたファイルをローカルのディスクに一時保存**
3️⃣ **ローカルディスクに保存されているPDFスライドを画

元記事を表示

PhpModbus を使う

[PhpModbus](https://code.google.com/archive/p/phpmodbus/)

https://code.google.com/archive/p/phpmodbus/

PHPからModbusをアクセスする場合に便利なPhpModbusですが、2013年7月以後、エンハンスがされていない様子。まあ枯れた分野なので、ユーザ・サイドからしてもエンハンスしていただく必要はありません。
ただし、最終リリース版 0.8.r106 でも、そのままでは現在のPHPバージョンでは動きません。クラス ModbusMaster だけを使う限りでは、1ステップだけ修正する必要があります。他のクラスを使ったことはないので、他のクラスではどうなるのかは知りません。
1ステップだけの修正なので、エラーになっても臆せずに修正して使用してみてください。

## なにが問題なのか
最終リリース版 0.8.r106 しか使用したことがありませんが、コンストラクタ名称に起因するエラーが発生します。
PHP4までは当然であった「コンストラクタの名称はクラスの名称と同じ」は、現在のPHP

元記事を表示

シンボリックリンクに悩まされた

Laravelで画像を表示させるところで詰まったのでシンボリックリンクの学習も兼ねて忘備録

シンボリックリンクにハマる人は多いみたいでたくさんの方が記事をあげてくれていて、本当にありがたい。
その足しにでもなれば。

Laravelでは画像を表示させる際に必要なシンボリックリンクというものがある。
[【Laravel】画像を保存して表示する方法](https://inouelog.com/laravel-image-display/)


[【Laravel】”storage/app/public”に配置した画像へアクセスしてみる](https://tektektech.com/laravel-storage-app-public/#google_vignette)



# シンボリックリンクとは
>オペレーティングシステム(OS)のファイルシステムの機能の一つで、特定のファイルやディレクトリを指し示す別のファイルを作成し、それを通じて本体を参照できるようにする仕組み。
[シンボリックリンク 【symbolic link】 ](https

元記事を表示

インターフェイス

## はじめに

インターフェイスについてまとめる

### インターフェイスとは

配下のメソッドが全て実装を期待/強制するメソッドであるクラスのこと。
中身を持つメソッドやプロパティを定義できず、アクセス修飾子の指定もできない。

#### インターフェイスと抽象クラスとの違い

インターフェイスでは多重継承ができる。
抽象クラスでは多重継承はできない。

多重継承が可能なことで、メソッドを目的に応じて様々なインターフェイスに振り分け、サブクラス側では必要なメソッドを含むインターフェイスだけを選択的に継承(正しくは実装)する、ということができる。

#### インターフェイスの役割

インターフェイスの利用者に契約内容を約束し、裏側の実装を隠す。
そして、実装者にはその契約を守ることを求める。

#### 参考コード

`Triangle`クラスで`IFigure`インターフェイスを実装している。

“`php:IFigure.php
interface IFigure
{
function getArea(): float;
}
“`

“`php:Triang

元記事を表示

抽象クラス

## はじめに

抽象メソッド/クラスについてまとめる

### 抽象メソッドとは

サブクラスでオーバーライドされることを期待/強制したメソッド。
また、抽象メソッドを含んだクラスのことを抽象クラスという。

#### 参考コード

抽象メソッドを定義するには、`abstract`修飾子を使う
抽象メソッドはサブクラスで必ずオーバーライドされるべきメソッドなので、スーパークラスの側では中身を持つことはできない。

“`php:Figure.php
abstract class Figure
{
protected float $width;
protected float $height;

public function __construct(float $width, float $height)
{
$this->width = $width;
$this->height = $height;
}

protected abstract function getArea(): float;
}

元記事を表示

ポリモーフィズム

## はじめに

ポリモーフィズムについてまとめる

### ポリモーフィズムとは

同名のメソッドで異なる挙動を実現する。
多態性と訳される。

#### 参考コード

“`php:Figuer.php
class Figure
{
protected float $width;
protected float $height;

public function __construct(float $width, float $height)
{
$this->width = $width;
$this->height = $height;
}

public function getArea(): float
{
return 0;
}
}

“`

“`php:Triangle.php
require_once ‘Figure.php’;

class Triangle extends Figure
{
public function getArea()

元記事を表示

SEO BACKLINKS

https://growskill.net/ Grow Skill is an E-learning Platform to provide quality education throughout the world. We provide SEO, SMM, SEM, and other Digital Marketing related courses.-22

元記事を表示

Laravelでページネーションを試したメモ

## はじめに
https://qiita.com/kenji123/items/a78e85ffc9309fad10bb
Laravelのコレクションに対し、ページネーションの使用を行っています。
今回のケースでは、データベースから直接ページネーションするのは断念し、Laravelのコレクションを使用してデータを処理し、その後でページネーションを適用しました。

## SQL vs コレクションベースのページネーション

通常、データを効率的にページネーションするためには、データベースクエリ自体で`paginate()`メソッドを使用するのが最も効率的です。これにより、必要なデータのみがデータベースから取得され、アプリケーションへの負荷が軽減されます。

しかし、データの加工が必要でクエリだけではページネーションが困難な場合は、データベースから全データを取得してからコレクションを使って加工し、`forPage()` メソッドや `slice()` メソッドなどを用いて手動でページネーションを行うことができます。

## コレクションベースでの対応

ID取得後、ページネーション適用に

元記事を表示

【PHP】マイナーフレームワーク「Flow」を試してみる~テンプレートエンジン編~

# 初めに
Flowでフロントエンドを実装する場合、テンプレートエンジンを用いて動的なHTMLファイルを作成することができます。今回は、Flowのテンプレートエンジンである「Fluid」の基本的な使い方をまとめていきます。

# Flowのテンプレートエンジン”Fluid”

動的ページを作成する場合、Controllerで取得した値を画面に表示したいということがあるかと思います。
Flowでは、Fluidというテンプレートエンジンを利用することで、ControllerからHTMLに値を渡すことができます。

## イメージ

こちらは、あるブログ投稿サービスを例に、投稿した内容が表示されるようなHTMLファイルの例です。
([Flowの公式ドキュメント](https://flowframework.readthedocs.io/en/stable/TheDefinitiveGuide/PartIII/Templating.html#what-does-it-do)から拝借しました)

“`html
{namespace f=Neos\FluidAdaptor\ViewHelpers

元記事を表示

【Laravel】Eloquentで更新をかけるとIllegal offset typeが発生する

# 発生した問題
以下でDBの更新、新規データ登録をしようとすると「Illegal offset type」が発生した。

“` php
public function updateSkillAction($datas,$skillId){
for($i=0; $i< count($datas->action_index); $i++){
if($datas->exist_action_flag[$i] === 1){
SkillAction::where([
‘skill_action_id’=>$datas->skill_id,
‘action_index’=>$datas->action_index[$i]
])->update([
‘skill_action_name’ => “スキルアクション名”,
‘skill

元記事を表示

【Laravel】FormRequestでバリデーション前に入力値を加工

# 環境
Laravel10
Windows11

# 目的
Postmanでform-dataを使用し、Requestを送信。受け取った値を加工したい。

・string型をint型へ変換
・array配列の中身をint型へ変換

# 公式ドキュメント
https://readouble.com/laravel/8.x/ja/validation.html

# prepareForValidation()
prepareForValidation()を使用することで、バリデーション前にデータを加工できる。

“`php:TestRequest.php

protected function prepareForValidation()
{
$this->merge([
‘subject_id’ => (int) $this->subject,
‘class_ids’ => array_map(‘intval’, $this->class_ids),
‘public_scope’ => (bool) $this->public

元記事を表示

コードゴルフ大会開催のために、コードが合っているかを判定する処理を作成する

# はじめに

こんにちは、エンジニアのkeitaMaxです。

今回は仲間内でコードゴルフ大会を開催しようと思い、そのために書いたコードがあっているかどうかを判定する処理を書こうと思います。

今回はPHPで実施する予定で、コードを送信するフロンタ側はNext.js、判定する処理を作成するAPI側はLaravelで書く予定です。

# コードゴルフとは

>コードゴルフはコンピュータプログラミング・コンテストの一種。参加者は与えられたアルゴリズムを、可能な限りもっとも短いソースコードで記述することを競う[1]。バイナリサイズではなく、ソースコードの文字数がスコアとなる。「Perl golf」など、トーナメントで使用されるプログラミング言語の名前がつけられることもある。ショートコーディング、コードパズル等とも呼ばれる[2]。
(引用:https://ja.wikipedia.org/wiki/%E3%82%B3%E3%83%BC%E3%83%89%E3%82%B4%E3%83%AB%E3%83%95)

Wikipediaでは上記のように書かれています。

あるお題に対して、どれだけ短

元記事を表示

AWS-SDK-PHP で Header value cannot be represented using ISO-8859-1. エラーの解決方法

## きっかけ

S3 の署名付 URL を使用してオブジェクトをダウンロードする際、response-content-disposition の filename が日本語だと、タイトルに記載されているエラーが発生していました。

自己解決の過程で、ファイルダウンロード周りの使用や文字コード周りの知見を増やすことができたので、備忘録的に記事にまとめたいと思います。

## エラー発生時の実装

下記のような実装でした。

“`php
‘ResponseContentDisposition’ => ‘attachment; filename=’ . $fileName
“`

## 解決後の実装

以下のような実装にすることで日本語のままダウンロードすることができました。

“`php
$fileNameEncoded = urlencode($fileName);

$cmd = $this->inner->getCommand(‘GetObject’, [
// ~中略~
‘ResponseContentDisposition’ => “attachment; fi

元記事を表示

継承/オーバーライドの禁止

## はじめに

継承/オーバーライドの禁止についてまとめる

### なぜ継承/オーバーライドを禁止するのか

継承可能なクラスには、実装/修正する際に派生クラスへの影響を考慮しなければならず、派生クラスの間でも、どのクラス/メソッドなら安全に継承/オーバーライドできるかを判別しなければならない。
このような問題を考えると、無制限に継承/オーバーライドを認めるのは避けるべきで、設計時点で継承/オーバーライドを想定していないならば、禁止してしまった方が良い。

### final修飾子

継承/オーバーライドを禁止する

#### 参考コード1

`BusinessPerson`クラスの`work`メソッドをオーバーライド禁止にしている。

“`php:Person.php
class Person
{
public $firstName;
public $lastName;

public function __construct($firstName, $lastName)
{
$this->firstName = $firstNa

元記事を表示

委譲

## はじめに

委譲についてまとめる

### 委譲とは

再利用したい機能を持つオブジェクトを、現在のクラスのプロパティとして取り込む。
継承は`is-a`の関係であるが、委譲は`has-a`の関係であると言える。

#### 参考コード1

`file`プロパティに`SqlFileObject`オブジェクトを保持(has)し、必要に応じてそこから既成のメソッドを利用する。

“`php:delegate_basic.php
class fileLogger {
private DateTime $current;
private SqlFileObject $file;

public function __construct(string $logname) {
$this->current = new DateTime();
$this->file = new SqlFileObject(“{$logname}-{$this->current->format(‘Ymd’)}.log”, ‘a’);
}

元記事を表示

Webアプリ開発 ユーザー新規登録編

# 初めに
webアプリの開発ができたので、開発中に考えたことを書いていきます。
今回はユーザー新規登録についてです。

# 開発環境

macOS Sonoma 14.4.1
PHP 8.3.3
Laravel Installer 5.2.0
Laravel Framework 11.0.5

# ソースコード

https://github.com/opatu07/portfolio

# 考えたこと

## ユーザー新規登録編

### ビュー

ビューで意識したことは
新規登録フォームのコンポーネント化です。

フォームの外枠の設定をする
panel.blade.php

フォーム欄の名前をつける
label.blade.php

バリデーションエラーを出す
error.blade.php

フォームでよく使われるものはコンポーネント化をすることで機能修正する際に該当箇所を見つけやすくしました。

### ルート

次にルートは
“`web.php
Route::get(‘register’, [RegisterController::class, ‘create’])->

元記事を表示

【asdf】PHP 8.x をインストールするときに “No package ‘~~~’ found” と出てめんどかったのでメモ

# はじめに
Ubuntu 22.04 で、asdf を使って PHP のバージョン管理をしようと思ったが、
`asdf install php latest` と実行したとき、無限にエラー吐いてめんどくさかったのでメモ。

# 環境
– Ubuntu 22.04

# 解決コマンド (一発用)
“`sh
sudo apt install autoconf bison re2c pkg-config libxml2-dev libssl-dev libsqlite3-dev libcurl4-openssl-dev libgd-dev libonig-dev libpq-dev libreadline-dev libzip-dev
“`

# エラーと解決コマンド
## No package ‘autoconf’ found
“`
sudo apt install autoconf
“`
## No package ‘bison’ found
“`
sudo apt install bison
“`

## No package ‘re2c’ found
“`
sudo

元記事を表示

オーバーライド

## はじめに

継承についてまとめる・二回目

### オーバーライドとは

スーパークラスで定義された機能を他のクラスで再定義すること。

#### 参考コード

“`php:Person.php
class Person
{
public $firstName;
public $lastName;

public function __construct($firstName, $lastName)
{
$this->firstName = $firstName;
$this->lastName = $lastName;
}

public function show()
{
print “

私の名前は{$this->lastName}{$this->firstName}です。

“;
}
}
“`

“`php:BusinessPerson.php
require_once ‘Person.php’;

class BusinessPerson exte

元記事を表示

PHP array_rand()は配列の値ではなく配列のキーを返すので注意

## 概要

PHPの組み込み関数である`array_rand()`の仕様を勘違いして一瞬詰まったので簡単にまとめておく。

## array_rand()は引数の配列のキーをランダムで返す

言葉で説明するより見ていただいたほうが早い気がするのでまずはコードを掲載する。
「あ、い、う」をそれぞれランダムに返してほしくて下記のようなコードを書いた

“`php

元記事を表示

【Xserver】久々にcomposerを使ったらエラーが出る

XserverでLaravelを用いたアプリをデプロイしているときに、composerでエラーになってvendorフォルダが全くできずハマったので、将来の自分と同じ道でさまよっている方々のためにここに書き残しておきます。

## 1. 何をしていたか
数年ぶりにXserverにLaravelを用いた新しいアプリを置いていました。その時、うまく起動しないのはvendorフォルダがない、つまりcomposerを用いて必要なプログラムをダウンロードしていないというだけでした。そこで
“` bash
composer install
“`
を実行するとこんな感じでエラーが出てうまくいきませんでした。

“`
Your requirements could not be resolved to an installable set of packages.

Problem 1
– Installation request for laravel/framework v10.26.2 -> satisfiable by laravel/framework[v10.26.2].

元記事を表示

OTHERカテゴリの最新記事