【问题标题】:How to read STDIO stream in PHP如何在 PHP 中读取 STDIO 流
【发布时间】:2015-12-01 10:39:07
【问题描述】:

我需要通过 PHP 读取输入流。

响应对象:

Serial Object
(
    [_device] => \.\com4
    [_windevice] => COM4
    [_dHandle] => Resource id #23
    [_dState] => 2
    [_buffer] => 
    [_os] => windows
    [autoflush] => 1
)

我需要从 [_dHandle] => Resource id #23 中提取信息。我已经提取元数据

stream_get_meta_data($serial->_dHandle)

发现如下:

Array
(
    [wrapper_type] => plainfile
    [stream_type] => STDIO
    [mode] => r+b
    [unread_bytes] => 0
    [seekable] => 1
    [uri] => \.\com4
    [timed_out] => 
    [blocked] => 1
    [eof] => 
)

请建议我如何从该资源 ID 中提取数据:#23

谢谢。

【问题讨论】:

    标签: php stream stdio


    【解决方案1】:

    这取决于它是什么类型的资源。你可以使用函数

    get_resource_type() 在 _dHandle 上,然后根据资源类型使用适当的函数来读取它。

    如果是流则可以使用fopen、fread等,如果是mysql则使用mysql函数,如果是xml则使用xml读取函数等。

    更改您的代码

    这是错误的代码更改

    $stdin = fopen('php://stdin', 'r');
    $res = stream_get_contents($stdin, -1, 10);`
    

    $stream = fopen($serial->_dHandle, 'r');
    echo stream_get_contents($stream, -1, 10);
    fclose($stream);
    

    如果 $stream 为 false 则无法打开,如果有指针则表示连接已打开。然后,如果 stream_get_contents() 没有返回数据,则意味着它不可用或尚未发送。

    【讨论】:

    • get_resource_type 返回 stream。我尝试了 fopen(),它返回“无法打开流”。 fread() 用于无限加载。
    • 所以这意味着资源已损坏,您将无法打开它。您也可以尝试php.net/manual/en/streamwrapper.stream-open.php,但它不会改变任何东西。是socket流吗?
    • 使用 php 你也可以通过$stdin = fopen('php://stdin', 'r');访问流
    • 感谢@Robert 抽出宝贵时间。我在这里真的很累。使用 php://stdin,现在显示:resource(24) of type (stream)
    • 因为当您打开 fopen 时,您需要使用诸如 fread 或 stream_get_contents($handle, -1, 10); 之类的读取函数来读取它;然后 fclose($handle);
    猜你喜欢
    • 2021-12-17
    • 1970-01-01
    • 2014-11-05
    • 1970-01-01
    • 1970-01-01
    • 2011-07-02
    • 2021-11-10
    • 2016-06-11
    • 1970-01-01
    相关资源
    最近更新 更多