【发布时间】:2014-02-23 05:25:39
【问题描述】:
目标:在 cmd 中运行 PHP 文件,脚本循环 x 次,并在每次迭代时检查用户是否输入了任何输入(stream_select() 和 STDIN),如果是,则暂停循环,直到用户按 Enter ,然后打印出输入并继续迭代。
问题:只要 cmd.exe 窗口处于焦点状态,脚本就会完美运行 - 当我单击另一个窗口时,脚本会在 stream_select 处暂停并且不会继续,直到我但 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 Engine v2.4.0
【问题讨论】:
标签: php stream command-line-interface stdin blocking