- 1. Laravelでfactoryの際にイベントリスナーを走らせない方法
- 2. AWS 上に構築した Laravel 環境での sudo php artisan 実行時に環境変数が適用されずにハマった話
- 3. laravel-http-loggerを使ってアクセスログ機能を実装する
- 4. CakePHP3のTableクラスでMySQLのBIT型を利用する方法
- 5. PHPで組み合わせの全パターンを取得する
- 6. 【PHP】array_uniqueよりもarray_flip2回の方が早い件を検証してみる
- 7. primary key のカラムとは別に auto_incremen するカラムがあるテーブルを migrate したい
- 8. EC2でPHP+MySQL+WordPressを試したら起きたトラブルまとめ
- 9. PHPで順列を取得する
- 10. 【Laravel】Pusherを使ってリアルタイムにイベントを更新する
- 11. 【PHP】ワイ、客先でウェブサーバーをビルトするの巻
- 12. phpでuseした時ってメモリ使うんだっけ
- 13. MAMP環境でxdebugを有効化する手順
- 14. composerを用いたインストール中にメモリ系のエラーが出た話
- 15. (解決済み)codeigniterでコマンドライン(cli)やcronだけログ出力されなくてハマった件
- 16. PHPのメールフォームの作成について SESSION
- 17. JavaScriptでPHPのsetcookie相当の関数を作成
- 18. Laravelでデータベースを操作する(クエリビルダ編)
- 19. [PHP]静的・動的について※学習用メモ
- 20. スキルチェック コピペ集 (PHP)
Laravelでfactoryの際にイベントリスナーを走らせない方法
こんにちはみなさん
Webでデータを更新したら、そのログを取っておくという処理をコントローラに一緒に書くのは、まあ、よくあることなのです。しかし、システムが肥大化していき、「ユーザにメール出さなきゃ」とか、「並び順の変更もしなきゃ」とか、いろんな事が出てくると、コントローラが煩雑になっていきます。しかも、其のデータ更新が別の箇所で発生していたら、また同じような処理を書かなければならない。。。
LaravelのEloquentを使っている場合、データ更新という中心的な処理に対し、ログを取ったりメールを出したりといった「脇道の処理」はイベントを使うのが楽ちんです。
楽ちんなんですが、テストでfactoryを使ってデータを作ると、いちいちメールが飛んだり、ログが作られたりしますので、これはこれで面倒なのです。というわけで、factoryでデータ作るときはイベントリスナーを実行しないようにするやり方をご紹介しましょう。
ちなみに、Laravelは7を使っています。# 3行
– factoryのときもイベントは発生する
– fakeForを使えば、一時的にイベントの発生を抑制できる
AWS 上に構築した Laravel 環境での sudo php artisan 実行時に環境変数が適用されずにハマった話
AWS Elastic Beanstalk で構築した Laravel 環境で、普段から問題なく実行できていた artisan コマンドが失敗する事態に遭遇しました。
問題の切り分けに苦戦して結構ハマったので原因と解決方法を共有します。## TL;DR
– `sudo php artisan` の形で実行すると必要な環境変数が引き継がれずに失敗する。
– `sudo su -` で root ユーザーとして実行すれば問題ない。## 事象
`eb ssh` で EC2 インスタンスにログイン後、以下のように artisan コマンドを実行する[^sudo-php-artisan]もエラーが発生してしまいました。
[^sudo-php-artisan]: 導入しているパッケージの関係で権限の問題があるため `sudo` で実行しています。
“`bash
$ sudo php artisanIn ClientResolver.php line 397:
Missing required client configuration options:
region
laravel-http-loggerを使ってアクセスログ機能を実装する
## laravel-http-loggerを使ってロギング機能を実装
とあるAPIにモニタリング用のアクセスログ機能を追加実装する事となりまして。
laravel-http-loggerというライブラリを使うと簡単に実装できそうなので利用しました。
復習がてら実装方法や手順を書いてみます。※公式の説明とは若干実装の順番が異なります
## 事前学習のオススメリンク
Laravelのログについて(公式)
https://readouble.com/laravel/6.x/ja/logging.htmlログ出力のカスタマイズ例
PHPの標準出力について(公式)
https://www.php.net/manual/ja/wrappers.php.php## laravel-http-loggerをインストールする
↓公式はこちら。具体的な方法が掲載されています(英語)
https://github.com/spatie/laravel-http-loggerlaravel-http-log
CakePHP3のTableクラスでMySQLのBIT型を利用する方法
# Overview
CakePHP3の`Migration`ファイル及び`Table`クラスで、
MySQLの[BIT型](https://dev.mysql.com/doc/refman/5.6/ja/bit-field-literals.html)を扱おうとした際に、調査とひと手間の実装が必要だったのでメモっておく。#### ちなみに経緯は以下のような感じ
1. CakeアプリでDBにフラグ用カラムを追加したくなった
2. 下記記事などを参照してBIT型にしようと思った
[MySQLに真偽値を格納する場合はbit(1)型のフィールドが最適 – Qiita](https://qiita.com/ka215/items/379c4d46d0c04b7fdb46)
3. 公式ドキュメントの [Migrations – 3.x](https://book.cakephp.org/migrations/3/ja/index.html#id8) にはPhinxで扱える型リストにはBIT型の記述がなかった
4. ただ調べたところ [Feature Request: MySQL BIT
PHPで組み合わせの全パターンを取得する
# 何をするのか
配列の中から取り得るすべての組み合わせを取得します。
例えば,配列の要素が3つなら,1, 2, 3 いずれかの要素数を持つ組み合わせを作ります。
# PHPで実装
“`php
/**
* すべての組み合わせを返す
*
* @param array $arr 選ぶ元となる配列
* @return array
*/
function getAllCombinations(array $arr): array
{
$arr = array_unique($arr);
$results = [[]];foreach ($arr as $item){
foreach ($results as $result){
$results[] = [$item, …$result];
// PHP7.4 未満
// $results[] = array_merge([$item], $result);
}
}
arr
【PHP】array_uniqueよりもarray_flip2回の方が早い件を検証してみる
`array_unique`と、`array_flip`2回のどちらの方が早いかについてなんとなく検証してみました。
# きっかけ
以前、先輩エンジニアに「`array_unique`よりも`array_flip`2回の方が早いらしいよ」と聞いたことがありました。
ふと思い出し、調べたら日本語の記事もほとんど見つからなかったのでまとめようと思います。# array_unique と array_flip
## array_unique
`array_unique`は、配列を入力とし、値の重複がない新しい配列を返す関数です。“`
$a = array (0, 1, 0, 2, 3, 4, 6, 6, 2); //これが
$b = array_unique($a); //こうすると
print_r($b);
——
こうなる
Array
(
[0] => 0
[1] => 1
[3] => 2
[4] => 3
[5] => 4
[6] => 6
)
“`## array_flip
`array_fl
primary key のカラムとは別に auto_incremen するカラムがあるテーブルを migrate したい
## 前提
* DB の主キーは連番ではない
* 連番のカラムが必要
* Laravel Framework 5.8.36
* mysql Ver 14.14 Distrib 5.7.25### 実行しようとした migration ファイル
“`php
Schema::create(‘tests’, function (Blueprint $table) {
$table->uuid(‘id’)->primary();
$table->bigIncrements(‘counter’);
$table->timestamps();
});
“`### 出たエラー
“`console
SQLSTATE[42000]: Syntax error or access violation: 1068 Multiple primary key defined (SQL: alter table `tests` add primary key `tests_id_primary`(`id`))
“`「複数の `primary key` は設定できないぞ
EC2でPHP+MySQL+WordPressを試したら起きたトラブルまとめ
##はじめに
本記事は日経BPから出版されている参考書[「さわって学ぶクラウドインフラ AWS 基礎からのネットワーク&サーバー構築(第2版)」](https://www.amazon.co.jp/Amazon-Web-Services-%E5%9F%BA%E7%A4%8E%E3%81%8B%E3%82%89%E3%81%AE%E3%83%8D%E3%83%83%E3%83%88%E3%83%AF%E3%83%BC%E3%82%AF-%E3%82%B5%E3%83%BC%E3%83%90%E3%83%BC%E6%A7%8B%E7%AF%89/dp/4822237443)を使って作業を進めたときに起こったトラブルについてまとめたものです。記事執筆時点(2020/6/14)では第3版が出版されているようです。
## トラブルその1
####EC2インスタンスにMySQLをインストール、しかし起動後にMySQLに入れないCHAPTER8-2で
`$ sudo yum -y install mysql-server`
を実行し、DBサーバーにMySQLをインストール。
(実はここで
PHPで順列を取得する
# 順列
配列で与えられた異なる n個 の要素の中から,異なる r個 を取り出して1列に並べる順列をすべて取得します。
# PHPで実装
“`php:permutation.php
/**
* Permutation 順列 nPr (r ≦ n)
*
* @param array $arr 並べる元となる配列
* @param int $r 並べる1列(1セット)あたりの要素数
* @return null|array
*/
function permutation(array $arr, int $r): ?array
{
// 重複した値を削除して,数値添字配列にする
$arr = array_values(array_unique($arr));$n = count($arr);
$result = []; // 最終的に二次元配列にして返す// nPr の条件に一致していなければ null を返す
if($n < 1 || $n < $r){ return null; } if($r ===
【Laravel】Pusherを使ってリアルタイムにイベントを更新する
# 今回作るもの
こちらの[チュートリアル](https://pusher.com/docs/channels/getting_started/javascript-realtime-chart)を参考に、サーバで発行したイベントの結果をリアルタイムにチャートで表現します。
![ezgif-3-4c1f7bfa07ce.gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/391127/e06dd594-1965-e2d9-1d17-f49258b6f70a.gif)
[JavaScript realtime chart quick start](https://pusher.com/docs/channels/getting_started/javascript-realtime-chart)
# 環境
PHP: 7.2.5
Laravel: 7.0
pusher-php-server: 4.1# Pusher Appの作成
[こちらの記事](https://qiita.com/akkino
【PHP】ワイ、客先でウェブサーバーをビルトするの巻
# はじめに
この記事では
PHPの導入方法や使い方ついて
まとめた記事です。
ベストプラクティスや間違いがあれば
書き直していく予定です。
今回は導入時とそのつまづきポイントについて
とビルトインウェブサーバーについて書きます。——————————–
# 想定される環境客先常駐
Windows10 Pro 64bit
PHP 7.2.31——————————–
# それってさぁ
そうです。
イマドキはdockerもしくは
クラウドでやるのが当たり前になっています。——————————–
# 便利にしたいけど、んー便利なものがあれば使えば良いんじゃないのって
なるのが普通ですが実行に移す上で
解決すべき問題が複数あります。——————————–
# 問題点・環境を好きに扱うことは難しいこと
・技術レベルがかなりのミスマッチであること
・学習コストがかかりすぎること———
phpでuseした時ってメモリ使うんだっけ
# phpでuseした時ってメモリ使うんだっけ
わからんのでやってみよう。## やってみる
### やった環境
“`shell-session
$ php -v
PHP 7.4.6 (cli) (built: May 14 2020 10:38:36) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
with Xdebug v2.9.2, Copyright (c) 2002-2020, by Derick Rethans
with Zend OPcache v7.4.6, Copyright (c), by Zend Technologies
“`### やってみた
“`PHP:main.php
MAMP環境でxdebugを有効化する手順
`xdebug`とは、PHPのデバッグ機能を拡張してくれるツールです。
MAMPで`xdebug`を使えるようにする手順メモとして残しています。
## 1.php.iniを編集
php.iniを開きます。
MAMPのパスは、`MAMP/bin/php/php7.4.2/conf/php.ini`のようになっています。“`
[xdebug]
zend_extension=”/Applications/MAMP/bin/php/php7.4.2/lib/php/extensions/no-debug-non-zts-20190902/xdebug.so”
xdebug.remote_enable=1
xdebug.remote_autostart=1
“`xdebugの`zend_extension=…`がコメントアウトされているので解除して、下の二行を記述します。
## 2.MAMPを再起動
MAMPのStop Serversで一旦切って、再起動します。
![Screen Shot 0032-06-14 at 14.12.47.png](https://qiita-
composerを用いたインストール中にメモリ系のエラーが出た話
# 目的
– composerインストール中に出たメモリ系のエラーの解決方法をまとめる。
# 実施環境
– ハードウェア環境
| 項目 | 情報 |
| — | — |
| OS | macOS Catalina(10.15.5) |
| ハードウェア | MacBook Pro (13-inch, 2020, Four Thunderbolt 3 ports) |
| プロセッサ | 2 GHz クアッドコアIntel Core i5 |
| メモリ | 32 GB 3733 MHz LPDDR4 |
| グラフィックス | Intel Iris Plus Graphics 1536 MB |– ソフトウェア環境
| 項目 | 情報 | 備考 |
| — | — | — |
| AWS EC2インスタンス | AmazonLinux2 | こちらの方法を用いてイメージからインスタンスを作成→[AWS EC2 をMacで使ってみよう!](https://qiita.com/miriwo/items/a1ab84c098008e43d042) |
| P
(解決済み)codeigniterでコマンドライン(cli)やcronだけログ出力されなくてハマった件
# codeigniter3 で のに、log_message()でログ出力されなくてハマった。
### apache経由のアクセスは log_message(‘error’,’test’)でログ出力OK
### しかし、shellなどコマンドラインcliやcronだと、log_message(‘error’,’test’)でログ出力NG
## 設定ファイル config.php の ログ関連設定をチェック
`$config[‘log_threshold’] = 1; // ‘error’だけ表示される
$config[‘log_path’] = ”; // application/logsに出力される
$config[‘log_file_permissions’] = 0644;`## ログ出力ディレクトリ application/logs の パーミッションチェック
777 ok## エラー設定もチェック
`ini_set(‘display_errors’, 1);
error_reporting(E_ALL & ~E_WARNING & ~E_NOTICE & ~
PHPのメールフォームの作成について SESSION
PHPでメールフォームを作成しているのですが、セレクトボタンやラジオボタンの時にSSESIONを使用して情報を保存したいのですが、どうしても上手くいきません。
セレクトボタン=応募職種
ラジオボタン=性別
どのようなコードを書くべきでしょうか?
*他は全てSESSIONで情報が保存されます。“`ruby:index.php
JavaScriptでPHPのsetcookie相当の関数を作成
まずPHPのsetcookie関数の仕様を確認。
[setcookie – PHPマニュアル](https://www.php.net/manual/ja/function.setcookie.php)パラメータは
**name**、**value**、**expires**、**path**、**domain**、**secure**、**httponly**、**options****options**は指定が特殊で、第8引数ということではなく**expires**、**path**、**domain**、**secure**、**httponly**、**samesite**のうち必要分を連想配列として第3引数に渡すということのよう。
パラメータの内容についてはこちらも合わせて参照。
[HTTP Cookie – MDN](https://developer.mozilla.org/ja/docs/Web/HTTP/Cookies)
[Document.cookie – MDN](https://developer.mozilla.org/ja/docs/Web/AP
Laravelでデータベースを操作する(クエリビルダ編)
# 前提条件
[eclipseでLaravel開発環境を構築する。デバッグでブレークポイントをつけて止める。(WindowsもVagrantもdockerも)](https://qiita.com/toontoon/items/76fa7f8845b20776077c)
本記事は上記が完了している前提で書かれています
プロジェクトの作成もapacheの設定も上記で行っています[Laravelで入力値エラーチェック(validate)を実装する](https://qiita.com/toontoon/items/abf5c52eb0c3fe11003c)
[Laravelでフラッシュデータ(直後のHTTPリクエストの間だけセッションに保存されるデータ)を使う](https://qiita.com/toontoon/items/eb9de17f65c198112f24)
本記事は上記の内容を理解している前提で書かれています[LaravelでDIを使う](https://qiita.com/toontoon/items/ebf53e4053be6f663730)
本記事は上記で作成
[PHP]静的・動的について※学習用メモ
# 静的・動的について
業務をしつつプログラミングを勉強し始めて、静的・動的について当たり前のように使っているがしっかり調べられておらず、整理しようと思ったので整理。## 静的とは
・静的型付け(せいてきかたづけ、英: static typing)とは、プログラミング言語で書かれたプログラムにおいて、変数や、サブルーチンの引数や返り値などの値について、その型が、コンパイル時など、そのプログラムの実行よりも前にあらかじめ決められている、という型システムの性質のことである。(wikipediaより抜粋)### 小難しいので自分なりに整理
・プログラム実行時に値が切り替わったりせず、**事前に設定された状態を保持し続けている**状態、というか型PHPで静的なプロパティを宣言する際、こんな感じ。
“`PHP:静的に変数を宣言
class test
{
public static $A = 1;
}
“`
上記のようにstaticを付けて宣言すると、静的に定義された状態となる。staticで静的にクラスのプロパティやメソッドを定義すると、クラスをインスタンス化せずに
スキルチェック コピペ集 (PHP)
某スキルチェックで、時間制限があるのに毎回同じようなコードを書くのがあまりにアホらしいのでまとめました。いわゆる自分用メモです。
一応書いておきますが、某スキルチェックでは開始前に「他人のコードを利用しない」に同意させられるため、ご利用の際は自己責任でお願いいたします。
また、わいはPHPを勉強し始めてまだ日が浅いので、ソースコードレビューしていただけると幸いです。## 標準入力の取得(複数行、各行に複数の値)
“`php
/**
* 標準入力からの値を取得します
*
* @params int $rowCount 標準入力から取得する行数
* @return array 標準入力からの値の配列
*/
function getStandardInput(int $rowCount) {
$result = [];
for ($i=0; $i<$rowCount; $i++) { $inputLine = fgets(STDIN); $inputData = explode(" ", $inputLine);