2014-09-02 59 views
1

我有一個用PHP構建的簡單的命令行工具,它工作的很好。不幸的是,我們現在有一些不太聰明的用戶在處理數據時敲擊鍵盤。如何在PHP控制檯應用程序中刷新STDIN?

有沒有辦法刷新STDIN,所以它只能開始緩衝從我使用fgetc時的數據?

我試過打開我自己的STDIN管道,甚至通過循環通過那裏有哪些作品,但不處理多個CRs沖洗緩衝區。

倒帶和fseek似乎沒有用PHP中的STDIN做任何事情。

似乎這將是一個普遍的問題,但沒有太多。

PHP版本5.3.3

(我不希望使用ncurses的,如果我沒有)

任何與fgets或龜etc會表現出我的問題。例如,如果您有提示表明某些內容處於「正在處理」狀態,然後開始輸入,則輸入緩衝在STDIN中,因此當您實際提示用戶稍後輸入某些內容時,它們將添加到緩衝區中。因此,如果他們在「處理」時鍵入「abc」,然後提示輸入的內容是「abc」,以及在fgets或fgetc時提示輸入的內容。所以如果有人一直敲擊ENTER並且你正在使用fgets(或者fgetc爲「\ n」跳躍),那麼你會得到過早的代碼延續。

例如:

echo "Processing"; 
sleep(10); // HIT ENTER A FEW TIMES HERE 
echo "Input Something: "; 
// REALLY NEED TO FLUSH STDIN HERE SOMEHOW 
fgets(STDIN); 
+0

我沒有得到問題。你能展示一個簡單的代碼示例以及它應該做什麼? – hek2mgl 2014-09-02 13:07:43

+0

PHP根本就沒有線程,我很好奇誰會認爲在Python上編寫CLI util util是一個好主意,或者Java ......用線程技術你可能不會遇到這個問題,米不能確定問題是什麼.. – 2014-09-02 13:08:21

+0

@ RaggaMuffin-420這與線程有關嗎? – hek2mgl 2014-09-02 13:21:11

回答

1

似乎PHP「readline」是一個很好的方法來處理這個問題,我將與它一起。

謝謝,所有!

+0

你能解釋它是如何工作的嗎?至少這個例子不起作用:http://pastebin.com/24d9v3HL – hek2mgl 2014-09-02 14:06:02

-2

你試過每次提示後關閉STDIN流?我認爲這是Composer的寫作方式。所以基本上你會去fopen()fgetc()fclose()....直到下一個提示。適用於我,但我在PHP 5.5

+0

雖然你可以在stdin的句柄上調用'fclose()',但是你不能真正關閉它,因爲php解釋器仍然保留stdin。這個答案顯然是錯誤的 – hek2mgl 2014-09-02 13:16:01

+0

在任何情況下都不優雅。 – 2017-05-17 12:43:21

0

更好的後期則從來沒有,但你應該能夠使用stream_select

<?php 

    while(stream_select($in = [STDIN], $out = [], $oob = [],0)){ 
     fgetc(STDIN); 
    } 

?> 

基本上這將看看是否有給定的流可用,如果是從中讀取數據(和做與它無關)

之後,你可以從標準輸入讀取得到你想要的輸入

相關問題