PHP致命错误内存不足

时间:2014-04-17 14:14:19

标签: mysql fatal-error phpinfo

我在一个名为RebuildSummary()

的函数中调用以下两个函数
  1. create_summary()
  2. insertdatafromfile()
  3. 1。 create_summary function

    create_summary函数从数据库中获取活动数据并循环使用每个循环的活动,并将数据插入到下面的文本文件中,如下所示:

    zfilename71801404123.txt

    A|201309|R|C|2|014000956|014000956|2200|201211|M|3118.72|35215.12|1639.96|40749.29|46183.13|44653.83|1529.3|||423|9999|EVERGREEN IMPLEMENT INC 
    A|201309|R|C|2|014000956|014000956|2201|201211|M|0|13.86|0|15.22|13.86|15.22|-1.36|||423|9999|EVERGREEN IMPLEMENT INC 
    

    2。 insertdatafromfile function

    insertdatafromfile函数将读取同一文本文件[zfilename71801404123.txt]的内容,并使用命令LOAD DATA将它们插入摘要表。

    代码

    function RebuildSummary() {
        $random = date('dmyhis');
        $zfilename = "zfilename".$random;
        create_summary($zfilename);
        insertdata($zfilename);
    }
    
    function create_summary($zfilename)
    {
        $activities // data from DB
        $filepath = $_SERVER['DOCUMENT_ROOT']."\z".$zfilename.".txt";
        foreach ($activities as $activity) {
            $sql_summary = "SELECT A.AcctDb as AcctDb, '" . $default->DeftReportPeriod . "' as SumReportPer, '" . $default->DeftReportBase . "' as SumReportBase, '" . $default->DeftPeriodBasis . "' as SumPeriodBasis, '" . $default->DeftBasisAdj . "' as SumBasisAdj, '" . $AcctNo . "' as AcctNo,'" . $AcctTaxId . "' as AcctTaxId, '" . $RevLoc . "' as SumRevLoc, '" . $YTDStart . "' as SumYtdStart, '" . $CurrFreq . "' as SumCurrFreq, '" . $Curr . "' as SumCurrAmt, '" . $Ytd . "' as SumYtdAmt, '" . $Lastcurr . "' as SumLastCurr, '" . $LastYTD . "' as SumLastYtd, '" . $Last12 . "' as SumLast12, '" . $Prior12 . "' as SumPrior12, '" . $Last12diff . "' as SumLast12Diff, A.AcctDateOpen as SumDateOpen, A.AcctDateClosed as SumDateClosed, A.GroupCode as SumGroupCode, A.AcctHomeLoc as SumHomeLoc, A.AcctBusName as SumBusName, A.ClassCode as SumClassCode, '" . $Currdiff . "' asSumCurrDiff, '" . $Ytddiff . "' as SumYtdDiff, '" . $Mon['0'] . "' as SumMon01, '" . $Mon['1'] . "' as SumMon02, '" . $Mon['2'] . "' as SumMon03, '" . $Mon['3'] . "' as SumMon04, '" . $Mon['4'] . "' as SumMon05, '" . $Mon['5'] . "' as SumMon06, '" . $Mon['6'] . "' as SumMon07, '" . $Mon['7'] . "' as SumMon08, '" . $Mon['8'] . "' as SumMon09, '" . $Mon['9'] . "' as SumMon10, '" . $Mon['10'] . "' as SumMon11, '" . $Mon['11'] . "' as SumMon12,'" . $Amt['0'] . "' as SumAmt01, '" . $Amt['1'] . "' as SumAmt02, '" . $Amt['2'] . "' as SumAmt03,'" . $Amt['3'] . "' as SumAmt04, '" . $Amt['4'] . "' as SumAmt05, '" . $Amt['5'] . "' as SumAmt06, '" . $Amt['6'] . "' as SumAmt07, '" . $Amt['7'] . "' as SumAmt08, '" . $Amt['8'] . "' as SumAmt09, '" . $Amt['9'] . "' as SumAmt10, '" . $Amt['10'] . "' as SumAmt11, '" . $Amt['11'] . "' as SumAmt12 FROM accounts A WHERE A.AcctDb = '" . $AcctDb . "' and A.AcctTaxId='" . $AcctTaxId . "' ;";
            $exist_activity1 = $this->db->query($sql_summary);
            $activities1 = $exist_activity1->result_array();
    
            $flag_index = 0;
            foreach ($activities1[0] as $key => $value) {
                if ($flag_index == 0) {
                }
                $result .= $value . "|";
                $flag_index = 1;
            }
    
            $j++;
            $result = rtrim($result, "|");
            $handle = fopen($filepath, 'a') or die('Cannot open file:  ' . $filepath);
            fwrite($handle, $result);
            $new_data = "\n";
            fwrite($handle, $new_data);
            $result = "";
        }
    }
    
    
    function insertdatafromfile($zfilename) {
        ini_set('memory_limit', '-1');
        $ext = mysql_real_escape_string("\n");
        $filepath = "z".$zfilename.".txt";
        $sqlstatement1 = "LOAD DATA INFILE " . "'" . $filepath . "'" . " 
        INTO TABLE summary
        FIELDS TERMINATED BY '|'
        LINES TERMINATED BY " . "'" . $ext . "'" . " 
        (AcctDb, SumReportPer, SumReportBase, SumPeriodBasis, SumBasisAdj, AcctNo,AcctTaxId, SumRevLoc, SumYtdStart, SumCurrFreq, SumCurrAmt, SumYtdAmt, SumLastCurr, SumLastYtd, SumLast12, SumPrior12, SumLast12Diff, SumDateOpen, SumDateClosed, SumGroupCode, SumHomeLoc, SumBusName, SumClassCode, SumCurrDiff, SumYtdDiff, SumMon01, SumMon02, SumMon03, SumMon04, SumMon05, SumMon06, SumMon07, SumMon08, SumMon09, SumMon10, SumMon11, SumMon12, SumAmt01, SumAmt02, SumAmt03, SumAmt04, SumAmt05, SumAmt06, SumAmt07, SumAmt08, SumAmt09, SumAmt10, SumAmt11, SumAmt12)
    ";
        mysql_query($sqlstatement1);
        $filepath = $_SERVER['DOCUMENT_ROOT']."\z".$zfilename.".txt";
        unlink($filepath);
    }
    

    系统配置:

    Processor: Intel(R) Xeon(TM) CPU 2.80Ghz, 2.79 Ghz (2 Processors)
    Installed memory(RAM) : 6.00 GB
    System Type: 64 bit Operating System
    Server: Windows IIS 7
    

    PHPINFO

    max_input_time: 60000
    max_file_uploads: 2048M
    memory_limit: 20000M
    post_max_size: 20000M
    upload_max_filesize: 15000M
    

    我的问题:

    调用RebuildSummary函数时出现以下错误。

    [17-Apr-2014 03:54:42 America/Los_Angeles] PHP Fatal error:  Out of memory (allocated 1517289472) (tried to allocate 64 bytes) in C:\HostingSpaces\wwwroot\system\database\drivers\mysql\mysql_result.php on line 162
    

    我在服务器端有足够的内存,仍然是系统如何显示此错误“Out of memory”

3 个答案:

答案 0 :(得分:2)

1517289472 bytes ~= 1.4G所以你在那附近遇到障碍

首先要注意的是你设置的memory_limit: 20000M是20G。你的系统只有6G。 PHP可能会混淆并默认为下限,或者在Windows 7上运行的php版本可能存在硬限制。

或者您可能正在运行32位Apache / PHP进程,其中有2G左右的硬限制,请参阅:Upper memory limit for PHP/Apache

答案 1 :(得分:0)

如果您要浏览大量数据,请不要使用fetch_all()这是我假设您在数据库类中使用的内容。

你应该单独获取每条记录,例如:

while ($row = mysqli_fetch_array($link)) {
    // insert row into file
}

这是一个简单的基准测试,之前有人用来说明内存使用的差异:https://stackoverflow.com/a/2771563/520857

扰流板:100Mb对400bytes

答案 2 :(得分:0)

你允许PHP使用多少ram并不重要。如果它是一个32位编译器,那么它最终可能永远不会超过4gig,而实际的~3gig。

至于你的代码,你将你的ENTIRE数据库结果吸入ram,然后构建一个字符串(基本上是内存需求翻倍),然后将该字符串转储到文件中。由于你显然内存不足,你必须流式传输字符串,例如

$fh = fopen(...);
$separator = '';
while($row = fetch_from_db()) {
     fwrite($fh, $sep . $row[0]);
     $separator = '|';
}

这有点低效,但应该足以给你一般的想法。更有效的解决方案是构建有限长度的字符串并定期写出来。例如当你的连接字符串达到(例如)1兆字节大小时,你把它写出然后将字符串重置为空。

相关问题