danielfpaiva Posted March 23, 2022 at 04:40 PM Report Share #625615 Posted March 23, 2022 at 04:40 PM 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 More sharing options...
Ivo Vicente Posted March 23, 2022 at 10:09 PM Report Share #625618 Posted March 23, 2022 at 10:09 PM 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 More sharing options...
danielfpaiva Posted March 23, 2022 at 10:44 PM Author Report Share #625619 Posted March 23, 2022 at 10:44 PM 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 More sharing options...
danielfpaiva Posted March 23, 2022 at 10:55 PM Author Report Share #625620 Posted March 23, 2022 at 10:55 PM (edited) 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 March 23, 2022 at 11:04 PM by danielfpaiva 1 Report Link to comment Share on other sites More sharing options...
Recommended Posts
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 accountSign in
Already have an account? Sign in here.
Sign In Now