【问题标题】:PHPExcel Fatal error: Allowed memory sizePHPExcel致命错误:允许的内存大小
【发布时间】:2015-09-18 10:21:06
【问题描述】:

我使用 PHPexcel 打开一个 .xlsx 文件(在 ovh 互惠服务器上)并遇到了我解决的问题。

我在保存修改后的文件时遇到了一个新问题:

“致命错误:/home/observatvu/www/libraries/phpexcel/library/PHPExcel/Cell.php 870 行中允许的内存大小为 536870912 字节已用尽(尝试分配 49 字节)”

我在互联网上阅读了许多问题和答案,并尝试了一些解决方案,例如:

  • .htaccess 中的 memory_limit => 服务器上的问题,它不起作用
  • ini_set('memory_limit','512M') => 我收到了上面的消息...对于其他 ini_set 值,我有其他大小的内存错误,但没有保存文件。
  • 我无法修改 php.ini

我在保存文件的过程中尝试写 setPreCalculateFormulas(false) 但总是出现同样的问题。

请有人可以帮我找到一个可行的解决方案?

谢谢

【问题讨论】:

标签: php memory phpexcel


【解决方案1】:

如果你尝试过

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array( 'memoryCacheSize' => '1024MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); 

那就不行了。

您的 PHP 限制为 536,870,912 (512MB)

线

$cacheSettings = array( 'memoryCacheSize' => '1024MB');

告诉 PHPExcel 切换到使用 php://temp 进行缓存之前使用 1024MB 的 PHP 内存......这就是参数名称的 memory 元素memoryCacheSize 表示。

对 memoryCacheSize 值使用低于的值,而不是 PHP 内存限制的数量

$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp;
$cacheSettings = array( 'memoryCacheSize' => '256MB');
PHPExcel_Settings::setCacheStorageMethod($cacheMethod, $cacheSettings); 

【讨论】:

  • 感谢您的回答。我刚刚尝试了您的解决方案,但我遇到了同样的错误。我尝试了 PHPExcel 中的单元格缓存选项和相同的错误...
  • 您需要制定正确的缓存方法,以及设置的正确参数.....为什么不将 php://temp 的设置保留为默认值?
  • 对不起,我不明白...“将 php://temp 的设置保留为默认值?” => 你什么意思?
  • 这样做:$cacheMethod = PHPExcel_CachedObjectStorageFactory::cache_to_phpTemp; PHPExcel_Settings::setCacheStorageMethod($cacheMethod);
  • 您是否在加载您的文件之前进行设置?
【解决方案2】:

如果你不能让它与 PHPExcel 的缓存系统一起工作,你可以试试Spouthttps://github.com/box/spout。 它旨在处理任何大小的文件,而不会导致内存或时间限制问题。

您只需要 10MB 的可用内存,就可以读取所有想要的 XLSX 文件 :)

【讨论】:

  • 感谢您的评论。我要试试你的解决方案
【解决方案3】:

将不正确的单元格字母传递给 phpExcel 函数时可能会发生这种类型的错误,例如:

$objPHPExcel->getActiveSheet()->setCellValue($cell, $value);

确保不要像这样增加列字母:

chr(ord($col) + 1);

最好使用自定义增量函数,例如:

//$start = 'A'
private function _incrementCol($start, $offset)
{
    $result = $start;
    for($i = 1; $i <= $offset; $i++) {
        $result++;
    }
    return $result;
}

【讨论】:

    猜你喜欢
    • 2015-04-22
    • 2023-03-20
    • 2023-04-03
    • 1970-01-01
    • 2017-01-05
    • 2014-03-10
    • 2017-01-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多