Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Fykos

[Resolvido] função in_array e array_push não funciona com muitos

Recommended Posts

Olá, estou com o seguinte problema: estou gerando "números" (alpha-numéricos) randomicos e vou colocando eles em um array usando array_push(), a cada numero gerado faço uma verificação usando in_array() para ver se ele já não está gerado. já tentei usar "gambiarras" fazendo loops mas aí fica mais lento ainda e o php não consegue rodar. usando o in_array o servidor retorna erro 500. no meu servidor acima de 100.000 números já retorna erro. é como se o in_array e/ou o array_push() não consegue armazenar muitos valores.

 

Poderiam ver onde estou errando ou se existe outra alternativa.

 

No exemplo que estou enviando ele gera 10 numeros. basta executá-lo em um servidor php usando o paramentro ?total=100000 por exemplo.

 

Obrigado

 

<?php

set_time_limit(0);

$total=$_GET["total"]?$_GET["total"]:10;

$numerosGerados=array();

$totalGerado=0;
while($totalGerado<$total){
$novo=gerarNumero();
if(!in_array($novo, $numerosGerados)) {
	array_push($numerosGerados, $novo);
	$totalGerado++;
}
}

echo '<pre>';
print_r($numerosGerados);
echo '</pre>';


function gerarNumero() {
$character_set_array = array();
$character_set_array[] = array('count' => 6, 'characters' => 'abcdefghijklmnopqrstuvwxyz');
$character_set_array[] = array('count' => 2, 'characters' => '0123456789');
   $temp_array = array();
   foreach ($character_set_array as $character_set) {
       for ($i = 0; $i < $character_set['count']; $i++) {
           $temp_array[] = $character_set['characters'][rand(0, strlen($character_set['characters']) - 1)];
       }
   }
   shuffle($temp_array);
   return strtoupper(implode('', $temp_array));
}

?>

Compartilhar este post


Link para o post
Compartilhar em outros sites

Por acaso seu servidor é o Zend Server? Se sim, error nos usos das funções retornam Error 500, indiretamente te forçando a ver o Evento gravado e exibido no Dashboard do painel.

 

Se não for, seu Apache pode estar mal configurado (ou bem configurado demais :ermm: ), te forçando a ver os logs dele.

 

Primeiro resolvemos esse problema, pois essas funções não deveriam interromper todo o fluxo dessa maneira, depois vemos o problema em si.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Bruno, obrigado pela resposta.

 

meu servidor compartilhado da kinghost.

servidor web: Apache, php5.

ao clicar no meu painel em "Configuração PHP" ele mostra os dados de "Scripts Lentos" e "Estouro de pool" exibido a seguinte a mensagem abaixo, é o único log que consigo ver.

 

[08-Oct-2012 15:27:03] WARNING: [pool meudominio.com.br] child 9963, script '/home/meudominio/www/controllers/cLote.php' (request: "POST /controllers/cLote.php") executing too slow (2.108723 sec), logging
[08-Oct-2012 15:27:03]  [pool meudominio.com.br] pid 9963
script_filename = /home/meudominio/www/controllers/cLote.php
[0x00000000014adaa0] in_array() /home/meudominio/www/controllers/cLote.php:274
[0x00000000014ad118] gerarEtiquetas() /home/meudominio/www/controllers/cLote.php:53
[0x00000000014acd50] salvar() /home/meudominio/www/controllers/cLote.php:18

 

mais alguém poderia ajudar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Num primeiro momento o que você deve fazer é reduzir a quantidade de loops. Veja, você tem 3 no mesmo arquivo e dois deles estão aninhados.

 

Você usa array_push() quando poderia usar a [sintxade de colchetes] como fez na segunda metade.

 

Pode quebrar a execução em duas etapas, combinando-as por meio de uma session ou enviando um POST com esse array serializado.

 

Tem várias opções.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Olá Bruno,

obrigado pela resposta.

realmente isso é causado pelo servidor mesmo.. acho que limites.

tive que mudar a programação usando inserção direta no banco de dados sem colocar em array.

ficou lento por ter que ir conferindo número por número no banco, mas pelo menos funcionou.

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.