Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
显示大型数据集(PHP)的最佳方式是什么_Php_Large Data - Fatal编程技术网

显示大型数据集(PHP)的最佳方式是什么

显示大型数据集(PHP)的最佳方式是什么,php,large-data,Php,Large Data,我有一个函数,可以连接到大约1000多个数据库,然后将数据取回并放入阵列中 但是,数据太大了,我想在每次循环通过连接时在浏览器上显示结果,而不是等待整个循环完成 或者如果有更好的方法,请分享 function Get_data() { // loop base on the number of available databases for ($i = 0; $i < count($client_databases); $i++) { // Getting co

我有一个函数,可以连接到大约1000多个数据库,然后将数据取回并放入阵列中

但是,数据太大了,我想在每次循环通过连接时在浏览器上显示结果,而不是等待整个循环完成

或者如果有更好的方法,请分享

function Get_data()
{
 // loop base on the number of available databases
    for ($i = 0; $i < count($client_databases); $i++) {

        // Getting connection for each database
        $database = $this->connect_clients_db($client_databases[$i]);

       // return an array of data from the database
        $ClientShema = $this->getSomeData($database);

        // put the data in array
         $schemas[]=$ClientShema;
    }


     return $schemas;


}
函数Get_data() { //循环基于可用数据库的数量 对于($i=0;$iconnect_clients_db($client_databases[$i]); //从数据库返回数据数组 $ClientShema=$this->getSomeData($database); //将数据放入数组中 $schemas[]=$ClientShema; } 返回$schemas; } 结果的例子是

循环1(数据库1) 这是来自数据库1的数据

循环2(数据库2) 这是一个来自数据库2的数据

您可以定期将缓冲区刷新到浏览器中

首先,您必须向浏览器发送一定数量的数据:

echo str_repeat(" ", 40000);
接下来,您需要开始输出缓冲:

ob_start();
最后,将要发送到浏览器的内容输出后,需要刷新输出缓冲区。我发现我必须调用以下三个函数才能使其正常工作:

ob_end_flush();
ob_flush();
flush();
因此,您的代码可能如下所示:

function Get_data()
{
    echo str_repeat(" ", 40000);

    //loop base on the number of available databases
    for ($i = 0; $i < count($client_databases); $i++) {
        //Start buffering output
        ob_start();

        // Getting connection for each database
        $database = $this->connect_clients_db($client_databases[$i]);

        // return an array of data from the database
        $ClientShema = $this->getSomeData($database);

        // put the data in array
        $schemas[]=$ClientShema;

        //Write some output somewhere here.

        //flush the output buffer here.
        ob_end_flush();
        ob_flush();
        flush();
    }

    return $schemas;
}
函数Get_data() { 回波str_重复(“,40000); //循环基于可用数据库的数量 对于($i=0;$iconnect_clients_db($client_databases[$i]); //从数据库返回数据数组 $ClientShema=$this->getSomeData($database); //将数据放入数组中 $schemas[]=$ClientShema; //在这里的某个地方写一些输出。 //在这里刷新输出缓冲区。 ob_end_flush(); ob_flush(); 冲洗(); } 返回$schemas; }
以下是可用于测试此技术的代码块:

<?php

echo str_repeat(" ", 40000);

for ($i = 0; $i < 10; $i++) {
    ob_start();

    echo "Hello world.<br/>";
    ob_end_flush();
    ob_flush();
    flush();

    usleep(500000);
}

您还需要确保php.ini中的“最大执行时间”设置允许脚本在运行这些循环时不超时。@我不确定,但您无法真正控制输出/流。即使您在大多数情况下使用flush(),输出都是在脚本结束后发送的,而不是在调用flush()时发送的。@djot在我的经验中不是这样的,除非您使用的是AJAX。OP没有表示他正在使用AJAX。我也不确定它是否能在AJAX中工作。更新了一个可用的测试脚本,并进行了解释。谢谢,有人能详细介绍一下缓冲区的工作原理吗谢谢,这个小的好例子帮了大忙。