メシのタネ

めしのたねになるIT情報配信サイト


PHPで標準入力を行う方法

,

  1. Webプログラム
  2. PHP
  3. PHPで標準入力を行う方法

Paizaで利用されている、PHPの標準入力が意味不明だったので調べました。本記事は、PHPの標準入力について、使い方だけでなく、もう少し背景を知りたい人向けに書いています。 標準入力って何?の答えは、PHP標準入力は、PHPが提供している一つの入力ストリームになります。

ストリームとは?

平たく機能という認識で良いのではないでしょうか。入力、出力ストリームときたら、入出力の機能なんだという理解で良いと思います。 データを動的に読み込んでいく処理を水の流れに例えてストリームと呼んでいます。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での標準入力について調べた結果の共有となります。



“PHPで標準入力を行う方法” への1件のコメント

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

This site uses Akismet to reduce spam. Learn how your comment data is processed.

若い頃、「仕事中にハマったこと」や「誰かに共有したい技術的な気づき」をアウトプットしたくてブログを始めましたが、勢い任せでよく分からない記事を大量生産し、あえなく飽きて終了。

改めて今、キャリア15年分の経験や知識が、これからITエンジニアを目指す方や、同じような課題で悩んでいる現役エンジニアの「メシのタネ」になるような記事を残したいと思っています。
※過去の記事は見ると精神が崩壊するため、そっとしておいてください。

🛠 経歴という名の珍道中:
文系Fラン → 広告営業 → Web営業 → 通信営業 → Web進行 → 出版 → Web媒体運用 → ソフトウェアハウス → SES → フリーランス

専門教育も受けず、転職歴も多数。履歴書はまるで時系列の事故記録のようですが、試行錯誤を重ね、なんとかエンジニアとして食べています。

このブログでは、そんな「履歴書クラッシャー型エンジニア」が送る、
名古屋一敷居の低い、実務に役立つ技術ブログを目指します。

PHP
魔王と行く! / Interface / Polymorphism / Ontology 深淵ガイドNew!!
Laravel
Laravel 12、「コード 1 行も書き換えず未来へ」──静かな革命の手順書New!!
Laravel
LaravelのMiddlewareって意味あるの?仕組み・使いどころ・やらかしまで整理してみたNew!!
Laravel
ServiceProviderって何してるの?DIの背後で動いてるやつの正体New!!
Laravel
LaravelのサービスコンテナとDI、「書いてるだけで動く」コードの正体
Laravel
Laravelのアーキテクチャ、実は誰もわかってない説