【问题标题】:Increase memory limit增加内存限制
【发布时间】:2012-01-12 04:40:55
【问题描述】:

我的 php 脚本即时创建 PDF,数据来自 mysql db 表,它可以正常工作,直到 30 条记录,但比它说的要多

我是来自http://code.google.com/p/dompdf/的dompdf

Fatal error: Allowed memory size of 33554432 bytes exhausted (tried to allocate 56214 bytes) in F:\xampp\htdocs\wiseworker\dompdf\lib\class.pdf.php on line 3043

不过我用过ini_set("memory_limit","96550M"); 并在 php.ini 中设置

; Maximum amount of memory a script may consume (5120MB)
; http://php.net/memory-limit
memory_limit = 96550M

我还增加了查询执行时间

if( !ini_get('safe_mode') ){
        set_time_limit(0);
    }

但它只是限制在 45 到 65 字节左右,如果 mysql 表包含数百条记录会怎样?

【问题讨论】:

  • 尝试unset 任何您可能使用的额外变量或类似的东西怎么样?
  • 正如@StasM 所说,您可能没有设置正确的 php.ini 文件。运行 phpinfo() 并检查 memory_limit 的实际值和 php.ini 文件的位置。如果在网络服务器中运行脚本,请重新启动/重新加载它。
  • 尝试echo ini_get('memory_limit'); 以确保您的内存限制设置正确。
  • @All 我在设置 memory_limit = 94G 后多次测试(重新启动 apache),它显示正好 94G,但仍然显示致命错误:允许的内存大小为 33554432 字节已用尽(尝试分配 57971 字节)在第 2739 行的 F:\xampp\htdocs\wiseworker\dompdf\lib\class.pdf.php 中
  • 好的,谢谢大家,我只需要在 dompdf 类中设置 memory_limit = 94G,现在它正在创建大型 pdf,但几分钟后浏览器显示“连接已重置 - 与服务器的连接已重置,而页面正在加载。等等......”虽然我将执行时间增加到 3600 秒 //ini_set('max_execution_time', 3600)

标签: php mysql


【解决方案1】:

在页面顶部使用以下内容:

 ini_set('max_execution_time', 3000);
 ini_set('memory_limit','16M');

此设置仅对您当前的脚本有效。

【讨论】:

    【解决方案2】:

    45 字节不是限制 - 33554432 是限制,即 32M。 45 字节只是 PHP 尝试分配并失败的块(这不是很有用,因为它可以是任何东西)。检查您是否真正编辑了正确的 php.ini,它实际上反映在您的 phpinfo() 中。顺便说一句,96550M 是 94G 内存——你真的有那么多吗? 尝试取消设置您不使用的对象,并尝试通过gc_collect_cycles 手动运行 gc 循环(请参阅:http://www.php.net/manual/en/function.gc-collect-cycles.php)。

    【讨论】:

    • 我的脚本没有不敬的脚本或变量和对象。如果我在理解你时犯了任何错误,请尽可能举例说明。
    【解决方案3】:

    好的,感谢所有我只需要在 dompdf 类中设置 memory_limit = 94G,现在它正在创建大型 pdf,但几分钟后浏览器显示“连接已重置 - 与服务器的连接在页面加载时已重置。等等......”虽然我将执行时间增加到 3600 秒 //ini_set('max_execution_time', 3600)

    【讨论】:

      【解决方案4】:

      通过下面的代码。根据您的要求更新代码和注释

      <?php
      
          echo '<h1>System Configuration</h1>';
          echo '<br>';
      
          //PHP SETUP: all time in seconds
      
          //ini_set('max_execution_time', 18000);  // set your max execution time that you require for current script
          //ini_set('memory_limit',' 2048M'); //  set memory limit that you require for current script
          //ini_set("max_input_time", '5000');
          //ini_set('default_socket_timeout', '5000');    
          //@set_time_limit(0);
      
          //DATABASE SETUP: all time in seconds
          //ini_set('mysql.connect_timeout', '5000');
      
      
          $ini_path       = php_ini_loaded_file();
          $ini_max_time   = ini_get('max_execution_time');
          $ini_memory     = ini_get('memory_limit');          
      
      ?>
      <div class="hdr">Current Server</div>
      <label>Web Server : </label> <?php echo $_SERVER['SERVER_SOFTWARE']; ?><br/>
      <label>Operating System : </label><?php echo PHP_OS ?><br/>
      <label>PHP Version : </label><?php echo phpversion(); ?><br/>
      <label>PHP INI Path : </label><?php echo empty($ini_path ) ? 'Unable to detect loaded php.ini file' : $ini_path; ?><br/>
      <label>PHP SAPI : </label><?php echo php_sapi_name(); ?><br/>
      <label>PHP ZIP Archive : </label> <?php echo class_exists('ZipArchive') ? 'Is Installed' : 'Not Installed'; ?> <br/>
      <label>PHP max_execution_time:</label> <?php echo $ini_max_time === false ? 'unable to find' : $ini_max_time; ?><br/>
      <label>PHP memory_limit : </label> <?php echo empty($ini_memory) ? 'unable to find' : $ini_memory; ?><br/>
      

      【讨论】:

        猜你喜欢
        • 2022-01-03
        • 2019-02-19
        • 2019-03-13
        • 2023-03-09
        • 2014-04-24
        • 2023-03-22
        • 2012-03-08
        • 2018-03-03
        相关资源
        最近更新 更多