【问题标题】:Laravel : Fetch big Data from Api (URL)Laravel:从 Api (URL) 获取大数据
【发布时间】:2020-05-05 12:05:37
【问题描述】:

Hwllo 请我尝试从我使用 guzzle 和 file_get_contents 的 api 获取 15000 个对象,但这需要很长时间,有时页面无法完全加载。 控制器:

$client = new \GuzzleHttp\Client();
        $request = $client->get('http://XXX');
        $response = $request->getBody();
        $books = json_decode($response, true);

        return view('n.search', compact('books'));

books 变量返回 10000 个项目并且需要很长时间才能加载! 你能帮我解决这个问题吗?

【问题讨论】:

  • 可能是您已经达到执行时间限制,这就是不再加载内容的原因。我建议你使用分页。分页对于提高请求的性能非常重要。不建议在一次请求中获取所有数据,除非您的数据只有 100 或更少。
  • 如果您有示例,请与我分享!我尝试使用 DataTable,但由于页面没有完全加载,标签没有关闭
  • Stack Overflow 不是代码编写服务。我们总是乐于帮助和支持新的编码员,但您首先需要帮助自己。您应该尝试自己编写代码。请阅读How to create a Minimal, Reproducible ExampleHow do I ask a good question?

标签: laravel api bigdata


【解决方案1】:

这是一个示例,只是为了让您了解我是如何解决此类问题的。

在您的控制器中,您应该始终对返回的集合进行分页。如下所示

$users = User::all()->paginate(100);

laravel 将返回这 20 个用户以及一些数据,例如下一个 url、上一个 url、current_page 等。这些附加信息很重要,以便您知道下一个 url 和上一个 url 是什么(这些 url 将在您的api 请求);

现在,在得到分页用户后,还需要统计总用户数并与用户一起返回,这样前台就知道它会显示多少页。像下面这样

$total_users = User::all()->count();

现在您的最终控制器将如下所示。

public function getUsers() {
    $users = User::all()->paginate(20);
    $total_users = User::all()->count();

    return compact('users', 'total_users');
}

它会返回这些结果。

users    // the 20 users
total_users // the total number of users in your table
currentPage
lastPage
perPage
hasMorePages
url
nextPageUrl
firstItem
lastItem
total
count

因此,每次单击数据表中的页面时,只需在 api 请求中使用 nextPageUrl 和 prevPageUrl 作为 url。

【讨论】:

  • 我明白了,谢谢
  • $client = new \GuzzleHttp\Client(); $request = $client->get('XXX'); $response = $request->getBody(); $books = json_decode($response, true);返回视图('n.search',紧凑('books')); books 变量返回 10000 个项目并且需要很长时间才能加载
  • 如果我的回答能让您了解如何处理数据表中的分页,请点赞
  • 是的,但前提是我有一个模型作为数据源(数据库),在我的例子中,我有 URL JSON 作为数据源!
  • URL JSON 作为数据源是什么意思?
猜你喜欢
  • 2020-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-16
  • 1970-01-01
  • 2019-03-17
  • 2015-03-19
  • 1970-01-01
相关资源
最近更新 更多