【问题标题】:Download CSV files using PHP with 100K+ Records使用 PHP 下载具有 100K+ 记录的 CSV 文件
【发布时间】:2017-03-14 11:11:46
【问题描述】:

我已经编写了一个下载 csv 文件的代码,它可以完美运行,但是如果记录(行)的数量超过 100,000+,它就会出错..

Fatal error: Allowed memory size of 134217728 bytes exhausted (tried to allocate 32 bytes)

这是因为我将整个结果提取到一个数组中,然后使用 foreach() 对其进行循环。

$query = "SELECT msisdn, duration FROM `users` WHERE id=".$id.";"; 
$dataProvider = new CSqlDataProvider($query);
$results = $dataProvider->getData();

    // opening file
    $fp = fopen($filename, "w");

    fwrite($fp, "Msisdn,,Duration (seconds) \r\n");

    foreach ($results as $result) {
        fwrite($fp, $result['msisdn'] . ",," . $result['duration'] . "\r\n");
    }
    // closing file;
    fclose($fp);
    exit;

而且我认为使用 while() 循环一次获取和处理一行的内存效率更高。我如何在 php yii 1.1 框架中做到这一点?

类似的东西..

while($row = $nextrow)
   fwrite();
fclose($fp);

【问题讨论】:

  • 是的,效率更高,但数据库负载更大。试试limit+offset,然后添加新行。
  • $query = "SELECT msisdn, duration FROM users WHERE id=".$id." limit 50000 offset 0;"; - 第一个查询。 $query = "SELECT msisdn, duration FROM users WHERE id=".$id." limit 50000 offset 50000"; - 第二个查询
  • 当查询结果为空时 - 停止脚本。
  • 查询如何运行两次?我的意思是两个查询
  • 在 for/while 循环中:)

标签: php csv yii


【解决方案1】:

您从该表中获取总记录并根据计数对其进行拆分。那么接下来你 while 循环上面的结果和查询。

【讨论】:

    【解决方案2】:

    在 Yii 中,你应该CDbDataReader。它表示来自查询结果集中的只进行流。

    将您的 sql 查询传递给此命令。

    $command= Yii::app()->db->createCommand($query);
    $dataReader=$command->query();
    

    然后循环dataReader。您的代码将是

    foreach($dataReader as $result){
        fwrite($fp, $result['msisdn'] . ",," . $result['duration'] . "\r\n");
    }
    

    【讨论】:

    • 谢谢 +1,它帮助我下载了 100 万条记录,没有任何问题
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-06-04
    • 2020-12-29
    • 1970-01-01
    • 2020-04-22
    • 1970-01-01
    • 2014-03-28
    • 1970-01-01
    相关资源
    最近更新 更多