Jump to content

Memory leak


danielfpaiva

Recommended Posts

Boa tarde,

Estou aqui a ter um problema relacionado com a memória estar a ser excessivamente consumida por uma função mas não estou a conseguir identificar o ponto em que isto possa estar acontecer visto que se trata de uma simples query SELECT e criação de uma array com os valores para serem devolvidos.

A mensagem de erro é:
 

 Fatal error: Out of memory (allocated 115540492288) (tried to allocate 4096 bytes)

A função em que isto acontece é a seguinte:

function funGetToken(){
			
			include_once(PATH_DATABASE_INC);
			$db = Database::getInstance();
			$connection = $db->getConnection();			
			$id = $_REQUEST['id'];

			$arrayMain=[];
			$typeArray = [];
			$typeSQL = "SELECT * FROM tb_tokentype";
			if ($result = $connection->query($typeSQL)) {
				while($row = mysqli_fetch_assoc($result)){
					$typeArray[$row['id']] = $row['tokenType'];
				}
			}
			
			array_push($arrayMain,json_encode($typeArray));


			$sqlCmd="SELECT tb_tokens.symbol, tb_tokens.name, tb_tokens.idtype, tb_tokens.decimalCases, 
							tb_tokens.maxSupply, tb_tokens.stake, tb_tokens.delegation, tb_tokens.description, tb_tokens.active, tb_gallery.path,
							tb_tokens.idTbGallery
					 FROM tb_tokens
			     	 INNER JOIN tb_gallery
					 ON tb_tokens.idTbGallery = tb_gallery.id 
					 WHERE tb_tokens.id=".$id;

			$viArrayValues1 = [];
			
			if ($result = $connection->query($sqlCmd)) {
				$row = mysqli_fetch_assoc($result);
				if(!empty($row)){
					while($row){
						$viArrayValues['id']=$id;
						$viArrayValues['symbol']=$row['symbol'];
						$viArrayValues['name']=$row['name'];
						$viArrayValues['idtype']=$row['idtype'];
						$viArrayValues['decimalCases']=$row['decimalCases'];
						$viArrayValues['maxSupply']=$row['maxSupply'];
						$viArrayValues['stake']=$row['stake'];
						$viArrayValues['delegation']=$row['delegation'];
						$viArrayValues['active']=$row['active'];
						$viArrayValues['description']=$row['description'];
						$viArrayValues['path']=$row['path'];
						$viArrayValues['idTbGallery']=$row['idTbGallery'];
						array_push($arrayMain,json_encode($viArrayValues));
					}
				} else {
					$sqlCmd="SELECT tb_tokens.symbol, tb_tokens.name, tb_tokens.idtype, tb_tokens.decimalCases, 
							tb_tokens.maxSupply, tb_tokens.stake, tb_tokens.delegation, tb_tokens.description, tb_tokens.active
					 FROM tb_tokens
					 WHERE tb_tokens.id=".$id;

					if ($result = $connection->query($sqlCmd)) {
						while($row = mysqli_fetch_assoc($result)){
							$viArrayValues['id']=$id;
							$viArrayValues['symbol']=$row['symbol'];
							$viArrayValues['name']=$row['name'];
							$viArrayValues['idtype']=$row['idtype'];
							$viArrayValues['decimalCases']=$row['decimalCases'];
							$viArrayValues['maxSupply']=$row['maxSupply'];
							$viArrayValues['stake']=$row['stake'];
							$viArrayValues['delegation']=$row['delegation'];
							$viArrayValues['active']=$row['active'];
							$viArrayValues['description']=$row['description'];
							$viArrayValues['path']="";
							$viArrayValues['idTbGallery']="";
							array_push($arrayMain,json_encode($viArrayValues));
						}
					}
				}
			}
			echo json_encode($arrayMain);
			$db->closeConnection();
		}

Será que alguém tem uma ideia onde poderá estar o problema?

Obrigado pela ajuda

Link to comment
Share on other sites

Se executares essas consultas diretamente no MySQL quantos resultados tens?

Pode ser um simples SELECT mas depois se tiveres muitos resultados a processar, vai usar memória até ter.

Existe também o caso de teres definido um valor baixo de memória para processos, pode consultar o ficheiro de configuração ou criar um ficheiro para veres todas as definições

// ficheiro ex: info.php
<?php
phpinfo();

E procuras por memory_limit 

Se o valor for baixo (8MB) deves aumentar, por exemplo 32, 64, 128MB

Deixo este link com detalhes das várias maneiras que podes fazer essa alteração

Feito é melhor que perfeito

Link to comment
Share on other sites

O SELECT só retorna um resultado
{
   "symbol":"BEE",
   "name":"Hive Engine Token",
   "idtype":"1",
   "decimalCases":"8",
   "maxSupply":"9007199254740991.00000000",
   "stake":"1",
   "delegation":"1",
   "description":"<p>dasdasd<\\/p>\\r\\n",
   "active":"0",
   "path":"assets\\/images\\/gallery\\/1.jpg",
   "idTbGallery":"1"
}

 

Neste momento eu até pos o memory_limit no php.ini com -1

Link to comment
Share on other sites

achei o problema....

A linha $ é uma matriz como esta [ "symbol":"BEE", "name":"Hive Engine Token", "idtype":"1", "decimalCases":"8", "maxSupply":"9007199254740991.00000000 ", "aposta":"1", "delegação":"1", "descrição":"dasdasd<\/p>\r\n", "active":"0", "path":"assets\/images\/gallery\/1.jpg", "idTbGallery":"1"]

Então, enquanto estiver fazendo 11 vezes, pois cada elemento será um elemento de $row.

Como neste caso apenas um resultado pode ser recuperado, pois tb_tokens.id é uma chave primária e não pode ser duplicada o while pode ser removida e o código será assim

 

function funGetToken(){			
			include_once(PATH_DATABASE_INC);
			$db = Database::getInstance();
			$connection = $db->getConnection();			
			$id = $_REQUEST['id'];

			$arrayMain=[];
			$typeArray = [];
			$typeSQL = "SELECT * FROM tb_tokentype";
			if ($result = $connection->query($typeSQL)) {
				while($row = mysqli_fetch_assoc($result)){
					$typeArray[$row['id']] = $row['tokenType'];
				}
			}
			
			array_push($arrayMain,json_encode($typeArray));


			$sqlCmd="SELECT tb_tokens.symbol, tb_tokens.name, tb_tokens.idtype, tb_tokens.decimalCases,
							tb_tokens.maxSupply, tb_tokens.stake, tb_tokens.delegation, tb_tokens.description,
							tb_tokens.active, tb_gallery.path, tb_tokens.idTbGallery
					 FROM tb_tokens
			     	 INNER JOIN tb_gallery
					 ON tb_tokens.idTbGallery = tb_gallery.id 
					 WHERE tb_tokens.id=".$id;
					 
			$viArrayValues1 = [];
			
			if ($result = $connection->query($sqlCmd)) {
				$row = mysqli_fetch_assoc($result);

				if(!empty($row)){
						$viArrayValues['id']=$id;
						$viArrayValues['symbol']=$row['symbol'];
						$viArrayValues['name']=$row['name'];
						$viArrayValues['idtype']=$row['idtype'];
						$viArrayValues['decimalCases']=$row['decimalCases'];
						$viArrayValues['maxSupply']=$row['maxSupply'];
						$viArrayValues['stake']=$row['stake'];
						$viArrayValues['delegation']=$row['delegation'];
						$viArrayValues['active']=$row['active'];
						$viArrayValues['description']=$row['description'];
						$viArrayValues['path']=$row['path'];
						$viArrayValues['idTbGallery']=$row['idTbGallery'];
						array_push($arrayMain,json_encode($viArrayValues));
				} else {
					$sqlCmd="SELECT tb_tokens.symbol, tb_tokens.name, tb_tokens.idtype, tb_tokens.decimalCases, 
							tb_tokens.maxSupply, tb_tokens.stake, tb_tokens.delegation, tb_tokens.description, tb_tokens.active
					 FROM tb_tokens
					 WHERE tb_tokens.id=".$id;

					if ($result = $connection->query($sqlCmd)) {
						while($row = mysqli_fetch_assoc($result)){
							$viArrayValues['id']=$id;
							$viArrayValues['symbol']=$row['symbol'];
							$viArrayValues['name']=$row['name'];
							$viArrayValues['idtype']=$row['idtype'];
							$viArrayValues['decimalCases']=$row['decimalCases'];
							$viArrayValues['maxSupply']=$row['maxSupply'];
							$viArrayValues['stake']=$row['stake'];
							$viArrayValues['delegation']=$row['delegation'];
							$viArrayValues['active']=$row['active'];
							$viArrayValues['description']=$row['description'];
							$viArrayValues['path']="";
							$viArrayValues['idTbGallery']="";
							array_push($arrayMain,json_encode($viArrayValues));
						}
					}
				}
			}
			echo json_encode($arrayMain);
			$db->closeConnection();
		}

 

Edited by danielfpaiva
  • Vote 1
Link to comment
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
×
×
  • Create New...

Important Information

By using this site you accept our Terms of Use and Privacy Policy. We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.