【问题标题】:PHP script stops working when handling large size of string处理大尺寸字符串时 PHP 脚本停止工作
【发布时间】:2012-05-17 16:39:12
【问题描述】:

我正在测试一个 php 脚本来创建包含大量数据的 csv 文件。 这就是我执行此任务的方式:

$csvdata = "ID,FN,LN,ADDR,TEL,PRO\n
            1,fn1,ln1,addr1,tel1,pro1\n...etc,";
$fname = "./temp/filename.csv";
$fp = fopen($fname,'w');
fwrite($fp,$csvdata);
fclose($fp);

我注意到当字符串 ($csvdata) 包含大约 100,000 个数据行时,脚本可以正常工作。但是当它获得超过 10,00,000 个数据行时,它会停在我构建字符串 $csvdata 的中间(我通过在 for 循环中连接数据来构建 $csvdata 字符串,数据来自数据库)。

有人可以告诉我当我们使用大字符串值时出了什么问题吗?

谢谢 亲切的问候

【问题讨论】:

  • “停止”如“挂起”?还是“崩溃”?还是“出错”?

标签: php string file file-io large-data


【解决方案1】:

我通过在 for 循环中连接数据、来自数据库的数据来构建 $csvdata 字符串。

据此,我了解到您正在准备将整个文件写入字符串并最终将其写入文件。

如果是这样,那么这种方法不好。请记住,字符串存在于主内存中,每次追加时,都会消耗更多内存。解决此问题的方法是逐行写入从数据库中读取记录的文件,根据需要进行转换/格式化,准备 CSV 行并将其写入文件。

【讨论】:

  • 非常感谢 codaddict!会试试那个方法。 :)
  • 我同意这个解决方案。还取决于为每一行写入数据的实现,将确保您不会丢失数据...在其他情况下,如果您正在等待完整的字符串构建,您可能会丢失数据...
  • @YasiruGaminda 你可以在FILE_APPEND 模式下使用file_put_contents
【解决方案2】:

查看您的错误日志。它可能会说一些关于

  1. 您尝试分配的内存超出了某个最大值。这意味着您使用了太多内存 -> 您可以更改 php 允许使用的内存量(php.ini 中的内存限制)

  2. 执行时间长于允许的时间。同样,您可以增加这个时间。

【讨论】:

    【解决方案3】:

    它应该在您的脚本可能发出 Memory Exhausted 错误的 $csvdata= 部分。

    当您将 10 个字符保存到您的 a 变量时,它需要 10 位,并且它会越来越大。并且限制是当它到达分配的内存或php时。

    这就是你继续前进的方式:

    1. 设置内存限制 - 增加您的 PHP 内存限制

    `ini_set('memory_limit', '256M');

    2.逐行写

    立即将每条数据写入文件,而不是将它们堆积起来。另外,如果将array[0]写入文件,然后将下一条数据存储到array[1]并再次写入并继续此操作,则与您现在所做的效果相同。

    所以要么

    while(blah blah){
    $var = "text";
    fwrite($file,$var);
    

    或者在for循环中

    for($i=0;blahblah){
    $var[$i] = "query";
    fwrite($file,$var[$i]);
    unset($var);
    

    当数据库查询是带有WHERE id='$i' 的条件时,For 循环会派上用场

    祝你好运。

    【讨论】:

      猜你喜欢
      • 2014-03-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 2023-03-20
      • 1970-01-01
      • 2010-12-20
      • 2021-11-02
      • 2017-09-21
      相关资源
      最近更新 更多