PHP: GNU Readline - Manual
PHP  
downloads | documentation | faq | getting help | mailing lists | | php.net sites | links | my php.net 
search for in the  
<pspell_suggestreadline_add_history>
view the version of this page
Last updated: Tue, 21 Dec 2004

XCVIII. GNU Readline

導入

readline() 関数はGNU Readline ライブラリへのイ ンターフェースを実装したものです。これらの関数は、コマンドラインの 編集機能を提供します。一例をあげると、Bash において文字を挿入した り、コマンド履歴を走査したりする際に矢印キーを使用することを可能に しているものです。このライブラリの対話的性質のためにWebアプリケー ションではあまり使用されていませんが、シェルで動作することを目的と したスクリプトを書く際には便利です。 このライブラリは対話的なものであるため、Webアプリケーションで使用 されることはほとんどないでしょう。しかし、 コマンドラインからPHPを使用 するスクリプトを書く際には有用でしょう。

注意: この拡張モジュールはWindows環境 では利用できません。

要件

readline関数を使用するには、libreadlineをインストールすることが必 要です。librealineは、にあるGNU Readlineプロ ジェクトのホームページから入手可能です。このライブラリは、Bash の 作者でもある Chet Ramey により管理されています。

この関数を非GPLのreadlineライブラリの代替品であるlibeditライブラ リで使用することも可能です。libeditライブラリは、BSDライセンスで 配布され、から入 手可能です。

インストール手順

この関数を使用するには、readlineサポートを有効にしてCGIまたはCLI版の PHPをコンパイルする必要があります。PHPのconfigureに --with-readline[=DIR]を指定する必 要があります。readlineの代替品であるlibeditを使用したい場合、PHPの configureに--with-libedit[=DIR]を 指定して下さい。

実行用の設定

この拡張モジュールは設定ディレクティブを全く定義しません。

リソース型

この拡張モジュールはリソース型を全く定義しません。

定義済みの定数

この拡張モジュールは定数を全く定義しません。

目次
readline_add_history -- ヒストリに1行追加する
readline_callback_handler_install -- Initializes the readline callback interface and terminal, prints the prompt and returns immediately
readline_callback_handler_remove -- Removes a previously installed callback handler and restores terminal settings
readline_callback_read_char -- Reads a character and informs the readline callback interface when a line is received
readline_clear_history -- ヒストリをクリアする
readline_completion_function -- 補完関数を登録する
readline_info -- 種々のreadlineの内部変数を取得/設定する
readline_list_history -- ヒストリのリスト
readline_on_new_line --  Inform readline that the cursor has moved to a new line
readline_read_history -- ヒストリを読み込む
readline_redisplay --  Ask readline to redraw the display
readline_write_history -- ヒストリを書きこむ
readline -- 1行読み込む


add a note add a note User Contributed Notes
GNU Readline
jeffrey at thompsonic dot com
22-Feb-2005 02:18
Here's an easy way without readline() if you don't have it compiled in already:

   $fp = fopen("php://stdin","r");
   $line = rtrim(fgets($fp, 1024);
jcl atNOSPAM jcl dot name
23-Nov-2004 05:40
Even better than 'plz at dont dot spam' in only one line :) :

@c:\\php\\cli\\php.exe script.php %*

Cheers,
Jean-Charles
plz at dont dot spam
08-Aug-2004 08:50
To get all arguments passed to a batch file in one variable
rather than using %1 %2 %3 etc;

:LOOP
if "%1" == "" goto DONE
set args=%args% %1
shift
goto LOOP
:DONE
@c:\\php\\cli\\php.exe script.php %args%
set args=
ds at NOSPAM dot undesigned dot org dot za
05-Dec-2003 04:04
You can open /dev/tty on unix systems or \con in windows, with ob_implicit_flush(true) to write output unbuffered.  Works like a charm :-)

-------------------------------

#!/usr/local/bin/php -q
<?php

set_time_limit
(0);
@
ob_end_flush();
ob_implicit_flush(true);

class
prompt {
  var
$tty;

  function
prompt() {
   if (
substr(PHP_OS, 0, 3) == "WIN") {
    
$this->tty = fOpen("\con", "rb");
   } else {
     if (!(
$this->tty = fOpen("/dev/tty", "r"))) {
      
$this->tty = fOpen("php://stdin", "r");
     }
   }
  }

  function
get($string, $length = 1024) {
   echo
$string;
  
$result = trim(fGets($this->tty, $length));
   echo
"\n";
   return
$result;
  }
}

echo
"Enter something or 'exit' to quit\n";
do {
 
$cmdline = new prompt();
 
$buffer = $cmdline->get("Something: ");
  echo
"You said: $buffer\n";
} while (
$buffer !== "exit");
echo
"Goodbye\n";

?>
jewfish at jewfish dot net
10-Jun-2002 11:05
There is a simpler way to do a multiline read than above:

function multiline() {
   while(($in = readline("")) != ".")
       $story .= ($PHP_OS == "WINNT") ? "\r\n".$in :
                                         "\n".$in;

   return $story;
}
joshua at neocodesoftware.com
21-Apr-2002 10:17
Here's an example simple readline-like way to input from command line on windows - the single line is from the multiline is something I added...

<?
function read () {
  
# 4092 max on win32 fopen

  
$fp=fopen("php://stdin", "r");
  
$in=fgets($fp,4094);
  
fclose($fp);

  
# strip newline
  
(PHP_OS == "WINNT") ? ($read = str_replace("\r\n", "", $in)) : ($read = str_replace("\n", "", $in));

   return
$read;
}

function
multilineread () {
   do {
      
$in = read();

      
# test exit
      
if ($in == ".") return $read;

      
# concat input
      
(PHP_OS == "WINNT") ? ($read = $read . ($read ? "\r\n" : "") . $in) : ($read = $read . "\n" . $in);

   } while (
$inp != ".");

   return
$read;
}

print(
"End input with . on line by itself.\n");

print(
"What is your first name?\n");
$first_name = multilineread();

print(
"What is your last name?\n");
$last_name = read();

print(
"\nHello, $first_name $last_name! Nice to meet you! \n");
?>
14-Apr-2002 02:17
[Ed. note: you can use fopen("php://stdin", "w") to achieve the same thing, works on both Windows and Unix)]

I wanted to get console input in a PHP script running on windows, so I made a little hack, which is so simple, it is clearly public domain.  What I did was write a C++ program to get a line, then output it.  Then all that is needed is to exec() that program and capture the output - readline() for windows.  The C++ source is as follows:

#include <iostream.h>
#include <string>
void main()
{
   string input;
   cin >> input;
   cout << input;
}

It works wonderfully for my purposes, since I love the PHP language and want to have console input.

Justin Henck
twebb at boisecenter dot com
04-Mar-2002 06:11
You'll probably need the --with-readline directive when configuring php to have the readline() functions available. 

If you've installed the readline libraries in /usr/local, add:

--with-readline=/usr/local

to your ./configure command.

<pspell_suggestreadline_add_history>
 Last updated: Tue, 21 Dec 2004
show source | credits | sitemap | contact | advertising | mirror sites 
Copyright © 2001-2005 The PHP Group
All rights reserved.
This unofficial mirror is operated at: /
Last updated: Mon Mar 14 08:13:06 2005 Local time zone must be set--see zic manual page