【问题标题】:PHPExcel exhausted memory, IISPHPExcel耗尽内存,IIS
【发布时间】:2016-09-08 04:14:13
【问题描述】:

我的项目必须从 Excel 文件中读取一些数据并插入到数据库中,它在我自己的服务器上运行良好,但我想在最终服务器上做同样的事情,但它不起作用。我试过更改内存的最大值、执行时间等,但没有。

服务器有Windows Server 2012,使用IIS提供网页,实际上我不知道服务器是如何配置的,我什么也不能动,因为习惯了另一个系统,业主不希望我改变任何东西。

PHP 的错误日志返回它:

    [07-Sep-2016 13:44:53 ] PHP Fatal error:  Allowed memory size of 262144 bytes exhausted (tried to allocate 32 bytes) in C:\inetpub\wwwroot\systrucking\liquidaciones\acciones\obtenerListaSucursales.php on line 16
[07-Sep-2016 13:45:11 ] PHP Fatal error:  Allowed memory size of 262144 bytes exhausted (tried to allocate 148 bytes) in C:\inetpub\wwwroot\systrucking\Php\PHPExcel_1.8.0\Classes\PHPExcel\Shared\String.php on line 96
[07-Sep-2016 13:45:18 ] PHP Fatal error:  Allowed memory size of 262144 bytes exhausted (tried to allocate 32 bytes) in C:\inetpub\wwwroot\systrucking\liquidaciones\acciones\obtenerListaSucursales.php on line 16
[07-Sep-2016 13:45:25 ] PHP Fatal error:  Allowed memory size of 262144 bytes exhausted (tried to allocate 148 bytes) in C:\inetpub\wwwroot\systrucking\Php\PHPExcel_1.8.0\Classes\PHPExcel\Shared\String.php on line 96

我的代码:

<?php
include("../../Php/smarker.php");
include("../../Php/PHPExcel_1.8.0/Classes/PHPExcel.php");
    session_start();
    $smarker = new Smarker();
    $mysqli = new mysqli($smarker->getIP(),$smarker->getUsuario(), $smarker->getContrasena(), $smarker->getBD());

    if(isset($_POST["envio"])){
        if(isset($_FILES['archivo'])){
            if ($_FILES['archivo']["error"] > 0){
              echo "Error: " . $_FILES['archivo']['error'] . "<br>";
            }
            else{
                move_uploaded_file($_FILES['archivo']['tmp_name'],"" . $_FILES['archivo']['name']);
                 set_time_limit ( 3000 );
            }
            $objReader = PHPExcel_IOFactory::createReader('Excel2007');

            $objReader->setReadDataOnly(true);
            $objPHPExcel = $objReader->load($_FILES['archivo']['name']);
            $objWorksheet = $objPHPExcel->setActiveSheetIndex(1);

            $i = 7;
            do{

                $solicitud = "INSERT INTO smkr_solicitud_inditex (id_solicitud, concepto, folio_inditex, fecha_recepcion, fecha_servicio, observaciones) VALUES (";
                $conceptos = "INSERT INTO smkr_conceptos_inditex (id_solicitud, dev, conf, calz, mat) VALUES (";
                $cps = "INSERT INTO smkr_cps  (id_solicitud, cp_ida, cp_dev) VALUES (";
                $query = "SELECT MAX(id_porcentaje) AS por, MAX(s.id_solicitud) AS sol from smkr_porcentajes_facturacion AS p, smkr_solicitud_inditex AS s";
                $resultado = $mysqli->query($query);
                $info_campo = $resultado->fetch_assoc();
                $id_porcentaje = ($info_campo['por']!=null)?$info_campo['por']:"0";
                $id_solicitud = ($info_campo['sol']!=null)?$info_campo['sol']:"0";

                $solicitud .= (($id_solicitud*1)+1) . ",'" . $objWorksheet->getCellByColumnAndRow(0 , $i)->getValue() . "','" . 
                    $objWorksheet->getCellByColumnAndRow(4 , $i)->getValue() . "','";

                if(($objWorksheet->getCellByColumnAndRow(5 , $i)->getValue()!="")){
                    $timestamp = PHPExcel_Shared_Date::ExcelToPHP($objWorksheet->getCellByColumnAndRow(5 , $i)->getValue());
                    $fecha_php = date("Y-m-d",$timestamp);
                }else{$fecha_php = "0000-00-00";}
                if($objWorksheet->getCellByColumnAndRow(6 , $i)->getValue()!=""){
                    $timestamp = ($objWorksheet->getCellByColumnAndRow(6 , $i)->getValue()!="")? PHPExcel_Shared_Date::ExcelToPHP($objWorksheet->getCellByColumnAndRow(6 , $i)->getValue()):"";
                    $hora_php = date("H:i:s",$timestamp);
                }else{$hora_php ="00:00:00";}

                 if(($objWorksheet->getCellByColumnAndRow(7 , $i)->getValue()!="")){
                    $timestamp = PHPExcel_Shared_Date::ExcelToPHP($objWorksheet->getCellByColumnAndRow(7 , $i)->getValue());
                    $fecha_php1 = date("Y-m-d",$timestamp);
                }else{$fecha_php1 = "0000-00-00";}
                if($objWorksheet->getCellByColumnAndRow(8 , $i)->getValue()!=""){
                    $timestamp = ($objWorksheet->getCellByColumnAndRow(8 , $i)->getValue()!="")? PHPExcel_Shared_Date::ExcelToPHP($objWorksheet->getCellByColumnAndRow(8 , $i)->getValue()):"";
                    $hora_php1 = date("H:i:s",$timestamp);
                }else{$hora_php1 ="00:00:00";}

                if($objWorksheet->getCellByColumnAndRow(22 , $i)->getValue() != ""){
                    $dev = 1;
                }
                else {$dev = 0;}            
                if($objWorksheet->getCellByColumnAndRow(23 , $i)->getValue() != ""){
                    $con = 1;
                }
                else {$con = 0;}
                if($objWorksheet->getCellByColumnAndRow(24 , $i)->getValue() != ""){
                    $cal = 1;
                }
                else {$cal = 0;}
                if($objWorksheet->getCellByColumnAndRow(25 , $i)->getValue() != ""){
                    $mat = 1;
                }
                else {$mat = 0;}

                $solicitud .= $fecha_php. " " . $hora_php . "','" . $fecha_php1. " " . $hora_php1 . "','" . $objWorksheet->getCellByColumnAndRow(21 , $i)->getValue() . "')";

                $mysqli->query($solicitud);

                $cps .= (($id_solicitud*1)+1) . ",'" . $objWorksheet->getCellByColumnAndRow(1 , $i)->getValue() . "','" . $objWorksheet->getCellByColumnAndRow(2 , $i)->getValue() . "')";

                $mysqli->query($cps);

                $conceptos .= (($id_solicitud*1)+1) ."," . $dev . "," . $con . "," . $cal . "," . $mat . ");";

                $mysqli->query($conceptos);

                unset($p);
                $p[] = array($objWorksheet->getCellByColumnAndRow(10 , $i)->getValue(), 1);
                $p[] = array($objWorksheet->getCellByColumnAndRow(11 , $i)->getValue(), 2);
                $p[] = array($objWorksheet->getCellByColumnAndRow(12 , $i)->getValue(), 3);
                $p[] = array($objWorksheet->getCellByColumnAndRow(13 , $i)->getValue(), 4);
                $p[] = array($objWorksheet->getCellByColumnAndRow(14 , $i)->getValue(), 5);
                $p[] = array($objWorksheet->getCellByColumnAndRow(15 , $i)->getValue(), 6);
                $p[] = array($objWorksheet->getCellByColumnAndRow(16 , $i)->getValue(), 7);
                $p[] = array($objWorksheet->getCellByColumnAndRow(17 , $i)->getValue(), 8);
                $p[] = array($objWorksheet->getCellByColumnAndRow(18 , $i)->getValue(), 9);
                $p[] = array($objWorksheet->getCellByColumnAndRow(19 , $i)->getValue(), 10);
                $p[] = array($objWorksheet->getCellByColumnAndRow(20 , $i)->getValue(), 11);
                $suma = 0;
                foreach($p as $r){
                    $porcentaje = "INSERT INTO smkr_porcentajes_facturacion ( id_solicitud, id_cliente, porciento) VALUES (";
                    $porcentaje .= (($id_solicitud*1)+1) ."," . $r[1] . ", " . $r[0] . ")";
                    if($r[0]!=""){
                        $suma += $r[0]*1;
                        $mysqli->query($porcentaje);
                    }
                }
                if ($suma*1==100){
                    $estado = 0;
                }else{
                    $estado = 100;
                }
                $update = "UPDATE smkr_solicitud_inditex SET id_estado =" .$estado. " WHERE id_solicitud = ".(($id_solicitud*1)+1);
                $mysqli->query($update);

                if($estado == "100"){
                    $insert = "INSERT INTO smkr_estados VALUES (null,".(($id_solicitud*1)+1).", 0, NOW())";
                    $mysqli->query($insert);
                }

                $insert = "INSERT INTO smkr_estados VALUES (null,".(($id_solicitud*1)+1).", ".$estado.", NOW())";
                $mysqli->query($insert);

                $i++;
            }while( $objWorksheet->getCellByColumnAndRow(1 , $i)->getValue() != "" || $objWorksheet->getCellByColumnAndRow(2 , $i)->getValue() != "");
            unlink( $_FILES['archivo']['name']);

            $_SESSION["resultado"] = "Se insertaron ".($i-7)." registros";
           header("Location: http://".$smarker->getDireccion()."/systrucking/liquidaciones/");
        }
        else{
            $_SESSION["resultado"] = "Error de archivo";
            header("Location: http://".$smarker->getDireccion()."/systrucking/fletes/");
        }
    }else{

        header("Location: http://".$smarker->getDireccion()."/systrucking/fletes/");
    }

?>

我希望你能帮助我,坦克你!!!

【问题讨论】:

  • 你能发布你的代码吗?此处或此处的 unset() 可能会有所不同
  • 那么您是否查看过 PHPExcel 本身内置的用于减少内存使用的任何功能,例如 cell caching
  • 而分配给 PHP 的 262144 字节 (256k) 内存非常少,默认 (32MB) 通常是该数字的 128 倍
  • @Mark Ba​​ker,我认为最终的服务器实际上是一个旧的移动设备
  • 我已经添加了我的代码!谢谢你的答案。 @MarkBaker 我试过添加它,但结果是一样的

标签: php iis phpexcel


【解决方案1】:

您可以像这样在脚本中增加分配的内存:

ini_set('memory_limit', '256M'); // 适当改变内存值。

http://php.net/manual/en/function.ini-set.php

【讨论】:

  • 我已经更改了这一行(感谢您的建议),但它不起作用
猜你喜欢
  • 2020-06-25
  • 2011-04-02
  • 1970-01-01
  • 2015-08-23
  • 2012-11-10
  • 2012-08-19
  • 2011-02-09
  • 2015-10-01
  • 2018-12-11
相关资源
最近更新 更多