PHP

AWS Lambda で PHP のカスタムランタイムのコンテナイメージを作ってみるメモ

もう結構前のことですが、AWS Lambda に zip ではなくコンテナイメージでデプロイ出来るようになったとのことです。 AWS Lambda の新機能 – コンテナイメージのサポート | Amazon Web Services ブログ ので試してみました。残骸はこちら。 コンテナイメージ…

ParaTest で TEST_TOKEN を使って DB が絡むテストを並列実行する

だいぶ以前に Qiita に ParaTest で PHPUnit を並列実行する記事を書いていたのですが、 ParaTest と Docker で PHPUnit を並列実行する試み - Qiita 続:ParaTest と Docker で PHPUnit を並列実行する試み - Qiita よく考えたら別に Docker なんて必要なく…

PHPUnit の Clover XML を Cobertura XML に変換して Gitlab の MR で コードカバレッジの可視化

以下で説明される通り、Gitlab では MR のコード差分画面で行ごとのコードカバレッジを可視化できます。 Test Coverage Visualization | GitLab この機能を利用するためには Cobertura 形式の XML をカバレッジレポートが必要です。PHP の場合 PHPUnit 9.4 …

Gitlab のマージリクエストで PHPUnit のコードカバー率の差分を表示する

PHPUnit のコードカバー率がマージリクエスト(MR)の前後でどのように変化したかの差分を MR の画面に表示するようにしてみたメモ。 .gitlab-ci.yml は次のような内容になります。phpunit でテストを実行するジョブと phpcov でコードカバレッジを計測する…

tmpfile で削除されたファイルのストリームリソースを返していて一見ダメそうだけど実は大丈夫なメモ

PHP

tmpfile の使い方の問題でぱっと見うまく動かないように見えて、でも実はうまく動くメモ。 問題のコード 要約すると次のような処理でした。 tmpfile で一時ファイルを作成 stream_get_meta_data でファイル名を得る そのファイル名に ZipArchive で書き込み …

PHP 7.4 で xhprof/xhgui プロファイリング

PHP

だいぶ前に xhgui 使ったときは、アプリ側にも xhgui のソースを入れて xhgui/external/header.php みたいなファイルを auto_prepend_file とかに設定していたと思うのですが、最新版だとだいぶ変わっていました。 xhprof とりあえず tideways_xhprof 拡張 …

自分用 PHP の Docker イメージを Docker Hub で自動ビルド

ngyuki/php-dev - Docker Hub に自分用の PHP の Docker イメージを置いています。これを新しい PHP のバージョンがリリースされたときに自動ビルドするために試行錯誤したメモです。 Docker Hub の Repository Links で自動ビルド → ダメ 最近になってから…

Slim4 を使ってみたメモ

PHP

とある社内用のツールで Silex を使っていたのですが、随分前に DEPRECATED になっている ので、Slim4 にリプレースしました。 Silex からの移行なら Symfony Flex では? という気もしますが特に深い理由はありません。もともと極小さいアプリでフレームワ…

nginx の php-fpm で index.php のフロントコントローラーありきの設定

おそらく素の php ファイルをドキュメントルートに置いて URL に拡張子 .php を含むアクセスを有効にするため、location で正規表現とか、try_files の最後で index.php とか、fastcgi_split_path_info とか、いろいろ難しいことがされている例を良く見るの…

Phan/PHPStan/Psalm を VSCode で使ってみるメモ

普段 PHP のコードは PhpStorm で書いているので VSCode で PHP のコードを開くことはほとんどありませんが、たまに PhpStorm では OK なのに Phan などの静的解析ではエラーになることがあり、その修正のために何度も phan コマンドを叩くのは辛いので(な…

composer で replace してるパッケージを削除して元のパッケージに戻そうとしたら面倒だった

とあるプロジェクトで phpstan/phpstan-shim を過去に一時的に入れていたことがあって、もう使わないので削除しようとしたところ、composer.json からは消えていたものの実際には削除出来ていませんでした。 こんな感じの依存関係になっています(これは説明…

PHP版の Power Assert もどき「Phpower」

PHP

js には Power Assert という便利なパッケージがあります。私自身は js でテストをほとんど書いたことがないので使ったこと無いのですが、例えば次のようなアサーションが、 assert(ary.indexOf(zero) === two) 次のように assert の各部位の値が表示される…

Alpine Linux の php で CP932 な CSV をストリームフィルタを使って読む

curl で相手が突然死すると無限に待ってシグナルでも死なない件

PHP

なんで今さら ZF1 やねんという話ですが、Zend_Http_Client_Adapter_Curl の timeout は接続のタイムアウトなので、Read/Write も含めたタイムアウトである request_timeout が未指定だと接続後に相手が突然死すると無限に待ちます。 ネットワーク経路のステ…

PHP 製のデータベースのスキーマ定義を差分で適用するツール「dbdatool」

データベースのスキーマ定義の変更、いわゆるデータベースのマイグレーションついて、スキーマ定義の差分を SQL とかそれ用の DSL とかで作成し、リポジトリ管理してマイグレーションツールで実環境に適応するのが多いと思います。 この方法はわかりやすくて…

Doctrine や Eloquent や CakePHP はいかにして差分更新を実現しているか

PHP

Doctrine や Eloquent や CakePHP などの ORM でDBからフェッチしたエンティティの一部の属性だけ変更して保存したとき、テーブルの行全体が更新されるわけではなく、変更した一部の属性だけが更新されますが、それがどう実装されているか気になったので調べ…

超長い文字列や配列でも実体が同じなら中身の大きさには依存しない

PHP

手元にあった PHP 7.1.10 で試してます。 PHP の配列で、連想配列なのかいわゆる添字が順序通りのただの配列なのかを調べるには、下記の方法が一番手っ取り早いと思います。 array_values($arr) === $arr; がしかし、配列の === は配列の要素の値の比較も行…

DIコンテナ使ってみて思った雑文:その2

アプリケーションにテーブルゲートウェイがあったとして、もちろんDB接続に依存している。 class UserTable { private $connection; public function __construct(Connection $connection) { $this->connection = $connection; } // select/insert/update/de…

DIコンテナ使ってみて思った雑文

アプリケーションの流れとして、 コンテナを構築 アプリを実行するなにか(パイプラインとかディスパッチャとか)をコンテナから取り出す リクエストオブジェクトを作成してアプリを実行 みたいな流れかなと思う。順番的にDIコンテナが先に作られるのでリク…

PHPUnit の Functions.php を自動でロードするやつ

下記↓の記事のコメントの通り、 PHPUnitの$this->assertXXXX() の別記法 - Qiita PHPUnit には Functions.php というファイルが含まれていて、これを require するとアサーションなどがグローバル関数に登録されるので、次のようにテストを書くことができま…

KeepAlive On な Apache+mod_php で HTTP/1.0 クライアントに HTTP/1.1 を返すとタイムアウトを待ってしまう

PHP 7.1.7 Apache 2.4.10 ApacheBench 2.3 zend-expressive 2.0.3 zend-expressive-skeleton 2.0.3 zend-diactoros 1.4.0 zend-stratigility 2.0.1 Docker で Apache+mod_php を実行して、 docker run --rm -p 8888:80 -v "$PWD:/var/www/html" php:apache h…

いろいろなフレームワークのリクエスト/レスポンスクラスの実装

PHP

今日日の PHP のフレームワークでリクエスト/レスポンスクラスがどのように実装されているか調べたメモ。 zend-expressive zend-diactoros https://github.com/zendframework/zend-expressive/blob/2.0.3/src/Application.php zendframework zend-http (not …

PhpStorm の Run/Debug で docker-compose run でテストを実行

docker-compose で複数のコンテナで構成されている環境に対して、PhpStorm の Run/Debug で docker-compose run でテストなどを実行できるようにしたときのメモ。 PhpStorm 2016.1 ぐらいから Remote interpreter に Docker が追加されており、PhpStorm の R…

Windows と Linux (*nix) のコマンドライン引数の違い

元は下記で回答したものですけど。。。 https://teratail.com/questions/33915 Linux でプログラムを実行するとき、最終的に次の関数が実行されます。 execve(2) int execve(const char *filename, char *const argv[], char *const envp[]); つまり、次のも…

正規表現再入門

PHP

最近ピザとかも出るようになった社内勉強会(仮)で発表した資料がでてきたので置いておきます。 正規表現再入門 先日、とあるサイトで再帰的パターンというものを知りまして、改めて PHP の PCRE のページを見てみると、知らない構文とか、知ってはいたけど…

PhpStorm の PHPSTORM_META でサービスロケーターとかを入力補完

先日 Twitter を眺めていたら、PhpStorm Advanced Metadata というものを知ったので使ってみました。 下記はいわゆる社内勉強会的ななにかで話したときのスライドです。 https://rawgit.com/ngyuki/31dd23f946ae1520dade/raw/index.html スライドの通りです…

Eclipse PDT + MakeGood でも SSH 経由で PHPUnit を実行する

PhpStorm 8 が正式にリリースされましたね。 PHP Remote Interpreters というものが実装されたので PHPUnit を SSH 経由で実行するのがとても簡単になりました。 が、少し触ってみたところちょっと微妙なことろもありました。下記の記事にも記載されています…

cmd.exe のコマンドラインの解釈と Windows と Linux のプロセス作成の違い

PHP の escapeshellarg の実装が Windows だと謎すぎたので調べていたら下記の記事にたどり着きました。 cmd.exe のコマンドラインの仕様を解析してみた - 永遠に未完成 わりと長いこと Windows を使っているつもりなのですが知らなかったこともあり、とても…

PhpStorm 7 で SSH 経由で PHPUnit を実行する

下記の記事によると PhpStorm 8 では SSH 経由で PHPUnit が実行できるようです。 Vagrantユーザに朗報!PhpStorm8ではPHPUnitをSSH経由で実行できる ホストが Windows で開発環境の VM が Linux(CentOS) なわたしは PhpStorm から PHPUnit が実行できるよう…

ストリームラッパーを使って素の PHP で自動エスケープ

PHP

素の PHP をテンプレートとして使うフレームワークは今でも結構あるようです。 素の PHP をテンプレートに使う、というのがどういうことかというと、簡単な例ですが次のようなものです。 index.php <html> <head> <meta charset="utf-8"> <title></title> </head> <body> Hello </body></html>