Php 如何在不破坏浏览器的情况下在页面上显示大量输入?

Php 如何在不破坏浏览器的情况下在页面上显示大量输入?,php,html,arrays,Php,Html,Arrays,我有一个包含产品列表的数组。每次我试图显示产品时,我的浏览器都会崩溃,因为数据太多了 $products = array(... 40000 products ...); ?> <table class="table table-bordered"> <thead> <tr> <th></th> <th>#</th>

我有一个包含产品列表的数组。每次我试图显示产品时,我的浏览器都会崩溃,因为数据太多了

$products = array(... 40000 products ...);
?>
<table class="table table-bordered">
    <thead>
        <tr>
            <th></th>
            <th>#</th>
            <th>Product name</th>
        </tr>
    </thead>
    <tbody>
    <?php foreach ($products as $product): ?>
        <tr>
            <td><input type="checkbox" /></td>
            <td><?= $product->id; ?></td>
            <td><?= $product->name; ?></td>
        </tr>
    <?php endforeach; ?>
    </tbody>
</table>
以上内容使我的浏览器崩溃。对于40000种产品来说,这并不意外。我唯一不知道的是,有什么更好的解决方案可以做到这一点。我需要列出所有这些产品

编辑


我不确定分页是否可行,因为我想使用jQuery搜索结果。这是一个可以让我从数据库中选择大量产品并将其导出到CSV的页面。

了解分页。这是展示所有产品的最佳方式

这是一个很棒的教程,我从中学习到了它。虽然有点旧,但它能很好地教授基础知识

另一种方法是使用AJAX。加载30个产品,让用户向下滚动页面。到达页面末尾时,再加载30个产品。
我相信这就是所谓的无限滚动Facebook新闻源风格。

使用分页或无限滚动选项来确保一次只加载chuncks

分页:

无限卷轴


呈现40000个项目时会出现可用性问题,这就是为什么许多站点使用分页和/或AJAX无限滚动的原因

也就是说,使用PHP呈现40000个项目对于浏览器来说是很好的。然而,为了实现这一点,在呈现许多项目时,需要考虑一些因素,包括PHP内存、响应时间等

除了呈现之外,由于您的目标是使其可搜索,因此问题可能在于客户端搜索代码性能,它需要将所有数据加载到可搜索的数据结构中。更有效的方法是在浏览器中获取搜索参数,并对数据库运行服务器端搜索,以显示匹配结果

以下是一些建议:

使用迭代器

要避免的第一件事是将如此多的项加载到内存中,例如通过创建一个包含许多项的数组。最好得到一个迭代器并循环使用它来限制内存使用

例如:

# Slow and consumes a lot of memory

$products = array();
for ($i=1; $i<=40000; $i++) {
    array_push($products, ['id' => $i,'name'=>'foobar']);
}

# Very fast and works fine on Chrome, Firefox, Safari

<table>
<?php for ($i; $i<=40000; $i++) { ?>
    <tr>
        <td><input type="checkbox" /></td>
        <td><?= $i; ?></td>
        <td><?= 'foobar'; ?></td>
    </tr>
<?php } ?>
</table>
使用数据库时,可以一次渲染每个项目,也可以渲染以下项目。确保查询本身的速度也很重要

<table>
<?php while($row = $stmt->fetch(PDO::FETCH_ASSOC)) { ?>
    <tr>
        <td><input type="checkbox" /></td>
        <td><?= $row['id']; ?></td>
        <td><?= $row['name']; ?></td>
    </tr>
<?php } ?>
</table>
使用轻量级数据结构

第二个要考虑的事情是尽可能轻地处理每一个项目。如果您有一个复杂的项,则需要为每个项实例化一个对象。如果有一个简单对象,则可以使用数组或关联数组

服务器端搜索与客户端搜索


在客户端上使用JavaScript/jQuery搜索这么多结果也可能是一个问题。对于这么多的结果,从浏览器获取搜索输入,使用具有适当索引的数据库查询在服务器端执行搜索,并只返回匹配项,这将更有效。

本例中最大的问题是输入字段。删除它们,即使一次显示50000行,性能也会大幅提高。

是否考虑过分页?分页。如果不这样做,浏览器将崩溃。我不认为有40.000行的html表对于浏览器来说太多了。它可以稍微慢一点滚动它,但绝对不应该崩溃。你尝试了哪些浏览器?@Marki555实际上只是firefox。可能是我的数据库是瓶颈吗?例如,尝试使用wget获取URL。然后您将看到php是否能够生成完整的输出。