【发布时间】:2018-03-01 16:17:40
【问题描述】:
我目前正在实现一个获取图像文件并在本地缓存它们的 PHP 类。这些图像可能来自其他本地来源,通过 HTTP 或使用 Guzzle 客户端的 HTTP。使用 PHP 流包装器,我应该能够以相同的方式处理所有源。
如果没有数据通过流传输,我现在要做的是实现超时。这应该处理以下情况:
- 首先无法建立流。这可能应该在
fopen调用中处理,而不是超时。 - 流已建立,但未传输数据。
- 流已建立,数据已传输,但在传输过程中会停止一段时间。
我想我可以使用 stream_set_timeout 完成所有这些操作,但我不太清楚这实际上是做什么的。如果流上的任何操作花费的时间超过允许的时间,超时是否适用,即我可以执行两次需要 0.5 秒且超时为 0.75 秒的事情?还是仅当没有数据通过流传输超过允许的时间时才适用?
我试图用这个简短的脚本测试行为:
<?php
$in = fopen('https://reqres.in/api/users?delay=5', 'r');
$out = fopen('out', 'w');
stream_set_timeout($in, 1);
stream_copy_to_stream($in, $out);
var_dump(stream_get_meta_data($in)['timed_out']);
虽然来自reqres.in 的响应延迟了 5 秒,但我总是得到false 的超时时间为 1 秒。请问有人能解释一下吗?
【问题讨论】:
-
@Sammitch 对于
timeout,它显示“读取超时以秒为单位”。这和stream_set_timeout一样吗?读取超时是否意味着如果没有读取任何内容或读取时间超过超时时间,则适用超时? -
@rndus2r 这可能是一种方式。我会试一试。谢谢!