简体   繁体   English

如何编写命令行交互式PHP脚本?

[英]How do I write a command-line interactive PHP script?

I want to write a PHP script that I can use from the command line. 我想编写一个可以从命令行使用的PHP脚本。 I want it to prompt and accept input for a few items, and then spit out some results. 我希望它提示并接受一些项目的输入,然后吐出一些结果。 I want to do this in PHP, because all my classes and libraries are in PHP, and I just want to make a simple command line interface to a few things. 我想在PHP中执行此操作,因为我的所有类和库都在PHP中,我只想创建一个简单的命令行界面来处理一些事情。

The prompting and accepting repeated command line inputs is the part that's tripping me up. 提示和接受重复的命令行输入是绊倒我的部分。 How do I do this? 我该怎么做呢?

The I/O Streams page from the PHP manual describes how you can use STDIN to read a line from the command line: PHP手册中的I / O Streams页面描述了如何使用STDIN从命令行读取一行:

<?php
 $line = trim(fgets(STDIN)); // reads one line from STDIN
 fscanf(STDIN, "%d\n", $number); // reads number from STDIN
?>

From PHP: Read from Keyboard – Get User Input from Keyboard Console by Typing : PHP:从键盘读取 - 通过键入来从键盘控制台获取用户输入

You need a special file: php://stdin which stands for the standard input. 你需要一个特殊的文件: php://stdin代表标准输入。

print "Type your message. Type '.' on a line by itself when you're done.\n";

$fp = fopen('php://stdin', 'r');
$last_line = false;
$message = '';
while (!$last_line) {
    $next_line = fgets($fp, 1024); // read the special file to get the user input from keyboard
    if (".\n" == $next_line) {
      $last_line = true;
    } else {
      $message .= $next_line;
    }
}

I'm not sure how complex your input might be, but readline is an excellent way to handle it for interactive CLI programs. 我不确定您的输入有多复杂,但readline是处理交互式CLI程序的绝佳方式。

You get the same creature comforts out of it that you would expect from your shell, such as command history. 您可以获得与shell相同的生物舒适度,例如命令历史记录。

Using it is as simple as: 使用它很简单:

$command = readline("Enter Command: ");
/* Then add the input to the command history */
readline_add_history($command);

If available , it really does make it simple. 如果可用 ,它确实使它变得简单。


Here a typical do-case-while for console implementation: 这是控制台实现的典型案例:

do {
  $cmd = trim(strtolower( readline("\n> Command: ") ));
  readline_add_history($cmd);
  switch ($cmd) {
    case 'hello': print "\n -- HELLO!\n"; break;
    case 'bye': break;
    default: print "\n -- You say '$cmd'... say 'bye' or 'hello'.\n";
  }
} while ($cmd!='bye');

where user can use arrows (up and down) to access the history. 用户可以使用箭头(向上和向下)访问历史记录。

I found an example on PHP.net, Utiliser PHP en ligne de commande : 我在PHP.net上找到了一个例子, Utiliser PHP en ligne de commande

$handle = fopen("php://stdin", "r");
$line = fgets($handle);
if (trim($line) != 'yes') {
...

One line of code (line 2): 一行代码(第2行):

<?php
    $name = trim(shell_exec("read -p 'Enter your name: ' name\necho \$name"));
    echo "Hello $name, this is PHP speaking\n";
    exit;

Checkout this answer's source in blog post How can I capture user input from the cmd line using PHP? 在博客文章中查看此答案的来源如何使用PHP从cmd行捕获用户输入? .

Simple: 简单:

#!/usr/bin/php
<?php
define('CONFIRMED_NO', 1);

while (1) {
    fputs(STDOUT, "\n"."***WARNING***: This action causes permanent data deletion.\nAre you sure you're not going to wine about it later? [y,n]: ");

    $response = strtolower(trim(fgets(STDIN)));
    if( $response == 'y' ) {
        break;
    } elseif( $response == 'n' ) {
        echo "\n",'So I guess you changed your mind eh?', "\n";
        exit (CONFIRMED_NO);
    } else {
        echo "\n", "Dude, that's not an option you idiot. Let's try this again.", "\n";
        continue;
    }
}

echo "\n","You're very brave. Let's continue with what we wanted to do.", "\n\n";

My five cents: Using STDOUT and STDIN : 我的五美分:使用STDOUTSTDIN

fwrite(STDOUT, "Please enter your Message (enter 'quit' to leave):\n");

do{
    do{
        $message = trim(fgets(STDIN));
    } while($message == '');

    if(strcasecmp($message, 'quit') != 0){
        fwrite(STDOUT, "Your message: ".$message."\n");
    }

}while(strcasecmp($message,'quit') != 0);
// Exit correctly
exit(0);

The algorithm is simple: 算法很简单:

until done:
    display prompt
    line := read a command line of input
    handle line

It's very trivial to use an array that maps commands to callback functions that handle them. 使用将命令映射到处理它们的回调函数的数组非常简单。 The entire challenge is roughly a while loop, and two function calls. 整个挑战大致是一个while循环,还有两个函数调用。 PHP also has a readline interface for more advanced shell applications. PHP还有一个用于更高级shell应用程序的readline接口

Basically you read from standard input. 基本上你从标准输入读取。 See Input/output streams . 请参阅输入/输出流

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM