• Revista PROGRAMAR: Já está disponível a edição #53 da revista programar. Faz já o download aqui!

hbarquero

Caso Estranho !!!

23 mensagens neste tópico

Boas pessoasl,

A ver se alguem te alguma explicação lógica porque eu não consigo entender :)

O caso é o seguinte, tenho uma pagina onde necessito fazer um select de uma tabela que tem uma listagem de cursos (neste momento mais de 4000).

aqui esta:

<select id="course_id" name="course_id">
<?
$query_courses=sqlquery("SELECT id, titulo from courses where school_id='$school_id' ");
while ($res=mysql_fetch_assoc($query_courses)) {
	?><option value="<?=$res["id"]?>"><?=$res["titulo"]?></option><?
}
?>
</select>

a questão é que isto torna o carregar da pagina, na minha opinião muito, muito lento, no PHP demora - PHP 0.458961

O problema já sei que esta no proprio ciclo pois fazendo o mesmo sem o while:

<select id="course_id" name="course_id">
<?
$query_courses=sqlquery("SELECT id, titulo from courses where school_id='$school_id' ");
/*while ($res=mysql_fetch_assoc($query_courses)) {
	?><option value="<?=$res["id"]?>"><?=$res["titulo"]?></option><?
}*/
?>
</select>

demora apenas - PHP 0.000627

Alguem tem uma explicação ou sugestão para melhorar este tempo?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Sim, divides isso em páginas de 20-30. Assim sendo, ele só carrega 20-30 de cada vez, tornando o carregamento da página muito mais rápido.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

correção:

O tempo que coloquei primeiro esta errado, ou seja, em vez de PHP 0.458961 é acima de PHP 0.961746

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não posso dividir em páginas visto que tenho que colocar tudo num único Select

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Não posso dividir em páginas visto que tenho que colocar tudo num único Select

Porquê num único select?

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Porque isso é para ser inserido numa pagina que contem uma listagem de pedidos de informação para cada um dos cursos, e esse select serve para fazer o filtro, ou seja, se tiveres 100 cursos, o select tem de os ter todos, mas se tiveres 1000, continua a ter que apresentar todos os cursos de forma a poderes fazer o filtro.

O numero de 4000 cursos, eu sei que é muito, apenas está como teste, nunca vou ter de usar tantos, mas ao fazer os testes deparei-me com esse problema.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora, mesmo colocando un limit a apenas 500 cursos no select, tenho um tempo sempre acima dos PHP 0.14774 (este foi dos melhores) mas tive tempos como PHP 0.553174 e acima disto.

Lógico que tambem depende do servidor, do numero de visitas, etc..., mas de qualquer forma eu acho que é muito tempo para um simples query e select.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

experimenta usar mysql_fetch_row.. é apenas ligeiramente mais rápido, mas duvido que consiga trazer o tempo do script para menos de 0.7 ou 0.8 seg.

Alternativa: Cria uma tabela/ficheiro/etc.. que guarde o html do select, gerando-o de novo quando a lista de cursos mudar.

P.S.: Actualmente, cada fetch tá a demorar 0,240 ms... Até está bem rápido, o problema é mesmo a quantidade.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o mysql_fetch_row pouco muda o tempo.

A sugestão de criar um html que apenas mude quando os cursos mudarem é uma ideia, a questão é que sendo usado como filtro o campo que escolhes varia no select ou seja, a cada chamada tenho de mudar o <option value="" selected>nome</option>

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Já agora :)

Fiz o teste a criar um ficheiro com todo o conteudo do Select tal como sugerido pelo edsousa

	$text="";
$query_courses=sqlquery("SELECT id, titulo from courses where school_id='$school_id' ");
while ($res=mysql_fetch_row($query_courses)) {
	$text .='<option value="'.$res["0"].'">'.$res["1"].'</option>';
}
           
           $file=dirroot."/cache/courses/course_select"
$fh = fopen($file, 'w');
fwrite($fh, $text);
fclose($fh);

e depois chamar o ficheiro ler o conteudo e fazer o echo.

<select id="course_id" name="course_id">
<?
$file=dirroot."/cache/courses/course_select";
if (is_file($file)) {
	$fh = fopen($file, 'r') or die("can't open file");
	$datos = fread($fh, filesize($file));
	fclose($fh);
	echo $datos;
}
?>
</select>

O resultado é melhorou algo mas continuo com tempos acima de  PHP 0.36839

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Bem por vezes andamos algo distraidos  :wallbash:

fiz uma coisa muito simples

ob_start(); no inicio do ficheiro e ob_end_flush(); no fim e passou os tempos para PHP 0.006717

:wallbash:

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Atenção que isso dos tempos pode não ser muito fiável, porque se fizeres a mesma operação consecutivamente, podes obter tempos (bastantes) diferentes. Tem a ver com o sistema.

Mas não cheguei a perceber se o problema seria da query ou dos conteúdos da páginas. E btw, a solução do edsousa está boa, se os cursos não mudarem com frequência, é o ideal, fazer uma pequena cache do HTML a ser gerado para a combobox.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

a questão de fazer a cache é que temos cursos por empresas, ou seja, cada empresa que esta com login feito, apenas ve os pedidos de informação para os cursos que ela tem.

Se imaginarmos que temos mais de 2000 empresas cada uma com os seus cursos, teria de andar a criar 2000 ficheiros, 1 para cada empresa.

As querys estão bem feitas porque a nivel de tempos de SQL, é bastante bom, a melhoria foi mesmo com o uso do ob_start();  e do ob_end_flush(); mesmo em outras paginas do sistema, a melhoria foi substancial.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hbarquero, se estás a executar essas queries localmente, desengana-te acerca dos valores de benchmark .. A razão dos "servidores dedicados" é mesmo a de serem dedicados a essas tarefas .. Um pc comum onde se tem outros programas pesados a ocupar a memória faz com que os valores de benchmark do php / mysql sejam insconstantes.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o problema aparenta estar resolvido, mas recomendo a utilizar a extensao mysqli (Mysql Improved) ao invés da velha extensão mysql. Tem maior desempenho e, ao contrario da mysql que está a ser apenas mantida, está a ser actualizada e melhorada.

http://pt2.php.net/manual/en/book.mysqli.php

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

o problema aparenta estar resolvido, mas recomendo a utilizar a extensao mysqli (Mysql Improved) ao invés da velha extensão mysql. Tem maior desempenho e, ao contrario da mysql que está a ser apenas mantida, está a ser actualizada e melhorada.

http://pt2.php.net/manual/en/book.mysqli.php

Atenção com o uso disso. MySQLi ainda não é perfeito, e tem muitos problemas .. Tem vantagens, sim, mas mais vale usar uma library que está testada e funciona, ainda que pouco "à frentex", do que uma instável e que pode criar problemas no seu uso.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

hbarquero, se estás a executar essas queries localmente, desengana-te acerca dos valores de benchmark .. A razão dos "servidores dedicados" é mesmo a de serem dedicados a essas tarefas .. Um pc comum onde se tem outros programas pesados a ocupar a memória faz com que os valores de benchmark do php / mysql sejam insconstantes.

os valores que mostrei são de um servidor dedicado

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Atenção com o uso disso. MySQLi ainda não é perfeito, e tem muitos problemas .. Tem vantagens, sim, mas mais vale usar uma library que está testada e funciona, ainda que pouco "à frentex", do que uma instável e que pode criar problemas no seu uso.

que género de problemas se refere? Não o deveria estar a fazer neste tópico mas deixou-me um pouco curioso.  :hmm:

posso não ter dado um uso extensivo ao mysqli mas este até agora nos meus projectos não me deixou mal.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

que género de problemas se refere? Não o deveria estar a fazer neste tópico mas deixou-me um pouco curioso.  :hmm:

posso não ter dado um uso extensivo ao mysqli mas este até agora nos meus projectos não me deixou mal.

A maioria dos problemas são coisas com que o comum programador nunca vai dar (erros do motor relacionados com coisas mais complexas) .. Ainda assim, são erros, e deparar-se com um deles é tramado ;)

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pelo que eu tenho lido, (corrijam-me se estiver errado) os únicos stresses do mysqli têm haver com coisas muito complexas (raramente usadas na web, ou nunca mesma), coisas do tipo ligações com named pipes / replications ainda não vi ninguém queixar-se das situações mais comuns em web, alias no que diz respeito a CRUD, li um artigo há uns dias que falava muito bem do mysqli tanto a nível de desempenho como estabilidade. Mas posso estar enganado...

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Pelo que eu tenho lido, (corrijam-me se estiver errado) os únicos stresses do mysqli têm haver com coisas muito complexas (raramente usadas na web, ou nunca mesma), coisas do tipo ligações com named pipes / replications ainda não vi ninguém queixar-se das situações mais comuns em web, alias no que diz respeito a CRUD, li um artigo há uns dias que falava muito bem do mysqli tanto a nível de desempenho como estabilidade. Mas posso estar enganado...

Eu li reviews de programadores expert na matéria, que diziam que alguns erros continuavam à anos sem ser corrigidos .. era review do inicio deste ano, nao sei se já está corrigido ou não ..

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

sim tens razão, no entanto é como eu tinha referido, são coisas que raramente ou nunca são usadas em web

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Boas tardes pessoal,

peço desculpa pela ausência de respostas da minha parte mas como andei em mudanças de Espanha para Portugal, e só hoje comecei a trabalhar já em casa não tive muito tempo para cá vir.

Em relação à questão que coloquei inicialmente, dos tempos algo longos, a situação penso que realmente ficou mesmo resolvida com a função ob_start(); e ob_end_flush(); e por isso darei o tópico como resolvido.

Em relação às questões entretanto colocadas sobre o mysqli, infelizmente nada tenho a comentar visto nunca o ter usado nem tão pouco ter lido nada nem a favor nem contra como o yoda e o infopc, mas creio que uma abertura de um outro tópico a falar sobre os tais erros mencionados seria de interesse para todos.

0

Partilhar esta mensagem


Link para a mensagem
Partilhar noutros sites

Crie uma conta ou ligue-se para comentar

Só membros podem comentar

Criar nova conta

Registe para ter uma conta na nossa comunidade. É fácil!


Registar nova conta

Entra

Já tem conta? Inicie sessão aqui.


Entrar Agora