Php json_解码-如何在GuzzleHttp asnyc请求中加速它

Php json_解码-如何在GuzzleHttp asnyc请求中加速它,php,json,guzzle,Php,Json,Guzzle,在我的应用程序中,我使用的是GuzzleHttp库,但这可能不是问题所在,但说起来并不好 每一分钟(使用cron)我都需要从40多个地址获取数据,所以我使用guzzlehttplib尽可能快 狂饮代码: $client = new Client(); $rectangles = $this->db->query("SELECT * FROM rectangles"); $requests = function ($rectangles) { foreach($rectang

在我的应用程序中,我使用的是GuzzleHttp库,但这可能不是问题所在,但说起来并不好

每一分钟(使用cron)我都需要从40多个地址获取数据,所以我使用guzzlehttplib尽可能快

狂饮代码:

$client = new Client();
$rectangles = $this->db->query("SELECT * FROM rectangles");

$requests = function ($rectangles)
{
    foreach($rectangles as $rectangle)
    {
       // some GEO coords (It's not important)
       $left   = $rectangle["lft"];
       $right  = $rectangle["rgt"];
       $top    = $rectangle["top"];
       $bottom = $rectangle["bottom"];

       $this->indexes[] = $rectangle;

       $uri = "https://example.com/?left=$left&top=$top&right=$right&bototm=$bottom";
            yield new Request("GET", $uri);
   }
})

当然,我做了一个基准

1. getting data from another server 0.000xx sec
2. json_decode 0.001-0.0100 (this is probably the problem :-()
整个代码大约需要6-8秒。这取决于远程服务器上的数据量

我一直认为Guzzle是异步执行请求的,所以它需要时间作为最长的请求

(最慢的请求=200毫秒==所有请求=200毫秒)-但这可能不是真的!或者我做错了什么

我在json_解码中使用了关联数组(我觉得这是1秒的加速(我不确定…)

我的问题是,我可以对这段代码进行更多优化并加快速度吗?

我想让它成为最慢的请求之一(0.200秒)

PS:我从URL获得的数据只是长JSON。谢谢


编辑:我将'concurrency'=>5更改为'concurrency'=>100,现在持续时间约为2-4秒。要开始,请将池配置中的
concurrency
值增加到需要发送的请求总数。这应该很好,事实上可能会让你更快

关于以毫秒为单位加快json_解码的速度,这可能取决于很多因素,包括处理json的服务器上使用的硬件以及json数据的不同大小。我不认为在PHP中可以通过编程来加速核心函数。不过我可能错了

代码的另一部分是:
$this->data=array\u merge($this->data,$alerts)您可以尝试改用循环

您还将对array_filter执行双重工作,其中在array_合并之前,在内部迭代数组

因此,不是:

if ($carray["data"] != null) {
    $alerts = array_filter($carray["data"], function($alert) {
        return $alert["type"] == 'xxx';
    });

    $this->data = array_merge($this->data, $alerts);
    $this->total_count += count($alerts);
}
也许可以试试这个:

if ($carray["data"] != null) {
    foreach ($carray["data"] as $cdata) {
        if ($cdata["type"] == 'xxx') {
            $this-data[] = $cdata;
            $this->total_count++;
        }
    }
}

首先,将池配置中的
并发性
值增加到需要发送的请求总数。这应该很好,事实上可能会让你更快

关于以毫秒为单位加快json_解码的速度,这可能取决于很多因素,包括处理json的服务器上使用的硬件以及json数据的不同大小。我不认为在PHP中可以通过编程来加速核心函数。不过我可能错了

代码的另一部分是:
$this->data=array\u merge($this->data,$alerts)您可以尝试改用循环

您还将对array_filter执行双重工作,其中在array_合并之前,在内部迭代数组

因此,不是:

if ($carray["data"] != null) {
    $alerts = array_filter($carray["data"], function($alert) {
        return $alert["type"] == 'xxx';
    });

    $this->data = array_merge($this->data, $alerts);
    $this->total_count += count($alerts);
}
也许可以试试这个:

if ($carray["data"] != null) {
    foreach ($carray["data"] as $cdata) {
        if ($cdata["type"] == 'xxx') {
            $this-data[] = $cdata;
            $this->total_count++;
        }
    }
}

您是否尝试过将
'concurrency'=>5、
更改为更大的数字?如果我理解它定义了在给定时间允许运行的连接数。呵呵,这很好,现在需要2-3秒,但我想进一步优化它。。。我想这是可能的:-D(时间在这个应用程序中非常重要)-谢谢@Sebastianforsbergha您是否尝试过将
'concurrency'=>5、
更改为更大的数字?如果我理解它定义了在给定时间允许运行的连接数。呵呵,这很好,现在需要2-3秒,但我想进一步优化它。。。我想这是可能的:-D(时间在这个应用程序中非常重要)-谢谢@Sebastianforsberg这就是我要找的,我仍然不确定过滤器是否正确(我还没有看到数据调情,即使它们被过滤过一次)@Sebastianforsberg这就是我要找的,我仍然不确定过滤器是否正确(我还没有看到数据调情,即使它们被过滤过一次)@塞巴斯蒂安福斯伯格