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? ...
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?

 
  1. <?php
  2. public function onGerarRelatorio( $param )
  3. {
  4. try
  5. {
  6. TTransaction::open('sia'); // open a transaction
  7. $this->form->validate(); // validate form data
  8. $objects = TSession::getValue('contas_receber');
  9. switch ($param['tipo']) {
  10. case 1:
  11. $csv = '"EMPRESA DE FATURAMENTO";"MATRÍCULA";"BENEFICIÁRIO";"PARCELA";"TOTAL DE PARCELAS";"VENCIMENTO";"VALOR"'."\r\n";
  12. foreach ($objects as $object)
  13. {
  14. if (empty($object->aglutinador)) {
  15. $csv .= '"'.$object->empresa->nome_interno."\n".$object->empresa->razao_social."\n".
  16. $object->empresa->nome_fantasia."\n".$object->empresa->cnpj.'";"'.
  17. $object->matricula->descricao.'";"'.$object->matricula->beneficiario->name.'";"'.
  18. $object->parcela.'";"'.$object->total_parcelas.'";"'.$object->dt_vencimento_real.'";"R$ '.
  19. number_format(($object->valor + $object->acrescimo), 2, ',', '.').'"'."\r\n";
  20. }
  21. else {
  22. foreach ($object->getAglutinados() as $aglutinado)
  23. {
  24. $csv .= '"'.$aglutinado->empresa->nome_interno."\n".$aglutinado->empresa->razao_social."\n".
  25. $aglutinado->empresa->nome_fantasia."\n".$aglutinado->empresa->cnpj.'";"'.
  26. $aglutinado->matricula->descricao.'";"'.$aglutinado->matricula->beneficiario->name.'";"'.
  27. $aglutinado->parcela.'";"'.$aglutinado->total_parcelas.'";"'.$aglutinado->dt_vencimento_real.'";"R$ '.
  28. number_format(($aglutinado->valor + $aglutinado->acrescimo), 2, ',', '.').'"'."\r\n";
  29. }
  30. }
  31. }
  32. break;
  33. /*
  34. case 2:
  35. $csv = '"EMPRESA DE FATURAMENTO";"VALOR"'."\r\n";
  36. $array_csv = array();
  37. $empresas = array();
  38. foreach ($objects as $object)
  39. {
  40. if (isset($array_csv[$object->empresa->id])) {
  41. $array_csv[$object->empresa->id] += $object->valor + $object->acrescimo;
  42. }
  43. else {
  44. $array_csv[$object->empresa->id] = $object->valor + $object->acrescimo;
  45. $empresas[$object->empresa->id] = $object->empresa->nome_interno."\n".$object->empresa->razao_social."\n".
  46. $object->empresa->nome_fantasia."\n".$object->empresa->cnpj;
  47. }
  48. }
  49. foreach ($empresas as $key => $empresa)
  50. {
  51. $csv .= '"'.$empresa.'";"'.number_format($array_csv[$key], 2, ',', '.').'"'."\r\n";
  52. }
  53. break;
  54. case 3:
  55. $csv = '"MATRÍCULA";"BENEFICIÁRIO";"VALOR"'."\r\n";
  56. $array_csv = array();
  57. $matriculas = array();
  58. $nomes = array();
  59. foreach ($objects as $object)
  60. {
  61. if (isset($array_csv[$object->matricula->id])) {
  62. $array_csv[$object->matricula->id] += $object->valor + $object->acrescimo;
  63. }
  64. else {
  65. $array_csv[$object->matricula->id] = $object->valor + $object->acrescimo;
  66. $matriculas[$object->matricula->id] = $object->matricula->descricao;
  67. $nomes[$object->matricula->id] = $object->matricula->beneficiario->name;
  68. }
  69. }
  70. foreach ($matriculas as $key => $matricula)
  71. {
  72. $csv .= '"'.$matricula.'";"'.$nomes[$key].'";"'.number_format($array_csv[$key], 2, ',', '.').'"'."\r\n";
  73. }
  74. break;
  75. case 4:
  76. $array_csv = array();
  77. $empresas = array();
  78. $dates = array();
  79. foreach ($objects as $object)
  80. {
  81. if (isset($array_csv[$object->empresa->id][date('Ym', strtotime($object->dt_vencimento_real))])) {
  82. $array_csv[$object->empresa->id][date('Ym', strtotime($object->dt_vencimento_real))] += $object->valor + $object->acrescimo;
  83. }
  84. else {
  85. $array_csv[$object->empresa->id][date('Ym', strtotime($object->dt_vencimento_real))] = $object->valor + $object->acrescimo;
  86. $empresas[$object->empresa->id] = $object->empresa->nome_interno."\n".$object->empresa->razao_social."\n".
  87. $object->empresa->nome_fantasia."\n".$object->empresa->cnpj;
  88. $dates[date('Ym', strtotime($object->dt_vencimento_real))] = date('m/Y', strtotime($object->dt_vencimento_real));
  89. }
  90. }
  91. $csv = '"EMPRESA DE FATURAMENTO";"'.implode('";"', $dates).'"'."\r\n";
  92. foreach ($empresas as $key => $empresa)
  93. {
  94. $csv .= '"'.$empresa.'";';;
  95. foreach ($dates as $date => $date_br)
  96. {
  97. if (isset($array_csv[$key][$date])) {
  98. $csv .= '"R$ '.number_format($array_csv[$key][$date], 2, ',', '.').'";';
  99. }
  100. else {
  101. $csv .= '"R$ 0,00";';
  102. }
  103. }
  104. $csv .= "\r\n";
  105. }
  106. break;*/
  107. }
  108. TTransaction::close(); // close the transaction
  109. parent::closeWindow();
  110. /*
  111. $output = 'app/output/Contas à Receber - '.date('Y-m-d').'.csv';
  112. file_put_contents($output, utf8_decode($csv));
  113. parent::openFile($output);
  114. */
  115. new TMessage('info', 'Relatório gerado com sucesso!');
  116. }
  117. catch (Exception $e) // in case of exception
  118. {
  119. new TMessage('error', $e->getMessage()); // shows the exception error message
  120. $this->form->setData( $this->form->getData() ); // keep form data
  121. TTransaction::rollback(); // undo all pending operations
  122. }
  123. }
  124. ?>

Curso Dominando o Adianti Framework

O material mais completo de treinamento do Framework.
Curso em vídeo aulas + Livro completo + Códigos fontes do projeto ERPHouse.
Conteúdo Atualizado!


Dominando o Adianti Framework Quero me inscrever agora!

Comentários (1)


JP

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.