致命错误:PHPExcel 中已用尽的允许内存大小为 134217728 字节
Posted
技术标签:
【中文标题】致命错误:PHPExcel 中已用尽的允许内存大小为 134217728 字节【英文标题】:Fatal error: Allowed memory size of 134217728 bytes exhausted in PHPExcel 【发布时间】:2017-01-05 08:44:29 【问题描述】:这是完整的错误:
致命错误:第 173 行 /sites/apps/seller/www/application/libraries/Excel/phpExcel/CachedObjectStorage/CacheBase.php 中允许的内存大小为 134217728 字节已用尽(尝试分配 131072 字节)
这是mu代码:
public function excel_per_kategori($status = NULL)
$user_id = $this->ion_auth->user()->row()->id;
if($status=='out_of_stock')
$cek_kategori = $this->db
->select('kategori.nama_kategori as nama, kategori.id')
->join('kategori', 'kategori.id = produk.kategori')
->where('produk.created_by', $user_id)
->where('produk.stok', 0)
->order_by('kategori.nama_kategori','asc')
->group_by('kategori.id')
->get('produk')->result()
;
else
$this->db->select('kategori.nama_kategori as nama, kategori.id');
$this->db->join('kategori', 'kategori.id = produk.kategori');
$this->db->where('produk.created_by', $user_id);
if($status!=NULL)
if($status == 3)
$this->db->select('produk_ditolak.created_at as tanggal_qc');
$this->db->join('produk_ditolak','produk.id = produk_ditolak.produk_id');
$this->db->where('produk.status', $status);
$this->db->order_by('kategori.nama_kategori','asc');
$this->db->group_by('kategori.id');
$cek_kategori = $this->db->get('produk')->result();
if($status == null)
$nama_file = "semua_produk_per_kategori.xlsx";
elseif($status == "1")
$nama_file = "produk_aktif_per_kategori.xlsx";
elseif($status == "2")
$nama_file = "produk_menunggu_approval_per_kategori.xlsx";
elseif($status == "3")
$nama_file = "produk_ditolak_per_kategori.xlsx";
elseif($status == "0")
$nama_file = "produk_dihapus_per_kategori.xlsx";
else
$nama_file = "produk_stok_habis_per_kategori.xlsx";
$this->load->library("Excel/PHPExcel");
$objPHPExcel = new PHPExcel();
$sheet_start = 0;
foreach($cek_kategori as $ck)
$sheet_start2 = $sheet_start++;
$id_kategori = $ck->id;
$nama_kategori = $ck->nama;
if($status=='out_of_stock')
$produk = $this->Produk_model->out_of_stock_kategori($id_kategori)->result(); //menampilkan page stok kosong
else
$produk = $this->Produk_model->get_all_kategori($status, $id_kategori)->result();
if($status == null)
$judul = "Semua Produk - Kategori ".$nama_kategori;
elseif($status == "1")
$judul = "Produk Aktif - Kategori ".$nama_kategori;
elseif($status == "2")
$judul = "Produk Menunggu Approval - Kategori ".$nama_kategori;
elseif($status == "3")
$judul = "Produk ditolak - Kategori ".$nama_kategori;
elseif($status == "0")
$judul = "Produk dihapus - Kategori ".$nama_kategori;
else
$judul = "Produk Stok Habis - Kategori ".$nama_kategori;
if($sheet_start2 != 0)
$objPHPExcel->createSheet();
//header
$objPHPExcel->setActiveSheetIndex($sheet_start2)
->setCellValue('A2', 'No')
->setCellValue('B2', 'Nama');
//judul
$objPHPExcel->getActiveSheet()->mergeCells('A1:AM1');
$objPHPExcel->getActiveSheet()
->getStyle("A1")->getFont()->setBold(true)
->setName('Verdana')
->setSize(18);
$objPHPExcel->setActiveSheetIndex($sheet_start2)
->setCellValue('A1',$judul);
//isi
$nourut = 1;
$i = 3;
foreach ($produk as $data)
$objPHPExcel->setActiveSheetIndex($sheet_start2)
->setCellValue("A".$i, $nourut)
->setCellValue("B".$i, $data->nama);
$i++;
$nourut++;
//set title pd sheet
if (strlen($nama_kategori)>31)
$nama_kategori = substr($nama_kategori, 0, 28)."...";
$objPHPExcel->getActiveSheet()->setTitle($nama_kategori);
//mulai menyimpan excel format xlsx, kalau ingin xls ganti Excel2007 menjadi Excel5
$objWriter = PHPExcel_IOFactory::createWriter($objPHPExcel, 'Excel2007');
//sesuaikan headernya
ob_end_clean();
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");
header('Content-Type: application/vnd.openxmlformats-officedocument.spreadsheetml.sheet');
//ubah nama file saat diunduh
header('Content-Disposition: attachment;filename="'.$nama_file.'"');
//unduh file
$objWriter->save("php://output");
//Mulai dari create object PHPExcel itu ada dokumentasi lengkapnya di PHPExcel,
// Folder Documentation dan Example
// untuk belajar lebih jauh mengenai PHPExcel silakan buka disitu
我使用 codeigniter 框架和 phpexcel 库。谢谢
【问题讨论】:
代码或库没有问题,错误意味着您在某处有内存泄漏,或者您只是从数据库中获取大量数据 正如我在您之前关于同一问题的问题中提到的,请查看PHPExcel documentation 中的cell caching....我们确实编写文档是有原因的 Allowed memory size of 33554432 bytes exhausted (tried to allocate 43148176 bytes) in php的可能重复 【参考方案1】:更改内存限制ini_set('memory_limit', '256M');
【讨论】:
以上是关于致命错误:PHPExcel 中已用尽的允许内存大小为 134217728 字节的主要内容,如果未能解决你的问题,请参考以下文章
php - 致命错误:允许的内存大小为 134217728 字节已用尽 [重复]
PHP致命错误:允许的内存大小为134217728字节已用尽
致命错误:允许的内存大小为 268435456 字节已用尽(尝试分配 71 字节)
致命错误:允许的内存大小为 1610612736 字节用尽 laravel 护照