2010-05-28 71 views
16

Tôi muốn viết một tập lệnh php mà tôi có thể sử dụng từ dòng lệnh. Tôi muốn nó để nhắc và chấp nhận đầu vào cho một vài mục, và sau đó nhổ ra một số kết quả. Tôi muốn làm điều này trong php, bởi vì tất cả các lớp và thư viện của tôi đều nằm trong php, và tôi chỉ muốn tạo một giao diện dòng lệnh đơn giản cho một vài thứ.Tôi làm cách nào để viết tập lệnh php tương tác dòng lệnh?

Các đầu vào dòng lệnh nhắc và chấp nhận lặp đi lặp lại là phần bắt đầu tôi. Làm thế nào để tôi làm điều này?

Trả lời

12

Từ PHP: Read from Keyboard – Get User Input from Keyboard Console by Typing:

Bạn cần một tập tin đặc biệt: php://stdin viết tắt của đầu vào tiêu chuẩn.

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; 
    } 
} 
17

Các I/O Streams trang từ hướng dẫn PHP mô tả cách bạn có thể sử dụng STDIN để đọc một dòng từ dòng lệnh:

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

Các thuật toán rất đơn giản:

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

Nó rất tầm thường sử dụng một Array() mà các bản đồ lệnh để gọi lại chức năng có thể xử lý chúng. Toàn bộ thử thách là một vòng lặp ngắn và hai cuộc gọi hàm, PHP cũng có một số readline interface cho các ứng dụng vỏ nâng cao hơn.

+0

Phần "đọc dòng lệnh đầu vào" sẽ chuyển tôi lên. Làm thế nào để bạn nhận được nó liên tục thăm dò ý kiến ​​người sử dụng đầu vào? – user151841

+0

Thông thường nó được thực hiện một cái gì đó như trong khi ($ line = readline ($ promptstring)); các chi tiết nhỏ về cơ bản là số lượng loại kiểm tra lỗi bạn muốn và cách người dùng yêu cầu thoát. Hãy xem các hàm fgets() và readline() trong hướng dẫn sử dụng. – TerryP

9

Tôi không chắc chắn như thế nào phức tạp đầu vào của bạn có thể được, nhưng readline là một cách tuyệt vời để xử lý nó cho các chương trình CLI tương tác.

Bạn nhận được cùng một tiện nghi sinh vật trong số đó mà bạn mong đợi từ trình bao của mình, chẳng hạn như lịch sử lệnh.

Sử dụng nó cũng đơn giản như:

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

If available, nó thực sự không làm cho nó đơn giản.

+0

Cách tốt nhất để triển khai [CLI - Giao diện dòng lệnh] đơn giản (https://en.wikipedia.org/wiki/Command-line_interface)! –

1

đơn giản:

#!/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"; 
1

My lăm cent: Sử dụng 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); 
Các vấn đề liên quan