Ir para conteúdo

POWERED BY:

Arquivado

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

Rarylson Freitas

[Resolvido] Como uma página em PHP é processada?

Recommended Posts

Ao construir um pequeno programa para web (que resolve um sistema linear e apresenta a solução detalhada para o usuário) tive que gerar códigos HTML dinamicamente com PHP.

Aí surgiu a dúvida 1:

Dúvida 1: Para imprimir (escrever na página que será apresentada ao usuário) um código HTML, será melhor usar várias instruções echo ou concatenar tudo em uma string e ao fim imprimir a string, já que, conforme pensei, ao chamar a instrução echo apenas uma vez, função esta que mexe em um arquivo e assim deve consumir tempo, aparentemente reduziria o tempo de execução.

Explicando melhor:

for ($i=1;$i<=2000;$i++)
	echo "Linha ".$i."<br>";
ou

$string_echo = "";
for ($i=1;$i<=2000;$i++)
	$string_echo.= "Linha ".$i."<br>";
echo $string_echo;
Solução que encontrei para a dúvida 1: Usando o WAMP (versão mais recente) e realizando os testes no servidor local "localhost", criei páginas usando as duas idéias para imprimir muita coisa e percebi que a segunda realmente era mais rápida. Usei a função time() para comparar a diferença do tempo de execução das duas, e para números (substituindo o 2000) que chegavam próximo ao tempo limite de execução do Apache (que era de 30s) a diferença de execução chegou a 23s.

 

No entanto, depois me lembrei que na internet teria que levar em conta a velocidade que os dados trafegam pela rede. Se o arquivo for transferido pela rede para o cliente somente depois que o o código PHP já tiver sido completamente executado seria mais vantajoso o 2º método. No entanto, se o código HTML fosse passado para o browser do usuário a medida em que o código PHP fosse processado, ocorreria o oposto.

Considerando que ocorresse conforme a última hipótese, no 1º caso (usando vários echo), cada uma das 2000 impressões seria enviada para o usuário assim que fosse impressa.

Exemplificando (e aumentando os tempos também, para facilitar a compreensão), se o tempo de executar um echo fosse 2s e o tempo para passar os dados para o browser do usuário fosse 3s. Ao fim dos 2000 echos, 1500 impressões já teriam chegado ao computador do usuário, restando apenas 500.

O tempo total de carregamento da página seria: 2s(primeiro echo) + 3s*2000(transferir os echos para o usuário a medida em que forem impressos)=6002s.

No 2º caso, vamos supor que concatenar consumisse um tempo de 0.5s (mais rápido que um echo, conforme eu havia descoberto). o tempo total de execução seria de: 0.5*2000 (concatenar tudo em $string_echo) + 2s(uso do último echo) + 3s*2000(transferir tudo para o usuário) = 7002s.

Observe que se o browser só carregasse os dados depois que toda página HTML fosse gerada, o 1º caso seria de 2s*2000+3s*2000=10000s, bem maior que o 2º caso.

Daí, veio a minha dúvida 2:

Dúvida 2: Os dados são transferidos para o cliente a medida em que o HTML vai sendo montado no servidor ou primeiro gera-se todo o HTML no servidor e depois é que ele é enviado ao cliente.

 

Aproveito e coloco a dúvida 3

Dúvida 3: Deu pra entender alguma coisa do que eu disse? http://forum.imasters.com.br/public/style_emoticons/default/grin.gif

Compartilhar este post


Link para o post
Compartilhar em outros sites

1o. concatene e no final, de o echo, economizara processamento do servidor.....

2o. o script eh processado, depois os dados sao jogados na tela e ae sim, eh mostrado o html com os dados...

3o. nao li td, mas por alto entendi sua duvida...

 

=)

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado Igor! Então o HTML é enviado para o usuário só depois de ser completamente processado, e não a medida em que é processado.

Sanou minha dúvida.

depende de como está configurado o output

você pode forçar o envio como stream.

 

cada resultado pronto já é automaticamente fornecido ao cliente.

 

no execmplo acima você fez teste para 1 cliente.

 

imagine 2000 conexões silmultâneas...

nem precisa tanto.. umas 100 conexoes simultâneas já travariam um server mal configurado

 

pesquise por "output buffering"

Compartilhar este post


Link para o post
Compartilhar em outros sites

Muito obrigado pela informação. Então, mudando a configuração do php.ini, posso enviar a saída do echo para o usuário assim que o echo for executado (foi o q eu entendi). Dúvidas: Neste caso, seria preferível usar vários echos em vez de um apenas (contatenar em uma string e depois usar um só echo)? Quais as vantagens e desvantagens de armazenar toda a página no servidor e só depois dela pronta enviar ao usuário? E quais as vantagens/desvantagens de ir enviando assim que vão sendo processados os echos?

Compartilhar este post


Link para o post
Compartilhar em outros sites

obviamente é mais rápido imprimir uma saída

 

a questão é simples.

 

o que é mais rápido para o compilador interpretar ?

 

isso

 

<?php
$foo = 'bar';
echo $foo;
?>

ou

 

<?php
echo 'bar';
?>

?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Tudo bem que neste caso é mais rápido

<?php

echo 'bar';

?>

Minha dúvida é no caso que a saída é muito grande, como em

// caso 1
for ($i=1;$i<=2000;$i++)
	echo "Linha ".$i."<br>";
ou

// caso 2
$string_echo = "";
for ($i=1;$i<=2000;$i++)
	$string_echo.= "Linha ".$i."<br>";
echo $string_echo;
A segunda é mais rápida para interpretar, já que só chama o echo uma única vez.

SEMPRE a segunda é mais rápida para interpretar (como eu supus e confirmei através de um teste e conforme o Ígor confirmou).

A questão é que se podéssemos enviar os echos na medida em que forem aparecendo (que é possível configurado o output, de acordo com o hinom), a página seria carregada mais rápida no 1º caso. O 2º caso CONTINUA a ser gerado mais rápido, o problema é que, como ele só começa a ser carregada depois do HTML ser gerado (já que o echo fica após a execução do for), ela demora mais para carregar que o 1º caso.

E isto é bem interessante. Uma página que demora mais para ser processa (caso 1) é carregada mais rápida.

Basta conferir as contas aproximadas feitas no meu 1º post, que abriu este tópico.

A conclusão de tudo isso é a seguinte:

Se processarmos o php no servidor e após terminar enviarmos ao usuário: caso 2 é mais rápido!

O HTML é enviado para o usuário na medida em que é processado: caso 1 é mais rápido!

 

Agora, o que eu quis dizer com

Quais as vantagens e desvantagens de armazenar toda a página no servidor e só depois dela pronta enviar ao usuário? E quais as vantagens/desvantagens de ir enviando assim que vão sendo processados os echos?

estou me referindo a outros fatores (vantagens/desvantagens) que não considerei.

 

Por exemplo, um fator (além da performance), pelo que entendi, favorável para permitir enviar dados para o usuário na medida em que os echos forem aparecendo e adotar, desta ocasião, o código do caso 1 é o seguinte:

caso o código HTML fosse sendo gerado e salvo no servidor e somente depois do php processado fôssemos enviar os dados ao usuário, teríamos uma grande quantidade de informação sendo armazenada no servidor se existissem um grande número de conexões múltiplas (isto é, 5000 pessoas acessando o site ao mesmo tempo). Esse é um fator (além da velocidade) que eu não tinha pensado antes do hinom ter falado.

 

Existem outros fatores a considerar?

Compartilhar este post


Link para o post
Compartilhar em outros sites

no segundo caso tem o fator "memória"

 

1 unico usuario a segunda opção é mais rápida

 

faça o mesmo teste com 500 conexões simultâneas

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.