php显示文件中包含大量行的所有行的最佳实践

ymdaylpp  于 2021-06-21  发布在  Mysql
关注(0)|答案(1)|浏览(320)

我有一个1.2mb的文件,里面有36k+行的文本,可能还在增长。问题是,我想显示input.txt中的所有行,但由于行太多,我在浏览器崩溃时得到了输出…到目前为止,我尝试的是:

<?php
    $handle = fopen("input.txt", "r");
      if ($handle) {
        while (($line = fgets($handle)) !== false) {
        echo '<li class="list-group-item d-flex justify-content-between align-items-center">'.$line.'</li>';
        }
    fclose($handle);
    } else {
         echo 'error';
      }
?>

这段代码适用于文件约40kb约1400KB的行任何更多的将导致崩溃。。。
在那之后,我想如果我把这个文件加载到db,然后连接php并从base获取数据,我就可以显示所有的行,但我又错了

<?php
            $conn = new mysqli($servername, $username, $password, $dbname);
            if ($conn->connect_error) {
                die("Connection failed: " . $conn->connect_error);
            } 
            $sql = "SELECT ime_pjesme FROM pjesme";
            $result = $conn->query($sql);
            if ($result->num_rows > 0) {
                while($row = $result->fetch_assoc()) {
                    echo '<li class="list-group-item d-flex justify-content-between align-items-center">'. $row["ime_pjesme"].'</li>';
                }
            } else {
                echo "0 results";
            }
            $conn->close();
            ?>

所以我的问题是,有没有什么方法可以让这些行显示在浏览器中,或者有没有方法加载这些行,然后显示50乘50等等?

bihw5rsg

bihw5rsg1#

是的,有一种方法可以一页一页地显示文件。
有许多库可以很好地为您实现这一点,但是为了理解这些机制,下面介绍如何使用jquery库和一些php来实现这一点。
简单地说,你需要两个文件。第一个将显示页面计数器/选择器以及行将出现的区域。假设一次需要50行:

$pages = floor(($rownumber + 50 - 1)/ 50);
print "<ul class=\"pageselect\">";
for ($i = 0; $i < $pages; $i++) {
    $p = $i + 1;
    print "<li data-page=\"{$p}\">Page {$p}</li>";
}
print "</ul>";

您可以组织css,使li元素都是漂亮的、居中的和水平的。然后使用jquery将事件处理程序附加到单击其中一个li,方法是在javascript中委托给父ul:

$('ul.pageselect').on('click', 'li', function() {
    var wanted = $(this).attr('data-page');
    $.post('/path/to/page_load.php', { page: wanted })
     .then(reply => {
           // "reply" is the object returned by the loader PHP.
           $('#lines').empty();
           for (var l = 0; l < reply.lines.length; l++) {
               $('#lines').append($('<p>').text(reply.lines[l]));
           }
     });
});

delegate函数对第二个php文件发出ajax post调用,并期望json回复(调用 reply 此处)待处理。
上述操作将杀死div的内容,例如 <div id="lines"></div> 并用尽可能多的p来填充它,因为在装入器回复中有行。
加载程序接收一个参数,即页码,将其转换为绝对行号,运行select并以json格式返回所有内容:

$from = (((int)$_POST['page'])-1) * 50;
if ($from < 0) { $from = 0; }
// Run a SELECT with OFFSET {$from},50 to fetch at most 50 rows

$reply = [
    'total' => $total, // use SQL_CALC_FOUND_ROWS to get the total number
    'lines' => [ ]
];
while ($rs->fetch(PDO::PDO_FETCH_ASSOC) as $line) {
    $reply['lines'] = "This line is {$line['text']}.";
}

header('Content-Type: application/json; charset=UTF8');
// Return JSON encoding of $reply to the caller.
exit(json_encode($reply));

您将发现浏览器工具对于检查ajax调用的情况非常有用。“加载器”文件,您将能够回收以后与大多数niftier库。

相关问题