20210729のPHPに関する記事は3件です。

PHP-JWTで発生した Cannot handle token prior to [time stamp] エラーの解決

事象 Laravel + PHP-JWT + CognitoでユーザーをJWT検証で認証するWebアプリにて、 ある日突然ローカルでのみJWT検証でエラーが発生する事象が発生しました。 環境 Laravel 6 + nginx + AWS Cognito Jwt検証用ライブラリ: Firebase/PHP-JWT (https://github.com/firebase/php-jwt) エラー内容 Firebase\JWT\BeforeValidException: Cannot handle token prior to [time stamp] (Google訳: [タイムスタンプ]より前のトークンを処理できません) 原因 JWTを発行するサーバー(Cognito)と検証側サーバー(ローカルサーバ)側で時刻が一致しない場合に起きるようです(下記Github issue参照)。 対処法 $leeway変数を再定義してサーバー時刻ずれを秒単位で許容することで回避できるそうです(defalutは0)。 ドキュメントによると数分以上の設定は非推奨とのことです。公式のサンプルでは1分に設定されていますが、今回は5秒に設定しました。 再発した場合はさらに許容時間を増やそうと思います。 use Firebase\JWT\JWT; class JWTSampleClass { public static $leeway = 5; //5秒の時刻ズレの誤差を許容 // } 参考
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

PHPでメモリを使いすぎてたらアラート飛ばす

php.iniのmemory_limitの設定値以上のメモリを使用した場合、 『Fatal error : Allowed memory size of ...』のエラーになってしまいますが、 エラー発生の兆候をキャッチしておくことで、事前に対応を入れることができます。 今回はregister_shutdown_functionを利用して、 メモリ使用量がmemory_limit値に近い場合はアラートを飛ばす簡単な例を紹介します。 function checkMemory() { // memory_limit値を取得 $limit = ini_get('memory_limit'); // 設定値は『128M』のような文字列なので、数値と単位に分ける // 『128.8A』など、小数だったり不正な単位が付いてたりする場合も、とにかくint型にキャストされる $byte = (int) $limit; $unit = strtoupper(substr($limit, -1)); // 数値と単位からバイト数を算出 switch ($unit) { case 'G': $byte *= 1024; case 'M': $byte *= 1024; case 'K': $byte *= 1024; } // memory_limitの下限値が存在しているため、下限値未満は下限値が自動的に割り当てられる // マイナス値はmemory_limit無制限になるため下限値を割り当てない // PHP8=2M PHP7=2M PHP5=256K $min = 2 * 1024 * 1024; if (0 <= $byte && $byte < $min) { $byte = $min; } // memory_get_peak_usageはPHPによって割り当てられたメモリの最大値 // その最大値がmemory_limit値の90%を超えていたらアラート飛ばす if (memory_get_peak_usage() / $byte > 0.9) { // ログ残す、メール飛ばす、などお好みの処理を } } register_shutdown_function(function () { checkMemory(); }); スクリプト内でmemory_limitを一時的に変更しているような場合は少し工夫が必要になります。 何かのお役にたれれば幸いです。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む

[JavaScript] import, exportについて

私は普段phpを書いており、最近はVue.js, Nuxt.jsも触っているのですが、 動かすことのできるコードは書けています。 Vue, Nuxt を触る前まではES5しか書いたことがなく、 ほぼ毎日レベルで見ている import, export を正直理解できていなかったので、 記事にしてまとめました。 import, export is 何 変数・関数・クラスを文字通りexportすることができ、そのexportされたものをimportすることで、外部モジュールに記載された処理等々を使うことができる機能。 phpでいえば importは require で、exportはpublic修飾子にあたるようなもの。 export はクラスで言う、public修飾子? public修飾子というわけではないが、exportをしなければ、そのファイル内に機能が閉じる。 そのためexportをすれば外部から参照する手段となるので、そういう意味では "public" という認識で間違いない。 export の名前付き、デフォルトについて 名前付き 変数・関数・クラスに付けられた名前でexportする。 デフォルト 変数・関数・クラスに名前を付けても付けなくてもいい。1つのファイルに1回しか使えない。 import の名前付き、デフォルトについて exportの方法が2種類あるのでimportの方法も2種類ある。 名前付き import {needCurlyBrace} from './Foo.js'; デフォルト 名前付きのように波括弧は不要だが、import時に命名する必要がある import Bar from './Foo.js'; import, export の構文について 色々あるので、下記MDNを参照してください。 import export export で被った名前をimportしたらどうなるの? 名前が被っている場合は、importできない。import時に as を加えて別名にする必要あり。 importしたファイル内に同じ名前があった場合は? こちらも同様、importできない。import時に as を加えて別名にする必要あり。 名前付きのほうが良く無い?import側で毎回命名って辛く無い? そう思う。し、世間もそのようである。 export defaultを使わないようにしている記事もいくつかあるから、そうなんだと思う。 TypeScript Deep Dive でさえもそのような記事がある。 また、Tree-Shaking的な観点でもやっぱりアンチパターンのようです。 Qiita開発チームがReactの開発で default export を使わなくなった理由 なぜ default export を使うべきではないのか? Avoid Export Default ちなみにJetbrains WebStormではdefaultで使われているものもコードジャンプできた。けどね。 もしできなかったらどこになにあるか分からなくて地獄だね。 export default 使うタイミングってどこよ? 調べたけど特に見つからなかった。 ご存知の方いらっしゃいましたら教えてください! まとめ 基本 named export を使おう。 命名はいつも通り気をつけよう。 使っていない(無駄な)import は避けよう。 編集後記 以前ざっと import, export を調べた時は、 基本的に export default 推奨、って結構書かれてた気がするんだけど、全くの真逆だった。 調べると件数は少ないながらも、そのような記述している昔の記事がでてくるので、 トレンド的にそのような時もあったのかな。。
  • このエントリーをはてなブックマークに追加
  • Qiitaで続きを読む