Paizaで利用されている、PHPの標準入力が意味不明だったので調べました。本記事は、PHPの標準入力について、使い方だけでなく、もう少し背景を知りたい人向けに書いています。 標準入力って何?の答えは、PHP標準入力は、PHPが提供している一つの入力ストリームになります。
INDEX
ストリームとは?
平たく機能という認識で良いのではないでしょうか。入力、出力ストリームときたら、入出力の機能なんだという理解で良いと思います。 データを動的に読み込んでいく処理を水の流れに例えてストリームと呼んでいます。PHPでも1行ずつファイルを読みながら処理できたり、ファイル全部読み込んでから処理できたりしますが、前者の処理のことをストリーム処理と言います。
余談ですが、データ総量わかんない時は、ストリーム処理でやった方が無難です。ファイルが大きすぎるとサーバーが止まります。
PHPの標準入力とは何か
ストリーム処理の中の入力処理関数群の中の一つです。fgetsという関数の中にSTDINという標準入力の抽象データの定数をパラメータとしてセットします。
stdinはOSの為の識別子の標準入力の名前です。ファイルディスクリプタについて掘り下げます。
ファイルディスクリプタ
OSが入出力、エラーを制御する為の識別子のことをファイルディスクリプタと呼びます。標準入力はstdinと表されます。他に標準出力(stdout)、標準エラー(stderr) があります。
ストリームはKernelというOSのコアプログラムが制御しているため、稼働中のプログラムにファイルディスクリプタが設定されていて、0:stdinを入力、1:stdoutを出力、2: stderrとしています。
PHPで標準入力を利用する
標準入力は、キーボード入力を受け取れるので、LinuxOS上で動作する仕組みをPHPで組むことができます。出力と合わせて、シェルの作成とかもできます。LaravelのartisanやCakePHPのbakeは、この仕組みが利用されているんだと思います。
以下、利用方法を一応コードで書いて行きます。
<?php
$line = trim(fgets(STDIN));
fgetsの中に定数を入れれば利用できます。このline変数に対してデータが入ってきます。trim関数を利用しているのは、エンターキー押したときの改行コードが含まれてしまうので、除去するために利用しています。
PHPの標準入力で2行以上のデータを得たい時
先ほどの方法ですと、1行のデータしか取得ができませんよね。複数行データ取得したい時は当然出てきますので、複数行データ取得する時の方法を書いて行きます。
<?php
while($line = fgets(STDIN)) {
$stdinDatas[] = trim($line);
}
var_dump($stdinDatas);
whileで書けば取れます。回数決まってればforでも可能ですが、ストリームの良いとこなくなります。foreachは配列が来るわけではないので利用ができませんのでご注意ください。
以上で、PHPでの標準入力について調べた結果の共有となります。