我需要测试我的PHP脚本是否正确地处理了我的GUSICE请求中的READ_TIMEOUT选项.所以我写了两个PHP脚本,一个用GUZLE调用另一个,我想用这种方式来实现超时.但出于某种原因,我没有得到暂停.该文档指出,只有当stream设置为True和使用CurlHandler时,超时才起作用,但我已经验证了这两种情况.可能是我的服务器部分做得不好,所以真的没有发送数据?或者为什么超时不起作用?我有几个版本的脚本,现在我使用这个版本. 客户端:

<?php

require 'vendor/autoload.php';

use GuzzleHttp\Client;
use GuzzleHttp\Exception\RequestException;

$client = new Client(["read_timeout"=> 2, "stream" => true]);

try {
    $response = $client->request('GET', 'http://localhost:8002/server_test.php', [
        'stream' => true,
        'read_timeout' => 2  // Just the read timeout
    ]);

    $body = $response->getBody();

    while (!$body->eof()) {
        echo $body->read(1024);
    }

} catch (RequestException $e) {
    echo "Error: " . $e->getMessage();
}
?>

服务器端:

<?php

// Stream the response
$stream = fopen('php://output', 'w');

$start_time = time();

// Stream data with delay
for ($i = 0; $i < 3; $i++) {
    fwrite($stream, "Data chunk $i\n");
    sleep(6); 
}

$data = "\nStart time: $start_time\nEnd time: " . time();
fwrite($stream, $data);
fclose($stream);
?>

客户端脚本正在调用服务器脚本,应该会超时,因为服务器脚本在发送数据块之间等待6秒.然而,没有发生超时.

推荐答案

CurlHandler似乎有no streaming support,read timeout没有curl 选项(timeoutconnect timeout除外).如果在建立连接之前不一定需要超时而不启动,则可能需要使用timeout选项.

$client = new Client();
$handler = new CurlHandler();
$response = $client->request('GET', '/lengthy.php', [
    'timeout' => 5,
    'handler' => $handler
]);

将在超时时工作并抛出GuzzleHttp\Exception\ConnectException(收到0个字节).

如果您绝对需要超时为read timeout(不包括连接时间),您仍然可以使用:

$client = new Client();
$handler = new StreamHandler();
$response = $client->request('GET', '/lengthy.php', [
    'read_timeout' => 5,
    'handler' => $handler
]);

这将在超时时抛出RuntimeException.但请注意,在传输第一个字节之前不会开始超时.我不得不在我的lengthy.php中明确地使用flush()才能做到这一点.

到目前为止,我还没有找到访问超时之前收到的数据的方法.

使用异步请求(并监控它们)可能是解决超时问题的另一种 Select .

Php相关问答推荐

以编程方式更改新订单、已取消订单和失败订单的邮箱WooCommerce通知

使用箭头函数语法时,在回调范围内无法访问变量变量(警告:未定义的变量)

闭包绑定$This和垃圾收集器

Laravel:如何展平多维Eager 加载的集合

laravel中获取的数据会自动更改时间戳值

如何从WooCommerce checkout 帐单邮箱字段中删除星号?

根据WooCommerce中的自定义用户元数据值更改用户角色

WooCommerce产品页面上没有产品详细信息

WooCommerce 相关产品(按 children 类别)作为排名数学主要类别的后备

woocommerce checkout 页面上的自定义字段

Laravel Eloquent(where 子句)

为WooCommerce中的运输方式ID设置必填的 checkout 订单备注字段

Laravel使用另一张表进行关联查询

如何通过工厂为点列制作一个假坐标?

如何从 PHP 中的 .txt 文件中列出今天生日的人的姓名?

PHP 合并/合并多维数组

laravel 中的 OrderBy json 列

将样式文件或脚本引入WordPress模板

列表不在 GROUP BY 子句中并且包含 X2CRM 中的非聚合列

路由未定义的 laravel 导出