AR
Erro VirtualAlloc
Senhores,
Na execução da função abaixo é apresentada a mensagem de geração do relatório, mas o consumo de memória do Apache continua a subir até gerar erro no sistema e o mesmo deslogar. Alguém faz ideia do que possa estar acontecendo?
Na execução da função abaixo é apresentada a mensagem de geração do relatório, mas o consumo de memória do Apache continua a subir até gerar erro no sistema e o mesmo deslogar. Alguém faz ideia do que possa estar acontecendo?
- <?php
- public function onGerarRelatorio( $param )
- {
- try
- {
- TTransaction::open('sia'); // open a transaction
- $this->form->validate(); // validate form data
- $objects = TSession::getValue('contas_receber');
- switch ($param['tipo']) {
- case 1:
- $csv = '"EMPRESA DE FATURAMENTO";"MATRÍCULA";"BENEFICIÁRIO";"PARCELA";"TOTAL DE PARCELAS";"VENCIMENTO";"VALOR"'."\r\n";
- foreach ($objects as $object)
- {
- if (empty($object->aglutinador)) {
- $csv .= '"'.$object->empresa->nome_interno."\n".$object->empresa->razao_social."\n".
- $object->empresa->nome_fantasia."\n".$object->empresa->cnpj.'";"'.
- $object->matricula->descricao.'";"'.$object->matricula->beneficiario->name.'";"'.
- $object->parcela.'";"'.$object->total_parcelas.'";"'.$object->dt_vencimento_real.'";"R$ '.
- number_format(($object->valor + $object->acrescimo), 2, ',', '.').'"'."\r\n";
- }
- else {
- foreach ($object->getAglutinados() as $aglutinado)
- {
- $csv .= '"'.$aglutinado->empresa->nome_interno."\n".$aglutinado->empresa->razao_social."\n".
- $aglutinado->empresa->nome_fantasia."\n".$aglutinado->empresa->cnpj.'";"'.
- $aglutinado->matricula->descricao.'";"'.$aglutinado->matricula->beneficiario->name.'";"'.
- $aglutinado->parcela.'";"'.$aglutinado->total_parcelas.'";"'.$aglutinado->dt_vencimento_real.'";"R$ '.
- number_format(($aglutinado->valor + $aglutinado->acrescimo), 2, ',', '.').'"'."\r\n";
- }
- }
- }
- break;
- /*
- case 2:
- $csv = '"EMPRESA DE FATURAMENTO";"VALOR"'."\r\n";
- $array_csv = array();
- $empresas = array();
- foreach ($objects as $object)
- {
- if (isset($array_csv[$object->empresa->id])) {
- $array_csv[$object->empresa->id] += $object->valor + $object->acrescimo;
- }
- else {
- $array_csv[$object->empresa->id] = $object->valor + $object->acrescimo;
- $empresas[$object->empresa->id] = $object->empresa->nome_interno."\n".$object->empresa->razao_social."\n".
- $object->empresa->nome_fantasia."\n".$object->empresa->cnpj;
- }
- }
- foreach ($empresas as $key => $empresa)
- {
- $csv .= '"'.$empresa.'";"'.number_format($array_csv[$key], 2, ',', '.').'"'."\r\n";
- }
- break;
- case 3:
- $csv = '"MATRÍCULA";"BENEFICIÁRIO";"VALOR"'."\r\n";
- $array_csv = array();
- $matriculas = array();
- $nomes = array();
- foreach ($objects as $object)
- {
- if (isset($array_csv[$object->matricula->id])) {
- $array_csv[$object->matricula->id] += $object->valor + $object->acrescimo;
- }
- else {
- $array_csv[$object->matricula->id] = $object->valor + $object->acrescimo;
- $matriculas[$object->matricula->id] = $object->matricula->descricao;
- $nomes[$object->matricula->id] = $object->matricula->beneficiario->name;
- }
- }
- foreach ($matriculas as $key => $matricula)
- {
- $csv .= '"'.$matricula.'";"'.$nomes[$key].'";"'.number_format($array_csv[$key], 2, ',', '.').'"'."\r\n";
- }
- break;
- case 4:
- $array_csv = array();
- $empresas = array();
- $dates = array();
- foreach ($objects as $object)
- {
- if (isset($array_csv[$object->empresa->id][date('Ym', strtotime($object->dt_vencimento_real))])) {
- $array_csv[$object->empresa->id][date('Ym', strtotime($object->dt_vencimento_real))] += $object->valor + $object->acrescimo;
- }
- else {
- $array_csv[$object->empresa->id][date('Ym', strtotime($object->dt_vencimento_real))] = $object->valor + $object->acrescimo;
- $empresas[$object->empresa->id] = $object->empresa->nome_interno."\n".$object->empresa->razao_social."\n".
- $object->empresa->nome_fantasia."\n".$object->empresa->cnpj;
- $dates[date('Ym', strtotime($object->dt_vencimento_real))] = date('m/Y', strtotime($object->dt_vencimento_real));
- }
- }
- $csv = '"EMPRESA DE FATURAMENTO";"'.implode('";"', $dates).'"'."\r\n";
- foreach ($empresas as $key => $empresa)
- {
- $csv .= '"'.$empresa.'";';;
- foreach ($dates as $date => $date_br)
- {
- if (isset($array_csv[$key][$date])) {
- $csv .= '"R$ '.number_format($array_csv[$key][$date], 2, ',', '.').'";';
- }
- else {
- $csv .= '"R$ 0,00";';
- }
- }
- $csv .= "\r\n";
- }
- break;*/
- }
- TTransaction::close(); // close the transaction
- parent::closeWindow();
- /*
- $output = 'app/output/Contas à Receber - '.date('Y-m-d').'.csv';
- file_put_contents($output, utf8_decode($csv));
- parent::openFile($output);
- */
- new TMessage('info', 'Relatório gerado com sucesso!');
- }
- catch (Exception $e) // in case of exception
- {
- new TMessage('error', $e->getMessage()); // shows the exception error message
- $this->form->setData( $this->form->getData() ); // keep form data
- TTransaction::rollback(); // undo all pending operations
- }
- }
- ?>
Bom dia Alisson BRAGA DA ROCHA!
Superficialmente entendi que:
na linha 17, vc traz um array de dados, que já está alocado na sessão ativa.
No loop vc cria uma variavel csv e adicionado itens a ela,
conforme os objetos instanciados em cada iteração.
Penso que poderia ter mais outras duas abordagens como o mesmo objetivo.
1) Usando arrays para csv, empresa, matricula e parcela, para minimizar o uso de memória.
2) Gerar arquivo via uma simples( e complexa) instrução SQL.
HOJE eu uso arrays de forma sistemática, lembrando de sempre setá-los como NULL ao invés de UNSET, no final de cada processo.