Jump to content

Caso Estranho !!!


hbarquero
 Share

Recommended Posts

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?

Tudo o que não provoca a minha morte, torna-me mais forte.http://formacao-cursos.com

Link to comment
Share on other 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.

Tudo o que não provoca a minha morte, torna-me mais forte.http://formacao-cursos.com

Link to comment
Share on other 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.

Tudo o que não provoca a minha morte, torna-me mais forte.http://formacao-cursos.com

Link to comment
Share on other 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.

Tharis Fan ClubMay Tharis bless you
Link to comment
Share on other 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>

Tudo o que não provoca a minha morte, torna-me mais forte.http://formacao-cursos.com

Link to comment
Share on other 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

Tudo o que não provoca a minha morte, torna-me mais forte.http://formacao-cursos.com

Link to comment
Share on other 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.

Nick antigo: softclean | Tens um projeto? | Wiki P@P

Ajuda a comunidade! Se encontrares algo de errado, usa a opção "Denunciar" por baixo de cada post.

Link to comment
Share on other 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.

Tudo o que não provoca a minha morte, torna-me mais forte.http://formacao-cursos.com

Link to comment
Share on other 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.

Link to comment
Share on other 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.

Link to comment
Share on other 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

Tudo o que não provoca a minha morte, torna-me mais forte.http://formacao-cursos.com

Link to comment
Share on other 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.  ?

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

Link to comment
Share on other sites

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

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 😉

Link to comment
Share on other 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...

O que não tem solução, solucionado esta...

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
 Share

×
×
  • 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.