Jump to content
Thiago Lenzi

Limpar memoria PHP após Loops

Recommended Posts

Bom dia senhores.

Tenho 3 arquivos ligados por includes e suas funções são fazer Downloads e Uploads, todos utilizam function em Php7 e são rodados a cada minuto via Cron job.

No entanto, mesmo pensando em performance e evitando o sobrecarregamento do servidor, estou vendo a memória chegar aos 96% de uso. E mesmo quando encerro todos os processos a memória não baixa a carga, fica lá, cheia, por muito tempo.

Portanto, quero saber se existe alguma função que posso colocar no fim do script e limpar toda a memória.

Ps. Como todos os comando são executados via Function, utilizo apena um unset na ultima variável que sobra. Está certo?

Dicas para alta performance de PHP server side serão bem vindas.

Share this post


Link to post
Share on other sites

Recomendo você verificar quanto tempo o script ta demorando para rodar, pois se ele estiver demorando mais que 1 minuto o cron vai fazer ele rodar de novo sem esperar o anterior terminar.

Sim, você tem toda razão. Neste ponto o servidor está bem servido de recursos e nos dá liberdade para acelerar a produção.

Já o gargalo é a memória, 24 horas de trabalho e 21GB de Memória são atingidos. Esse é o nosso ponto fraco.

Share this post


Link to post
Share on other sites

Depende muito da rotina executada. O que ela faz? Como ela faz?
Loops não consomem muita memória. Eles consomem CPU.
Vão consumir memória se eles criarem muitas variáveis ou grandes arrays.

Trabalhar os arquivos por blocos de bytes pode ajudar muito, sem ocupar muita memória. Mas não sei dizer se o PHP permite isso. Talvez um simples script shell resolva mais facilmente

  • +1 1

Share this post


Link to post
Share on other sites

Depende muito da rotina executada. O que ela faz? Como ela faz?

Loops não consomem muita memória. Eles consomem CPU.

Vão consumir memória se eles criarem muitas variáveis ou grandes arrays.

Trabalhar os arquivos por blocos de bytes pode ajudar muito, sem ocupar muita memória. Mas não sei dizer se o PHP permite isso. Talvez um simples script shell resolva mais facilmente

Grande Beraldo, recebo suas Newsletters.

Vamos Lá.

Lembrando que este servidor no momento, é dedicado apenas para essa função.

Tenho um banco de dados com aprox. 2.5 Mi de urls para diretórios públicos, onde ali, contém artigos científicos e suas devidas imagens.

O objetivo do script é fazer o Download diretamente para o Wordpress, através de sua API.

Sendo assim, o script se ressume a isso:

<?php
$array_de_url=...//Este array é composto 2 urls para o Posts com imgs a serem atualizadas em nosso repositório.

foreach($array_de_url as $url){

$html = new DOMDocument();//nativo php
$html->loadHtmlFile($url['url']);
$xpath = new DOMXPath($html);//nativo php

//Aqui buscaremos todos os links das imgs que estão na div ciência
$node_img= $xpath->query('//div[@class="science"]/img/@src');
	

     //Aqui ordenaremos as urls e enviaremos para API update Wordpress
     foreach($node_img as $img)	
	{		
		$link_img_science=$img->nodeValue;
                $resposta=updateWordpress($link_img_science,$url['id']);
		if($resposta ===1){
                upaBDupdateIMGscience($url['id']);// Essa Api é a fornecida pelo Wp e manda as informações para fora do Server
                }
		
		
	}

}

// Returns array of all defined variables
$allVars = get_defined_vars(); 
foreach ($allVars as $allVars) { 
unset($allVars); 
}

Não escrevi os selects/updates por serem desnecessários. A API é oficial do Wordpress.

Enfim, não consigo com prender onde a memória é sobrecarregada e, mesmo após o fim dos processos, com o servidor quieto, a memória continua nas alturas.

Share this post


Link to post
Share on other sites

Se o seu script faz muita coisa, é normal ele ser custoso.

Se a questão toda é sobre uso de memória, uma saída seria utilizar generators. No link abaixo, há o exemplo mais básico de generator para reduzir consumo de memória na leitura de arquivos:

http://php.net/manual/en/language.generators.overview.php#112985

É perceptível que o seu script está carregando em memória, você pode substituir as linhas abaixo:

$html = new DOMDocument();//nativo php
$html->loadHtmlFile($url['url']);
$xpath = new DOMXPath($html);//nativo php

//Aqui buscaremos todos os links das imgs que estão na div ciência
$node_img= $xpath->query('//div[@class="science"]/img/@src');

Por alguma versão usando generator, e apenas chamar no foreach:

foreach(minha_funcao_usando_generators() as $img)	
{		
    $link_img_science=$img->nodeValue;
    $resposta=updateWordpress($link_img_science,$url['id']);
    if($resposta ===1){
        upaBDupdateIMGscience($url['id']);// Essa Api é a fornecida pelo Wp e manda as informações para fora do Server
    }
}

Em teoria, teria uma drástica redução no consumo de memória.

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now

  • Similar Content

    • By Robson Tenorio Henriques
      Estou desenvolvendo um sistema para uso particular onde realizo diariamente o cadastro dos seguintes valores no BD conforme abaixo:
      INSERT INTO `viagem`( `viagem_nr`, `viagem_valor`, `viagem_gastos`, `viagem_usuario`, `viagem_data`, `viagem_hora` ) VALUES( '$viagem_nr', '$viagem_valor', '$viagem_gastos', '$viagem_usuario', '$data_atual', '$hora_atual' ) No caso viagem_usuario é a pessoa que preencheu o formulário com as informações.
       
      Até o momento já consegui fazer um relatório do dia atual e do mês atual, abaixo esta o código do relatório diário:
      <?php include_once("../acesso/conexao.php"); include_once("../config.php"); include_once('../acesso/verifica_login.php'); //Seleção dos dados do BD com Filtragem para exibição na tabela $filtro_data = date('Y-m-d'); $result_viagem = "SELECT * FROM viagem WHERE viagem_data = '$filtro_data' ORDER BY viagem_nr"; $resultado_viagem = mysqli_query($conexao, $result_viagem); //Grafico $data1 = ''; $data2 = ''; //Query para pegar os dados da tabela $filtro_data = date('Y-m-d'); $sql = "SELECT * FROM viagem WHERE viagem_data = '$filtro_data' ORDER BY viagem_nr"; $result = mysqli_query($conexao, $sql); //Loop while ($row = mysqli_fetch_array($result)) { $data1 = $data1 . '"'. $row['viagem_valor'].'",'; $data2 = $data2 . '"'. $row['viagem_gastos'] .'",'; } $data1 = trim($data1,","); $data2 = trim($data2,","); ?> <!doctype html> <html lang="pt-BR"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no"> <Meta http-equiv="refresh" content="60" /> <meta name="author" content="<?php echo $author; ?>"> <meta name="email" content="<?php echo $email_author; ?>"> <title><?php echo $title; ?></title> <script type="text/javascript" src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.2/Chart.bundle.min.js"></script> <link href="https://getbootstrap.com.br/docs/4.1/dist/css/bootstrap.min.css" rel="stylesheet"> <link rel="canonical" href="https://getbootstrap.com/docs/4.3/examples/navbar-fixed/"> <!-- Bootstrap core CSS --> <link href="https://getbootstrap.com/docs/4.3/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-ggOyR0iXCbMQv3Xipma34MD+dH/1fQ784/j6cY/iJTQUOhcWr7x9JvoRxT2MZw1T" crossorigin="anonymous"> <style> .bd-placeholder-img { font-size: 1.125rem; text-anchor: middle; -webkit-user-select: none; -moz-user-select: none; -ms-user-select: none; user-select: none; } @media (min-width: 768px) { .bd-placeholder-img-lg { font-size: 3.5rem; } } .container{ font-family: Arial; margin: 5px 5px 30px 5px; padding: 0; color: white; text-align: center; background: #555652; color: #E8E9EB; background: #222; border: #555652 1px solid; padding: 10px; } </style> <!-- Custom styles for this template --> <link href="css/navbar-top-fixed.css" rel="stylesheet"> </head> <body> <!--Inicio da NavBar--> <nav class="navbar navbar-expand-md navbar-dark fixed-top bg-dark"> <a class="navbar-brand" href="#"><?php echo $title; ?></a> <button class="navbar-toggler" type="button" data-toggle="collapse" data-target="#navbarCollapse" aria-controls="navbarCollapse" aria-expanded="false" aria-label="Toggle navigation"> <span class="navbar-toggler-icon"></span> </button> <div class="collapse navbar-collapse" id="navbarCollapse"> <ul class="navbar-nav mr-auto"> <li class="nav-item active"> <a class="nav-link" href="../plataforma">Home<span class="sr-only">(current)</span></a> </li> <li class="nav-item dropdown"> <a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> VIAGENS </a> <div class="dropdown-menu" aria-labelledby="navbarDropdown"> <a class="dropdown-item" href="../sistema/viagem01.php">1ª Viagem</a> <a class="dropdown-item" href="../sistema/viagem02.php">2ª Viagem</a> <a class="dropdown-item" href="../sistema/viagem03.php">3ª Viagem</a> <a class="dropdown-item" href="../sistema/viagem04.php">4ª Viagem</a> <a class="dropdown-item" href="../sistema/viagem05.php">5ª Viagem</a> <a class="dropdown-item" href="../sistema/viagem06.php">6ª Viagem</a> <a class="dropdown-item" href="../sistema/viagem07.php">7ª Viagem</a> <div class="dropdown-divider"></div> <a class="dropdown-item" href="../sistema/encerramento.php">Fechamento</a> </div> </li> </ul> </div> </nav> <!--Fim da NavBar--> <main role="main" class="col-md-12 ml-sm-auto col-lg-12 px-4"> <h4>Bem Vindo, <b><?php echo $_SESSION['nome']; ?></b>.</h4> <div class="d-flex justify-content-between flex-wrap flex-md-nowrap align-items-center pt-3 pb-2 mb-3 border-bottom"> <h1 class="h2">Dashboard</h1> <div class="btn-toolbar mb-2 mb-md-0"> <button class="btn btn-sm btn-outline-secondary dropdown-toggle" type="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <span data-feather="calendar"></span> Hoje </button> <div class="dropdown-menu"> <a class="dropdown-item" href="#">Mês Atual</a> </div> </div> </div> <div class="container"> <h1><?php echo $title; ?></h1> <canvas id="chart" style="width: 80%; height: 50vh; background: #222; border: 1px solid #555652; margin-top: 10px;"></canvas> <script> var ctx = document.getElementById("chart").getContext('2d'); var myChart = new Chart(ctx, { type: 'line', data: { labels: ["1ª","2ª","3ª","4ª","5ª","6ª","7ª"], datasets: [{ label: 'Receita', data: [<?php echo $data1; ?>], backgroundColor: 'transparent', borderColor:'rgba(46, 204, 113,1.0)', borderWidth: 3 }, { label: 'Gastos', data: [<?php echo $data2; ?>], backgroundColor: 'transparent', borderColor:'rgba(235, 47, 6,1.0)', borderWidth: 3 }] }, options: { scales: {scales:{yAxes: [{beginAtZero: false}], xAxes: [{autoskip: true, maxTicketsLimit: 20}]}}, tooltips:{mode: 'index'}, legend:{display: true, position: 'top', labels: {fontColor: 'rgb(255, 255, 255)', fontSize: 16}} } }); </script> </div> <h2>HOJE</h2> <div class="table-responsive"> <table id="valores" class="table table-striped table-sm display"> <thead> <tr align="center"> <th>ID</th> <th>Data</th> <th>Hora</th> <th>Viagem</th> <th>Valor</th> <th>Gastos</th> <th>Usuário</th> </tr> </thead> <tbody> <?php while ($rows_viagens = mysqli_fetch_assoc($resultado_viagem)) { ?> <tr align="center"> <td><?php echo $rows_viagens['viagem_ID']; ?></td> <td><?php echo date('d/m/Y', strtotime($rows_viagens['viagem_data'])); ?></td> <td><?php echo $rows_viagens['viagem_hora']; ?></td> <td><?php echo $rows_viagens['viagem_nr']; ?></td> <td><?php echo $rows_viagens['viagem_valor']; ?></td> <td><?php echo $rows_viagens['viagem_gastos']; ?></td> <td><?php echo $rows_viagens['viagem_usuario']; ?></td> </tr> <?php } ?> </tbody> </table> </div> </main> </div> </div> <!-- JavaScript do Bootstrap --> <script src="https://code.jquery.com/jquery-3.3.1.slim.min.js" integrity="sha384-q8i/X+965DzO0rT7abK41JStQIAqVgRVzpbzo5smXKp4YfRvH+8abtTE1Pi6jizo" crossorigin="anonymous"></script> <script>window.jQuery || document.write('<script src="https://getbootstrap.com/docs/4.3/assets/js/vendor/jquery-slim.min.js"><\/script>')</script> <script src="https://getbootstrap.com.br/docs/4.1/assets/js/vendor/popper.min.js"></script> <script src="https://getbootstrap.com.br/docs/4.1/dist/js/bootstrap.min.js"></script> <script src="https://getbootstrap.com/docs/4.3/dist/js/bootstrap.bundle.min.js" integrity="sha384-xrRywqdh3PHs8keKZN+8zzc5TX0GRTLCcmivcbNJWm2rs5C8PRhcEn3czEjhAO9o" crossorigin="anonymous"></script> <!-- Ícones --> <script src="https://unpkg.com/feather-icons/dist/feather.min.js"></script> <script> feather.replace() </script> <!-- Gráficos --> <script src="https://cdnjs.cloudflare.com/ajax/libs/Chart.js/2.7.1/Chart.min.js"></script> </body> </html>  
      Porém os mesmo são atualizados automaticamente, eu necessito puxar do BD, todos os dados cadastrados no mês de julho como exemplo, e esse relatório pode ser no formato de uma tabela simples, mas que ele quando gerado fique salvo na plataforma para consultas futuras e não seja alterado.
       
       
       
    • By infonet
      Olá pessoal,
      Poderiam me ajudar?
      Preciso enviar o formulário via ajax, porém preciso pegar todos os valor de todos os inputs e excluir o valor de cada linha em três tabela.
      Pode ser que alguma tabela não tenha nenhum valor, mas tem tabela que pode ter 10 valores.
       
      Tentei fazer como estou enviando, mas não consegui...
      Obrigado!
       

      <form name='formResiduo'> <?php $sqlr_end = "SELECT e.idclie FROM tb_end e WHERE NOT EXISTS(SELECT i.idinc FROM tb_inc i WHERE e.idclie = i.idinc) ORDER BY e.idclie ASC"; $querye = $conn->query($sqlr_end); $linhas = $querye->num_rows; while($rowrend = $querye->fetch_assoc()) { $reidclie = $rowrend["idclie"]; if ($linhas == "0") { $linhase = ""; } else { $linhase = $linhas; } ?> <input type='text' name='valor[]' value='<?php echo $reidclie; ?>'> <?php } ?> <?php if ($linhase) { ?> <div class='emCursorD emBlkA' style='position:relative;font-size:14px;font-weight:300;'> <div style='position:absolute;width:calc(100% + 100px);height:100%;left:-10px;'></div> <div class='formImptG' style='border-radius:3px;padding:5px;margin-bottom:20px;'> <label> <div style='position:relative;border-bottom:1px solid #606060;padding-top:10px;margint-top:5px;'><?php echo $linhase; ?></div> </label> </div> </div> <?php } ?> <?php $sqlr_res = "SELECT r.idclir FROM tb_res r WHERE NOT EXISTS(SELECT i.idinc FROM tb_inc i WHERE r.idclir = i.idinc) ORDER BY r.idclir ASC"; $queryr = $conn->query($sqlr_res); $linhas = $queryr->num_rows; while($rowrres = $queryr->fetch_assoc()) { $rridclir = $rowrres["idclir"]; if ($linhas == "0") { $linhasr = ""; } else { $linhasr = $linhas; } ?> <input type='text' name='valor[]' value='<?php echo $rridclir; ?>'> <?php } ?> <?php if ($linhasr) { ?> <div class='emCursorD emBlkA' style='position:relative;font-size:14px;font-weight:300;'> <div style='position:absolute;width:calc(100% + 100px);height:100%;left:-10px;'></div> <div class='formImptG' style='border-radius:3px;padding:5px;margin-bottom:20px;'> <label> <div style='position:relative;border-bottom:1px solid #606060;padding-top:10px;margint-top:5px;'><?php echo $linhasr; ?></div> </label> </div> </div> <?php } ?> <?php $sqlr_his = "SELECT h.idclih FROM tb_his h WHERE NOT EXISTS(SELECT i.idinc FROM tb_inc i WHERE h.idclih = i.idinc) ORDER BY h.idclih ASC"; $queryh = $conn->query($sqlr_his); $linhas = $queryh->num_rows; while($rowrhis = $queryh->fetch_assoc()) { $rhidclih = $rowrres["idclih"]; if ($linhas == "0") { $linhash = ""; } else { $linhash = $linhas; } ?> <input type='text' name='valor[]' value='<?php echo $rhidclih; ?>'> <?php } ?> <?php if ($linhash) { ?> <div class='emCursorD emBlkA' style='position:relative;font-size:14px;font-weight:300;'> <div style='position:absolute;width:calc(100% + 100px);height:100%;left:-10px;'></div> <div class='formImptG' style='border-radius:3px;padding:5px;margin-bottom:20px;'> <label> <div style='position:relative;border-bottom:1px solid #606060;padding-top:10px;margint-top:5px;'><?php echo $linhash; ?></div> </label> </div> </div> <?php } ?> </form> <div class='passar emLineB emCursorP'>Passar</div> <script> $(document).ready(function() { $('.passar').click(function(passar) {     var formdata = new FormData($("form[name='formResiduo']")[0]);     var link = 'sys/incClient.php?teste=ex';      $.ajax({         dataType: 'json',         type: 'POST',         url: link,         data: formdata,         processData: false,         contentType: false,     success: function (result) {         var data = result.split('|');         var rA = data[0];         var rB = data[1];     if(rA == "sucesso") {     alert(rB);     }      return false;     }     }); }); }); </script>
       

      if($_GET['teste']=="ex") {     foreach($_POST['valor'] AS $lines) {          $sqlr = @mysqli_query($conn, "DELETE FROM tb_res WHERE idclir = '$lines'");     $sqle = @mysqli_query($conn, "DELETE FROM tb_end WHERE idclie = '$lines'");     $sqlh = @mysqli_query($conn, "DELETE FROM tb_his WHERE idclih = '$lines'");     }          $arrch = "sucesso"."|".$lines;     echo json_encode($arrch);     exit; }
    • By infonet
      Poderiam me ajudar com esta consulta SQL?   Acontece que ela roda normal, mas quando coloco na paginação ela não funciona:   mysqli_query ($conn, "SET @a := 0"); $_pagi_sql = "SELECT *, LPAD( @a := @a + 1, 5, '0' ) 'sequencial' FROM tb_his WHERE idclih = $idclientHis ORDER BY dt_his DESC, idhis DESC, sequencial DESC";   O erro acontece somente por causa do final: sequencial DESC, pois quando eu retiro, funciona normalmente.   Obrigado!
    • By Eurales antony
      Boa noite developers, eu codei um sistema em PHP mas não para ser vendido e sim alugado, o cliente aluga eu envio os arquivos do sistema e uma chave e apenas com uma chave valida o sistema funciona, o sistema está pronto terminei de coda o ofuscador e um contaminador(insere códigos deanecesaarios no código) mas agora eu preciso criptografar todos os arquivos, tipo base_64 ou melhor, com o ofuscador e contaminador o código fonte está totalmente ilegível mas quero que fique igual a um código que eu vi, um monte de caracteres nada vê com nada não sei se era base 64 na verdade não entendo muito sobre criptografia quem puder me ajudar eu agradeço e quem chegou até aqui agrade pelo atenção, boa noite 
    • By eduardaarosaa
      Olá!!! Gostaria de saber como converter um objeto em array.
      Já tentei usar get_objet_vars e não funcionou ... veio um array vazio 
      Exemplo: array(){
      }
      array(){
      }
      Meu objeto está assim: 
      object(Illuminate\Http\UploadedFile)#205 (7) {
        ["test":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        bool(false)
        ["originalName":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        string(10) "eliete.jpg"
        ["mimeType":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        string(10) "image/jpeg"
        ["error":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        int(0)
        ["hashName":protected]=>
        NULL
        ["pathName":"SplFileInfo":private]=>
        string(24) "C:\xampp\tmp\php8467.tmp"
        ["fileName":"SplFileInfo":private]=>
        string(11) "php8467.tmp"
      }
      object(Illuminate\Http\UploadedFile)#211 (7) {
        ["test":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        bool(false)
        ["originalName":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        string(40) "f114abec-1fe1-4e86-92b0-5b976b4c50c0.jpg"
        ["mimeType":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        string(10) "image/jpeg"
        ["error":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        int(0)
        ["hashName":protected]=>
        NULL
        ["pathName":"SplFileInfo":private]=>
        string(24) "C:\xampp\tmp\php8468.tmp"
        ["fileName":"SplFileInfo":private]=>
        string(11) "php8468.tmp"
      }
      object(Illuminate\Http\UploadedFile)#212 (7) {
        ["test":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        bool(false)
        ["originalName":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        string(27) "bitcoin-3125488_960_720.png"
        ["mimeType":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        string(9) "image/png"
        ["error":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        int(0)
        ["hashName":protected]=>
        NULL
        ["pathName":"SplFileInfo":private]=>
        string(24) "C:\xampp\tmp\php8469.tmp"
        ["fileName":"SplFileInfo":private]=>
        string(11) "php8469.tmp"
      }
      object(Illuminate\Http\UploadedFile)#213 (7) {
        ["test":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        bool(false)
        ["originalName":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        string(14) "imagem0033.jpg"
        ["mimeType":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        string(10) "image/jpeg"
        ["error":"Symfony\Component\HttpFoundation\File\UploadedFile":private]=>
        int(0)
        ["hashName":protected]=>
        NULL
        ["pathName":"SplFileInfo":private]=>
        string(24) "C:\xampp\tmp\php8479.tmp"
        ["fileName":"SplFileInfo":private]=>
        string(11) "php8479.tmp"
      }
       
      Obrigada!!!
×

Important Information

Ao usar o fórum, você concorda com nossos Terms of Use.