Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用PHP在Windows上以非阻塞模式读取终端输入_Php_Windows - Fatal编程技术网

使用PHP在Windows上以非阻塞模式读取终端输入

使用PHP在Windows上以非阻塞模式读取终端输入,php,windows,Php,Windows,我正在尝试在Windows上以非阻塞模式读取。在linux上工作的以下操作在Windows上不起作用: stream_set_blocking(STDIN, false); $characters = stream_get_contents(STDIN); 你知道怎么做吗 PHP不允许在windows下使用它,因为windows不支持POSIX流。只有直接使用C API才能实现。幸运的是,PHP自PHP7.4以来提供了一个名为FFI的新API 可以使用以下C函数执行此操作: GetStdHa

我正在尝试在Windows上以非阻塞模式读取。在linux上工作的以下操作在Windows上不起作用:

stream_set_blocking(STDIN, false);
$characters = stream_get_contents(STDIN);

你知道怎么做吗

PHP不允许在windows下使用它,因为windows不支持POSIX流。只有直接使用C API才能实现。幸运的是,PHP自PHP7.4以来提供了一个名为FFI的新API

可以使用以下C函数执行此操作:

  • GetStdHandle
    :获取句柄(将其视为流)
  • SetConsoleMode
    :允许您更改控制台模式(必需,可能的值为
    ENABLE_WINDOW_INPUT | ENABLE_PROCESSED_INPUT
    ),您可能希望在之后恢复控制台模式,但要执行此操作,您需要先使用
    GetConsoleMode
  • GetNumberOfConsoleInputEvents
    :没有“非阻塞”功能,但您可以知道缓冲区中是否有内容(如果缓冲区中有内容,下一个功能将不会阻塞)
  • ReadConsoleInput
    :获取缓冲输入数组。请注意,这个函数实际上是
    ReadConsoleInputW
    ReadConsoleInputA
    在真正的API中,ReadConsoleInput只是一个别名
您还需要定义这些函数使用的所有类型。由于缺乏文档和windef的大量重新定义,这很难做到。这就是为什么我建议您看一下下面的要点,其中包含一个示例、所有必需的定义和许多查找参考资料的链接


PHP不允许在windows下使用它,因为windows不支持POSIX流。只有直接使用C API才能实现。幸运的是,PHP自PHP7.4以来提供了一个名为FFI的新API

可以使用以下C函数执行此操作:

  • GetStdHandle
    :获取句柄(将其视为流)
  • SetConsoleMode
    :允许您更改控制台模式(必需,可能的值为
    ENABLE_WINDOW_INPUT | ENABLE_PROCESSED_INPUT
    ),您可能希望在之后恢复控制台模式,但要执行此操作,您需要先使用
    GetConsoleMode
  • GetNumberOfConsoleInputEvents
    :没有“非阻塞”功能,但您可以知道缓冲区中是否有内容(如果缓冲区中有内容,下一个功能将不会阻塞)
  • ReadConsoleInput
    :获取缓冲输入数组。请注意,这个函数实际上是
    ReadConsoleInputW
    ReadConsoleInputA
    在真正的API中,ReadConsoleInput只是一个别名
您还需要定义这些函数使用的所有类型。由于缺乏文档和windef的大量重新定义,这很难做到。这就是为什么我建议您看一下下面的要点,其中包含一个示例、所有必需的定义和许多查找参考资料的链接