PHP最佳实践,显示包含enormus行数的文件中的所有行

时间:2018-07-20 16:33:16

标签: php mysql string file

我有一个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约1400行的文件,否则将导致崩溃...

在那之后,我想如果我将该文件加载到db,然后用php conn并从基数中获取数据,我将能够显示所有行,但是我又错了

            <?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?

1 个答案:

答案 0 :(得分:1)

是的,有一种方法可以一次显示文件一页。

有许多库可以很好地满足您的需要,但是要了解其机制,这里是仅使用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通过委托给父UL(使用Javascript)将事件处理程序附加到对这些LI之一的单击上:

$('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]));
           }
     });
});

委托函数对第二个PHP文件发出AJAX POST调用,并期望将处理JSON答复(此处称为reply)。

以上内容将杀死诸如<div id="lines"></div>之类的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库回收“加载程序”文件。