PHP在我的所有脚本中耗尽内存

时间:2011-01-28 07:15:01

标签: apache memory php

编辑:

我的php.ini有256MB内存集:

;;;;;;;;;;;;;;;;;;;
; Resource Limits ;
;;;;;;;;;;;;;;;;;;;

max_execution_time = 250     ; Maximum execution time of each script, in seconds
max_input_time = 120    ; Maximum amount of time each script may spend parsing request data
;max_input_nesting_level = 64 ; Maximum input variable nesting level
memory_limit = 256MB    ; Maximum amount of memory a script may consume (256MB)

所以我有一个写得不好的PHP脚本,当我执行它时,PHP内存不足,我的电脑冻结了。在运行脚本之前,我已经增加了php.ini中的内存限制。我在之后将其更改回默认值。

现在问题是它似乎已经为我的PHP安装做了些什么。我现在执行的每个PHP脚本都告诉我它没有足够的内存。以前运行过的脚本没有问题。

看起来我之前提到过的一个糟糕的剧本仍然以某种方式在后台运行。

我重新启动了PHP,Apache,我重启了我的电脑,甚至睡了8个小时。接下来的事情我发现所有的PHP脚本仍然没有内存。怎么了?

我现在到处都是这样的错误(当然错误更改中的文件) - 每一个都是最简单的PHP脚本:

  

致命错误:第241行的D:\ data \ o \ WebLib \ src \ Db \ Db.php中允许的内存大小为262144字节(试图分配6144字节)

     

致命错误(关闭):第241行的D:\ data \ o \ WebLib \ src \ Db \ Db.php中允许的内存大小为262144字节(试图分配6144字节)

这里是脚本(我已经注释掉了坏的部分):

<?php 

error_reporting(E_ALL);

define('BASE_PATH', dirname(__FILE__));
require_once(BASE_PATH.'/../WebLib/config/paths.php');             

require_once(PATH_TO_LIB3D_SRC.'/PHPExcel/Classes/PHPExcel.php');
require_once(PATH_TO_LIB3D_SRC.'/PHPExcel/Classes/PHPExcel/Reader/IReadFilter.php');

///**  Define a Read Filter class implementing PHPExcel_Reader_IReadFilter  */ 
//class chunkReadFilter implements PHPExcel_Reader_IReadFilter {     
//  private $_startRow = 0;     
//  private $_endRow = 0;     
//  /**  Set the list of rows that we want to read  */ 
//    public function setRows($startRow, $chunkSize) 
//    { 
//        $this->_startRow    = $startRow; 
//        $this->_endRow      = $startRow + $chunkSize;     
//    } 
//    public function readCell($column, $row, $worksheetName = '') 
//    {         
//      //  Only read the heading row, and the rows that are configured in $this->_startRow and $this->_endRow 
//        if (($row == 1) || ($row >= $this->_startRow && $row < $this->_endRow)) { 
//            return true;         
//        }         
//        return false;     
//    } 
//} 
//
//function ReadXlsxTableIntoArray($theFilePath)
//{ 
//  $arrayData                  = 
//  $arrayOriginalColumnNames   = 
//  $arrayColumnNames           = array();
//  
//  $inputFileType = 'Excel2007';
//  /**  Create a new Reader of the type defined in $inputFileType  **/
//  $objReader = PHPExcel_IOFactory::createReader($inputFileType);
//  /**  Define how many rows we want to read for each "chunk"  **/ 
//  $chunkSize = 10; 
//  /**  Create a new Instance of our Read Filter  **/ 
//  $chunkFilter = new chunkReadFilter(); 
//  /**  Tell the Reader that we want to use the Read Filter that we've Instantiated  **/ 
//  $objReader->setReadFilter($chunkFilter);
//  $objReader->setReadDataOnly(true);
//  /**  Loop to read our worksheet in "chunk size" blocks  **/ 
//  /**  $startRow is set to 2 initially because we always read the headings in row #1  **/
//  for ($startRow = 1; $startRow <= 65536; $startRow += $chunkSize) {
//      /**  Tell the Read Filter, the limits on which rows we want to read this iteration  **/ 
//      $chunkFilter->setRows($startRow,$chunkSize); 
//      /**  Load only the rows that match our filter from $inputFileName to a PHPExcel Object  **/ 
//      $objPHPExcel = $objReader->load($theFilePath); 
//      //    Do some processing here
//      
//      $rowIterator = $objPHPExcel->getActiveSheet()->getRowIterator();
//      foreach($rowIterator as $row){
//          
//          $cellIterator = $row->getCellIterator();
//          //$cellIterator->setIterateOnlyExistingCells(false); // Loop all cells, even if it is not set
//          if(1 == $row->getRowIndex ()) {
//              foreach ($cellIterator as $cell) {
//                  $value = $cell->getCalculatedValue();
//                  $arrayOriginalColumnNames[] = $value;
//                  // let's remove the diacritique
//                  $value = iconv('UTF-8', 'ISO-8859-1//TRANSLIT', $value);
//                  // and white spaces
//                  $valueExploded = explode(' ', $value);
//                  $value = '';
//                  // capitalize the first letter of each word
//                  foreach ($valueExploded as $word) {
//                      $value .= ucfirst($word);
//                  }
//                  $arrayColumnNames[] = $value;
//              }
//              continue;
//          } else {
//              $rowIndex = $row->getRowIndex();
//              reset($arrayColumnNames);
//              foreach ($cellIterator as $cell) {
//                  $arrayData[$rowIndex][current($arrayColumnNames)] = $cell->getCalculatedValue();
//                  next($arrayColumnNames);
//              }
//          }
//          
//          unset($cellIterator);
//      }
//      
//      unset($rowIterator);
//  }
//  
//  // Free up some of the memory 
//  $objPHPExcel->disconnectWorksheets(); 
//  unset($objPHPExcel); 
//  
//  return array($arrayOriginalColumnNames, $arrayColumnNames, $arrayData);
//}
//
//if (isset($_POST['uploadFile'])) {
//  //list($tableOriginalColumnNames, $tableColumnNames, $tableData) = ReadXlsxTableIntoArray($_FILES['uploadedFile']['tmp_name']);
//  //CreateXMLSchema($tableOriginalColumnNames, 'schema.xml');
//  //echo GetReplaceDatabaseTableSQL('posta_prehlad_hp', $tableColumnNames, $tableData);
//}

6 个答案:

答案 0 :(得分:5)

更改php.ini:

memory_limit = 256M

请注意,您不应该使用 MB KB ,但 M K

答案 1 :(得分:4)

PHP希望单位字母兆字节用单个字母 M 表示。您已指定 256MB 。注意额外的 B

由于PHP不理解单位 MB ,它会回落到已知的最低“命名”单位:千字节( K )。

只需从您的设置中删除额外的 B 即可正确读取值为256兆字节( 256M

请参阅以下有关数据大小单位的常见问题解答条目:

  

PHP: Using PHP - Manual

答案 2 :(得分:3)

您有256K 16M。几乎在所有情况下都要少得多。默认值为{{1}}(自5.2起)。

答案 3 :(得分:3)

您确定要正确设置内存大小吗?错误显示您的最大内存为262144 bytes,即四分之一MB。那真的很低!

作为对你的php设置的反应:不应该是

的语法
memory_limit = 256M

我不知道它是否同时接受M和MB,但它可能不接受?

答案 4 :(得分:1)

嘿理查德。由于PHP明确指出您只将256K设置为限制,因此无法执行更改。浏览php.ini和所有其他地方。它可以位于vhost / host上的.htaccess文件中。

答案 5 :(得分:1)

在编辑php.ini并增加memory_limit = 256MB

之后,您是否重新启动了Apache?