目标:在cmd中运行一个PHP文件,脚本循环x次并在每次迭代时检查用户是否输入了任何输入(stream_select()和STDIN),如果是这样 - 暂停循环直到用户输入,然后打印出输入并继续迭代。为什么当cmd.exe失去焦点时,STDIN上的stream_select变为阻塞状态?
问题:只要cmd.exe窗口处于焦点状态,脚本就会完美运行 - 当我单击另一个窗口时,脚本在stream_select
处暂停,直到I后才会继续,但cmd窗口重新聚焦并发送一些输入(一个简单的输入按键就可以做到这一点)。没有错误。
问题:为什么失去对cmd的关注会影响stream_select并阻止循环? ...有没有解决方法? (例如,可以检查当前cmd窗口是否在焦点?)
代码示例,在工作目录中使用cmd php script.php
。
<?php
$loopCount = 20;
while ($loopCount) {
$start = microtime(true);
echo 'check on "' . $loopCount . '"' . PHP_EOL;
$stream = fopen('php://stdin', 'r');
$stream_array = array($stream);
$write = array();
$except = array();
if (stream_select($stream_array, $write, $except, 1, 0)) {
$input = trim(fgets($stream));
if ($input) {
echo 'input was "' . $input . '"' . PHP_EOL;
}
}
fclose($stream);
echo $loopCount . ' in ' . (microtime(true) - $start) . PHP_EOL;
$loopCount--;
}
事情我都试过,没有运气:
- 移动
fopen
和fclose
外循环 ignore_user_abort(1);
stream_set_blocking($stream, 0);
null
,0
和较高两种tv_sec
和tv_usec
值参数stream_select()
- 检查connection_aborted()和connection_status()
环境:Windows 7,XAMPP for Windows中,PHP 5.4.19(CLI),Zend引擎V2.4.0