PHP関連のことを調べてみた2021年09月18日

PHP関連のことを調べてみた2021年09月18日

PHPでかんたんな自作言語のコンパイラを書いた

[ブログに書いていたもの](https://memo88.hatenablog.com/entry/2020/09/18/193844)を引っ越してきました。元の記事公開日は 2020-09-18 です。

やっつけなので汚いです。ライフゲームのコンパイルが通ったのでヨシ、という程度の雑なものです。

https://github.com/sonota88/vm2gol-v2-php

# 移植元

自作言語の概要などについてもこちらを参照してください。

https://memo88.hatenablog.com/entry/2020/05/

元記事を表示

?インターネット老人?のためのホームページ(死語)リフォーム術

# この記事の対象
~00年代初頭にホームページ作っていて、現在放置中……という人、あるいはそういう人から依頼されて昔のフォルダを受け取った人が対象になります。
スキル的にはjQuery(Bootstrap)なら何とか勢~(バックにも関心がある)SPA初心者勢を想定しています。

# 手順
## 1.本当に自前でやる必要があるか考える
Webサービスが氾濫する現在、現在サイトにある機能を本当に自前で提供する必要があるか考えましょう。

### 日記
まぁ**最有力はブログへの移行**ですね。黒歴史を消す人も多いですが、逆に過去の日記みたいなもんで、残しておきたいと思う人もいるかと思います。ていうかホームページは放置してて日記にあたる部分だけ流石にブログに移行してる人も多いかと思いますね。
何らかの理由でブログに移行できない、不適切だと思う場合はスクレイピングして文章データをmdやらjsonに纏めて、今流行りのGatsbyあたりに手を出すのも良いのではないでしょうか。

### イラスト
これは現行のシェアとしてもシステム的にも**[pixiv](https://www.pixiv.ne

元記事を表示

タイトル

テスト本文

元記事を表示

タイトル

テスト本文

元記事を表示

タイトル

テスト本文

元記事を表示

【PHP】array_unique関数で配列の重複したデータを削除

#array_unique関数#
array_unique関数を使うことで、配列の重複したデータを削除することが出来ます。

“`array_unique.php
$fruits = [‘apple’,’lemon’,’strawberry’,’apple’,’orange’,’strawberry’,’lemomn’];
$result = array_unique($fruits);
var_dump($result);
“`

“`result
array(5) {
[0]=>
string(5) “apple”
[1]=>
string(5) “lemon”
[2]=>
string(10) “strawberry”
[4]=>
string(6) “orange”
[6]=>
string(6) “lemomn”
}
“`

このように重複している値を削除することが出来ました!

元記事を表示

Laravel コントローラをtinkerから実行する

tinkerからコントローラを実行できると便利なので、その方法をご紹介します。

## 環境

– PHP: 8.0.10
– Laravel: 8.58.0

## モデル、コントローラを作る

“`shell
$ php artisan make:model Book
$ php artisan make:controller BookController
“`

– `app/Models/Book.php`
– `app/Http/Controllers/BookController.php`

### index: 引数なしのメソッドを実行する

“`php:app/Http/Controllers/BookController.php

元記事を表示

Carbon 生成の罠

#はじめに

何度か php の carbon を利用している際に気付かずに起こしていた事象を、備忘録として記載します。

#null を入れて生成

ユーザーの入力等をカーボンに変換する際は、

“`
new Carbon($input)
Carbon::parse($input)
“`

とすることが多いと思いますが、この`$input`が空文字、null、空配列、falseなどの場合、生成されるインスタンスの日時は実行時点の日時になります。
入力をCrbonに変換してDBに登録、といった実装を注意せずに行うと、
 `null`等を入れて生成
   ↓
 実行時点での日付で登録
といったコンボがエラーが起きずに発生し、後で入力していないのに日付が入っているといった事態になります。

#対策

`is_null()`を用いて`null`かどうかを判定するのも良いですが、空文字、空配列、false の回避も考えると、`empty()`の方が広範な判定を行うことができます。

大まかな構文としては以下の通りです。

“`
$datetime = empty($input) ? nu

元記事を表示

curl_execの使い方

#とりあえず結果

“`curl_exec.php
‘GET’,
CURLOPT_URL => ‘api url’,
CURLOPT_HTTPHEADER => [‘X-API-Key: api key’],
CURLOPT_RETURNTRANSFER => true,
CURLOPT_TIMEOUT => 3
];
curl_setopt_array($ch, $options);

$response = curl_exec($ch);

$statusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
$result = json_decode($response, true);

curl_close($ch);

var_dump($statusCode);
var_dump($result);
“`

curl_execでapiを叩きたいとの話があ

元記事を表示

504 Gateway timeout 解決方法 on AWS

# 504 Gateway timeout 解決方法 on AWS

Webシステムで、バックエンドで少々長い時間が掛かる処理が終わるまで待つ必要があるケースがありますが、デフォルト設定だと、大体60秒程でタイムアウトとなり、「504 Gateway timeout」が発生するという事が多いです。

AWSで、ELB->Apache->PHPと言うよくある構成で、どの様に設定して行くと良いかをメモがてら残しておきます。

## 構成

クライアント(ブラウザ) -> ELB(ALB) -> WEB(Apache -> PHP) -> DB(RDS on MySQL)

今回、DBは割愛します。

## タイムアウト調整

ユースケース次第ですがAWSのナレッジでは、KeepAliveTimeoutなどをロードバランサーのアイドルタイムアウトよりも長いキープアライブタイムアウトにするように推奨されています。
https://aws.amazon.com/jp/premiumsupport/knowledge-center/apache-backend-elb/

例)無限にはできませんの

元記事を表示

フレームワーク無しHTMLテーブルをBootstrapで再現する場合

過去に作ったフレームワーク無しのHTMLテーブルを、Bootstrap(5)で再現しようとすると、
過去、手抜き、つまりborder-bottom: noneなどで罫線を消してセル結合っぽくしている場合、
(HTML的にはダメですが、ループを回してDBを表示する場合めんどくさくてつい…)
融通がきかなくて困る場合があります(した)。

##こういうテーブルです
![テーブルサンプル.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/458322/95270db3-5f40-70b3-90fe-3c011720d443.png)

##手抜きをBootstrapで再現
###HTML

* 罫線無しのテーブル(table-borderless)にして、個別にborderを設定する
* 同列の前行が違う値だったら、border-topを追加設定する

“`html

【PHP】平日のみの日付リストを日数指定で取得

土日祝日を除いた平日の日付リストを日数指定で取得します。
祝日判定には以前作成した[祝日取得クラス](https://qiita.com/akebi_mh/items/82cf4dbe70ac9913beb1)を利用してみました。

“`php:weekdays.php
holiday = new Holiday;
$this->startDate = new DateTimeImmutable;
}

public function setStartDate($ymd = ‘now’) {
$this->startDate = new DateTimeImmutable($ymd);
}

private function isHoliday($date) {

【EC-CUBE】XMLを出力したい【4系】

**経緯**

EC-CUBE4系の案件にてXMLを出力する仕様だったので対応。

#手順
Controllerは普通に書きますが、アノテーションに「defaults={“_format”=”xml”}」を定義します。
XMLフォーマットは画面同様twigにて記載します。
試しに指定したidのCustomerデータを表示するようにしてみます

“`php:app/Customize/XmlController.php

class XmlController extends AbstractController {

/**
* @Route(“/xml/customer/{id}”, name=”xml_customer”, defaults={“_format”=”xml”}, requirements={“id” = “\d+”})
* @Template(“Xml/customer.twig”)
*/
public function customer(Request $request, Customer $Customer) {

Ubuntu 20.04にPHPを複数インストールして切り替える方法(PPA・apt)

# はじめに

本書では、Ubuntu 20.04に、PHPの環境をインストールする方法をまとめます。

案件によってPHPのバージョンが違うこともあるため、複数のバージョンをインストールして、alternativesで切り替えられるようにします。

# インストール手順
## リポジトリ追加

“`bash
sudo add-apt-repository ppa:ondrej/php
“`

## apt update

“`bash
sudo apt update
“`

## PHPをインストール

ここでは、本ページ執筆時点で最新の、8.0をインストールします。

“`bash
sudo apt install -y php8.0
“`

他に、複数バージョンの切り替えを確認するため、本ページ執筆時点で有効な、7.3、7.4もインストールします。

“`bash
sudo apt install -y php7.3
sudo apt install -y php7.4
“`

## PHPモジュールをインストール

“`bash
sudo apt sea

【PHP】継承とオーバーライドについて

基礎の基礎に戻ってみました。

## 継承とは
すでに存在しているクラスを元にして、新しいクラスを作ること
元のクラスの事を**親クラス、基底クラス**と呼びます。
新しいクラスは**子クラス**と呼んでます。

### 継承することのメリット
親クラスで定義した関数を、子クラスでも同じように使用することができます。
これによって、同じような処理を複数書かなくて良くなります。
+コードの可読性も上がるので、メンテナンスがしやすくなります。

### 継承の使い方
`class 子クラス名 extends 親クラス名{}`という形で継承することができます。

“`php
test();

//出力結果///////
親クラスの

コードプロファイラによる処理時間増加問題

# はじめに
実装機能の処理時間を調査しているときに、実装箇所とは別のところで大幅に時間がかかっている問題に遭遇しました。
その時の原因と、おまけで計測処理について自分用に記録します。

# ざっくり言語・フレームワーク
言語:PHP
フレームワーク:FuelPHP

# 原因
***結論:コードプロファイラがオンになっていたため***

より細かく処理時間をログ出力して、原因を調査してみたところ最後のレスポンスを返すところまでは問題ありませんでした。

お手上げ状態の時にたまたま、コードプロファイラの存在を思い出し、オフにしてみたら解決しました。
プロファイラでは、プログラム実行時の様々な情報が確認できその中で実行されたSQLも確認できる。今回、かなり多くループ処理でSQL文(4~5万)が実行されていたた。そのすべての情報をプロファイラで出力されていたためプロファイラの処理に時間がかかったと考えられる。

### (コード)プロファイラとは?
> プロファイラとは、コンピュータプログラムが実行される様子を監視・記録し、プログラム中の各箇所の動作順や実行時間などを集計・解析するプログ

【Laravel】ルート情報の記述順によって発生するエラーと正規表現 制約を使った対策

## はじめに

初めてQiitaに記事を投稿します。
ご指摘いただけますと幸いです。

## 1. 概要

ルートパラメータを使用する場合、記述の順番によっては
DBに存在しないデータを処理しようとして、エラーが発生する可能性があります。

今回は、簡単なエラー発生例を記したあと、原因と対策について説明します。

※本記事は初学者向けに詳しく解説しています。

## 2. 環境

– PHP:7.4
– Laravel:6.20

## 3. エラー発生の例

下記前提を踏まえた上で、エラーコードのサンプルを示します。

### 3.1 前提

– ログインユーザーが記事を投稿できるsnsアプリを想定。
– 分かりやすいように最低限のメソッド、ルート情報のみを実装。
– 処理に対するルート情報のURI仕様は下記とする。

| 処理|HTTP Method |URI | Action |Middleware|
|:-:|:-:|:-:|:-:|:-:|
| 記事詳細画面を表示 |GET| articles/{記事のid}

【PHP】 取得する総日数は固定で、土日祝日は除外したい

僭越ながら初投稿

Googleカレンダーから自分の予定を抽出して空き日程を算出するアプリを作成中です
そこで、土日祝を除いた上で指定した日数分の予定を抽出するロジックを作ってみたのでメモがてら

# やったこと
Googleカレンダーから自分の空き日程を取得するアプリを作成中です
その中で、土日祝日を除いたN日分の日数を取る機能が欲しくなりました

例えば`9/3`から14日分の空き日程を抽出したいとなった際、とりあえず素直に開始日の`9/3`を含めて14日後の`9/16`の日付を指定してカレンダーのAPIを叩きます
すると、指定通り`9/3 ~ 9/16`までの自分の予定が取れます

が、`9/4`, `9/5`, `9/11`, `9/12`が土日です
土日祝日はスキップした上で14日分を取りたいので、上記のやり方では土日を除くと10日分の予定しか取れてません

土日祝を除いた14日分の予定を抽出するには以下の計算が必要になります

1. `9/3`から`9/16`の間には土日が4日あるので`9/16`に4を足して`9/20`
2. `9/18`, `9/19`が土日で`9/20

Laravel 6.x リダイレクト時にクエリパラメータを引き継ぐ

# やりたいこと
サービスをスタートしてからパスの構造を整理したりして、コンテンツを引っ越した時に、Laravelにはリダイレクトルートという便利な機能があり、

“`
Route::redirect(‘/old/path’, ‘/new/path’);
“`

“`
Route::permanentRedirect(‘/old/path’, ‘/new/path’);
“`

のように記述して301、302のリダイレクトを行うことができます。こうしておけば旧パスでコンテンツをブックマークしている人にも404を返さなくてすみます。便利。

ただ、この`redirect`や`permanentRedirect`はクエリパラメータを引き継いでくれないようで、例えば

`http://your.domain/old/path?param=hello`

のようなURIにアクセスされても

`http://your.domain/new/path`

にリダイレクトされてしまいます。パラメータを捨てられてしまうと動的なコンテンツはまともに生成できなくなってしまったりするので困りま

PHPで連想配列をPostgreSQLのpsql風にテーブル表示する

連想配列をPostgreSQLのpsql風にテーブル表示するコードです。
こんな感じで出力されます。

“`
actor_id | first_name | last_name | last_update
———-+————+————–+————————
1 | Penelope | Guiness | 2013-05-26 14:47:57.62
2 | Nick | Wahlberg | 2013-05-26 14:47:57.62
3 | Ed | Chase | 2013-05-26 14:47:57.62
4 | Jennifer | Davis | 2013-05-26 14:47:57.62
5 | Johnny | Lollobrigida | 2013-05-26 14:47:57.62
6 | B