Em cache, as miniaturas geradas pelo PHP carregam lentamente

179

Pergunta Parte A ▉ (100 recompensas, concedidas)
A questão principal era como tornar este site mais rápido. Primeiro, precisamos ler essas cachoeiras. Obrigado a todos por suas sugestões na análise de leitura em cascata. Evidente dos vários gráficos em cascata mostrados aqui é o principal gargalo: as miniaturas geradas pelo PHP. O carregamento de jquery sem protocolo da CDN, recomendado por David, recebeu minha recompensa, apesar de tornar meu site apenas 3% mais rápido no geral, e sem responder ao principal gargalo do site. Hora de esclarecer minha pergunta e outra recompensa:

Pergunta Parte B ▉ (100 recompensas, concedidas)
O novo foco agora era resolver o problema das 6 imagens jpg, que estão causando o máximo do atraso no carregamento. Estas imagens são 6 miniaturas PHP-gerados, pequena e apenas 3 ~ 5 kb, mas o carregamento relativamente muito lentamente. Observe o " tempo até o primeiro byte " nos vários gráficos. O problema permaneceu sem solução, mas James recebeu uma recompensa, que corrigiu o erro de cabeçalho sublinhado pelo RedBot : "Uma solicitação condicional If-Modified-Since retornou o conteúdo completo inalterado". .

Pergunta Parte C ▉ (minha última recompensa: 250 pontos)
Infelizmente, depois que o erro do cabeçalho do REdbot.org foi corrigido, o atraso causado pelas imagens geradas pelo PHP permaneceu intocado. O que diabos essas pequenas miniaturas insignificantes de 3 a 5Kb estão pensando? Todas essas informações de cabeçalho podem enviar um foguete para a Lua e voltar. Todas as sugestões sobre esse gargalo são muito apreciadas e tratadas como uma possível resposta, já que estou preso nesse problema de gargalo já há sete meses. Agradeço antecipadamente.

[Algumas informações básicas no meu site: CSS está no topo. JS na parte inferior (Jquery, JQuery UI, compre o menu awm / menu.js engines, tabs js engine, video swfobject.js) As linhas pretas na segunda imagem mostram o que está iniciando o que carregar. O robô zangado é meu animal de estimação "ZAM". Ele é inofensivo e geralmente mais feliz.]


Cachoeira de carga: cronológica | http://webpagetest.org insira a descrição da imagem aqui


Domínios paralelos agrupados | http://webpagetest.org insira a descrição da imagem aqui


Cachoeira Site-Perf | http://site-perf.com insira a descrição da imagem aqui


Pingdom Tools Cachoeira | http://tools.pingdom.com

insira a descrição da imagem aqui


Cachoeira GTmetrix | http://gtmetrix.com

insira a descrição da imagem aqui


Sam
fonte
11
Eu acho que a maioria dos navegadores faz apenas 20 conexões de cada vez; depois das 20, a primeira deve terminar antes do próximo início, daí a desaceleração após as 20
1
Acho que você esqueceu de editar a primeira instância do seu domínio. Porém, pelo menos você conseguiu o restante deles: D
trintadot 26/01
2
Você não pode combinar algumas dessas imagens em sprites?
Marcel Korpel
1
@Dagon, esteja ciente de que o HTTP 1.1 RFC solicita ( SHOULD) que clientes HTTP 1.1 usem no máximo 2 conexões com servidores HTTP 1.1; É claro que o HTTP 1.0 é muito mais aberto.
sarnold
1
Os navegadores @Dagon também farão apenas 2 conexões simultâneas com qualquer domínio.
Endofagia 31/01

Respostas:

61

Primeiro, o uso desses vários domínios requer várias pesquisas de DNS. É melhor combinar muitas dessas imagens em um sprite em vez de espalhar as solicitações.

Segundo, quando carrego sua página, vejo a maior parte do bloqueio (~ 1,25s) em all.js. Vejo que começa com (uma versão antiga do) jQuery. Você deve referenciar isso na CDN do Google, não apenas para diminuir o tempo de carregamento , mas para evitar uma solicitação HTTP por completo.

Especificamente, as bibliotecas jQuery e jQuery UI mais recentes podem ser referenciadas nesses URLs (consulte esta postagem se você estiver interessado em saber por que omiti o http:):

//ajax.googleapis.com/ajax/libs/jquery/1.4.4/jquery.min.js

//ajax.googleapis.com/ajax/libs/jqueryui/1.8.9/jquery-ui.min.js

Se você estiver usando um dos temas padrão da interface do usuário do jQuery, também poderá extrair o CSS e as imagens do CDN do Google .

Com a hospedagem jQuery otimizada, você também deve combinar awmlib2.jse tooltiplib.jsem um único arquivo.

Se você abordar essas questões, verá uma melhoria significativa.

Dave Ward
fonte
1
Excelente comentário Dave! o antigo JQuery 1.3 era muito menor, então pensei que, enquanto trabalhava, poderia ser mais rápido. Mas eu gosto das suas recomendações: Qual dos links CDN do Google você sugere que eu use como meu Jqyuery? Posso usar o mesmo javascript da JQ UI? +1 muito obrigado
Sam
2
Definitivamente, recomendo usar a versão mais recente do jQuery (1.4.4 atualmente). Quando compactado e compactado com gzip, há apenas alguns bytes de diferença entre eles. Atualizei a resposta com alguns links para as versões mais recentes da interface do usuário do jQuery e jQuery na CDN do Google, que eu recomendaria usar.
Dave Ward
1
Boa dica com o sprite, que deve reduzir o número de conexões abertas para o servidor
JamesHalsall
atualmente trabalhando na redução das conexões abertas (passou de 40 para 30 agora ... o empurrão final é o mais difícil, pois algumas das imagens estão recuperando fundos e não podem entrar em um sprite (ou ???)
Sam
Atualizar nota da velocidade da página: (96%) Nota da YSlow: (90%) ... e as miniaturas ainda estão mais lentas do que nunca!
Sam
17

Eu tive um problema semelhante há poucos dias e eu achei head.js . É um plug-in Javascript que permite carregar todos os arquivos JS paralelos. Espero que ajude.

000
fonte
Incrível! Como posso ter esquecido isso? +1 Vou testar agora este. Cheira como uma noite frutífera.Obrigado Schattenbaum!
Sam
1
Posso perguntar se você é o Schattenbaum de schattenbaum.net?
Pekka
12

Estou longe de ser um especialista, mas ...

Em relação a isso: "Uma solicitação condicional If-Modified-Since retornou o conteúdo completo inalterado." e meus comentários.

O código usado para gerar as miniaturas deve verificar o seguinte:

  1. Existe uma versão em cache da miniatura.
  2. A versão em cache é mais recente que a imagem original.

Se um deles for falso, a miniatura deve ser gerada e retornada, não importa o quê. Se ambos são verdadeiros, a seguinte verificação deve ser feita:

  1. Existe um cabeçalho HTTP_IF_MODIFIED_SINCE
  2. O horário da última modificação da versão em cache é o mesmo que o HTTP_IF_MODIFIED_SINCE

Se um desses for falso, a miniatura em cache deve ser retornada.

Se os dois forem verdadeiros, um status http 304 deve ser retornado. Não tenho certeza se é necessário, mas também retorno pessoalmente os cabeçalhos de controle de cache, expira e última modificação, juntamente com o 304.

Com relação ao GZipping, fui informado de que não há necessidade de imagens do GZip, portanto ignore essa parte do meu comentário.

Editar: não notei sua adição à sua postagem.

session_cache_limiter('public');
header("Content-type: " . $this->_mime);
header("Expires: " . gmdate("D, d M Y H:i:s", time() + 2419200) . " GMT");
// I'm sure Last-Modified should be a static value. not dynamic as you have it here.
header("Last-Modified: " . gmdate("D, d M Y H:i:s",time() - 404800000) . " GMT");

Também tenho certeza de que seu código precisa verificar o cabeçalho HTTP_IF_MODIFIED_SINCE e reagir a ele. Basta definir esses cabeçalhos e o arquivo .htaccess não fornecerá o resultado necessário.

Eu acho que você precisa de algo assim:

$date = 'D, d M Y H:i:s T'; // DATE_RFC850
$modified = filemtime($filename);
$expires = strtotime('1 year'); // 1 Year

header(sprintf('Cache-Control: %s, max-age=%s', 'public', $expires - time()));
header(sprintf('Expires: %s', date($date, $expires)));
header(sprintf('Last-Modified: %s', date($date, $modified)));
header(sprintf('Content-Type: %s', $mime));

if(isset($_SERVER['HTTP_IF_MODIFIED_SINCE'])) {
    if(strtotime($_SERVER['HTTP_IF_MODIFIED_SINCE']) === $modified) {
        header('HTTP/1.1 304 Not Modified', true, 304);
        // Should have been an exit not a return. After sending the not modified http
        // code, the script should end and return no content.
        exit();
    }
}
// Render image data
James
fonte
James, você acertou a essência do problema após a edição na sua resposta! o If Modified Sinceproblema parece funcionar agora! No entanto, os longos cabeçalhos / tempo de espera para os pequenos polegares is not ainda resolvido ...
Sam
@ James PS REdbot.org diz que o cabeçalho de Expirar está com valor incorreto. Eu acho que tem que ser GMT e não CET?
Sam
@ Sam Desculpe, meu servidor está no Reino Unido e gera datas GMT automaticamente. Basta usar a função PHP gmdate em vez de data. Isso deve produzir uma data GMT em relação à hora do servidor.
James
1
@ Sam, seu tempo de espera é o tempo de execução do script. Está demorando muito tempo para passar pelo seu código até o ponto em que você envia os cabeçalhos ou não sai após o envio dos cabeçalhos.
James
@ James, eu vejo ... Mas, além do gerador de miniaturas php, existem muitos outros scripts igualmente longos que fazem várias outras coisas (traduções, carregamento de menus etc.), tudo em uma fração de tempo ... ELES não parece ter nenhum gargalo ... isso direciona o problema para o gerador de miniaturas php SOMENTE?
Sam
6

Uau, é difícil explicar as coisas usando essa imagem. Mas aqui, algumas tentativas:

  • os arquivos 33-36 são carregados tão tarde, porque são carregados dinamicamente no swf, e o swf (25) é carregado primeiro completamente antes de carregar qualquer conteúdo adicional
  • os arquivos 20 e 21 são talvez (não sei, porque não conheço seu código) bibliotecas carregadas por all.js (11), mas, para que o 11 seja executado, aguarde a página inteira (e os ativos) para carregar (você deve alterar isso para já)
  • os arquivos 22-32 são carregados por essas duas bibliotecas, novamente após o carregamento completo
cutucar
fonte
Ponto interessante. Eu acho que não há nada em torno do swf ... Como posso mudar o que domready? Eu tenho um palpite do que você quer dizer. É sobre quando o javascript está pronto e informa no documento pronto isso ou aquilo? esse documento já deve ser substituído por dom.ready?
Sam
@ Sam, se você estiver usando o cache do lado do cliente (e deveria estar), poderá carregar os recursos usados ​​pelo swf em js ou divs ocultos na sua página para que, quando o swf os solicite, eles já estejam no cliente.
Endofago
4

Apenas um palpite simples, porque esse tipo de análise requer muitos testes A / B: seu domínio .ch parece difícil de alcançar (faixas verdes longas antes da chegada do primeiro byte).

Isso significaria que o site .ch está mal hospedado ou que o seu provedor de serviços de Internet não possui uma boa rota para eles.

Dados os diagramas, isso poderia explicar um grande impacto no desempenho.

Em uma nota lateral, há esta ferramenta interessante que pode ajudá-lo a resolver as coisas, dependendo do seu pedido de carregamento de recursos.

Jerome WAGNER
fonte
4

Tente executar os testes Y! Slow e Page Speed ​​em seu site / página e siga as diretrizes para resolver possíveis gargalos de desempenho. Você deve obter enormes ganhos de desempenho depois de obter uma pontuação mais alta em Y! Slow ou Page Speed.

Esses testes informam o que há de errado e o que mudar.

Livingston Samuel
fonte
Obrigado! as pontuações são: 92 na velocidade da página e 93 na Ylow. O que está faltando são: MANTENHA VIVO = desativado e não usando CDN.
Sam
UPDATE: 96 e 90, respectivamente, atualmente
Sam
4

Então, seu script PHP está gerando as miniaturas a cada carregamento da página? Primeiro, se as imagens que estão sendo miniaturadas não mudam com tanta frequência, você poderia configurar um cache para que não precise ser analisado sempre que a página carregar? Em segundo lugar, o seu script PHP está usando algo como imagecopyresampled()para criar as miniaturas? Essa é uma downsample não trivial e o script PHP não retornará nada até que isso seja feito. A utilização imagecopymerged()reduzirá a qualidade da imagem, mas acelerará o processo. E quanto de redução você está fazendo? Essas miniaturas têm 5% do tamanho da imagem original ou 50%? Um tamanho maior da imagem original provavelmente está levando a uma desaceleração, pois o script PHP precisa obter a imagem original na memória antes de poder encolhê-la e gerar uma miniatura menor.

Meia-noite
fonte
Obrigado MidnightLightning! Há uma pasta de cache, onde miniatura JPGs são criados e reutilizados a partir, embora tenho a sensação de dentro aqui reside o problema do script que eu comprei (e parece funcionar bem para os outros)
Sam
2
Se as miniaturas forem armazenadas em cache, verifique se o script que as extrai do cache está usando, em readfile()vez de ser file_get_contents()seguido por um eco, que aguarda a saída de qualquer coisa até que o arquivo inteiro seja movido para a memória do script PHP.
MidnightLightning
Melhor ainda: se os arquivos estiverem armazenados em cache, gere o HTML de uma maneira que atraia diretamente a imagem em cache do disco sem passar pelo PHP. Isso é o que eu faço em meus scripts para videodb.net
andig
"Existe uma pasta de cache onde ..." e com que rapidez eles são desreferenciados? O seu URL aponta diretamente para um arquivo em cache ou um script PHP? Você redireciona ou usa readfile ()? O mesmo script PHP contém o código de geração de miniaturas - ou você adia carregar a maior parte do código usando include / erquire?
symcbean 10/03/11
4

Encontrei o URL do seu site e verifiquei um arquivo jpg individual na página inicial. Embora o tempo de carregamento seja razoável agora (161ms), ele está aguardando 126ms, o que é demais.

Seus cabeçalhos modificados pela última vez estão todos definidos para sáb, 01 de janeiro de 2011 12:00:00 GMT, que parece "redondo" demais para ser a data real da geração ;-)

Como o controle de cache é "público, idade máxima = 14515200", cabeçalhos arbitrários da última modificação podem causar problemas após 168 dias.

De qualquer forma, este não é o verdadeiro motivo de atrasos.

Você deve verificar o que o gerador de miniaturas faz quando a miniatura já existe e o que pode consumir tanto tempo verificando e entregando a imagem.

Você pode instalar o xdebug para criar um perfil do script e ver onde estão os gargalos.

Talvez a coisa toda use uma estrutura ou se conecte a algum banco de dados à toa. Eu vi mysql_connect () muito lento em alguns servidores, principalmente porque eles estavam se conectando usando TCP e não soquete, às vezes com alguns problemas de DNS.

Entendo que você não pode postar seu gerador pago aqui, mas receio que haja muitos problemas possíveis ...

Cápsula
fonte
Obrigado pelo seu detetive e descobrir pistas Cápsula! Primeiras coisas primeiro: não há banco de dados. Suas descobertas são iguais às minhas: está esperando 90% do tempo? Polegares malucos. Pensamentos interessantes sobre os cabeçalhos modificados pela última vez, porque, de acordo com o post de James aqui, eu tive que definir esses cabeçalhos modificados para um horário estático (fixo), não dinâmico / sempre alterando o tempo definido pelos geradores php gmdate. Ou talvez você queira dizer algo mais aqui? (Indicado para recompensa)
Sam
1
Para ser perfeito, deve refletir a data real da geração, por exemplo, obtendo o tempo de filem () da miniatura em cache. O que seria interessante testar é acessar um arquivo PHP vazio, ou um arquivo PHP apenas ecoando "test" e ver o quanto de espera você tem neste. Talvez o servidor inteiro seja lento e impacte todos os scripts PHP, faça o que fizer.
Cápsula
1
Também estou vendo um atraso relativamente longo em arquivos estáticos puros (por exemplo, as imagens vinculadas aos polegares), como 36ms. Em um dos servidores que estou administrando (que não é uma besta ... de núcleo duplo com 2 GB de RAL), recebo quase metade disso, como 20 ms em arquivos estáticos.
Capsule
Interessante ... 1. que software / ferramenta on-line você usa para medir? 2. Suas medições mais rápidas de 20 ms são consistentes (quantos ± xx%) você acha que seus resultados variam? No meu caso, realmente varia muito, dependendo da ferramenta de teste que eu uso. alguns são muito consistente ( gtmetrix.com ) alguns são realmente variável ( pingdom.com ) e sua difícil dar tempos em ms XX, uma vez que alteram cada vez ...
Sam
Estou usando a guia NET do Firebug. 20ms é o tempo mais rápido que estou conseguindo. Está variando entre 20 e 28. É claro que os 36ms que medi no seu servidor também foram os mais rápidos.
Capsule
4

Se não houver um motivo realmente bom (geralmente não existe), suas imagens não devem chamar o interpretador PHP.

Crie uma regra de reescrita para o servidor da Web que hospeda a imagem diretamente, se ela for encontrada no sistema de arquivos. Caso contrário, redirecione para o seu script PHP para gerar a imagem. Ao editar a imagem, altere o nome do arquivo das imagens para forçar os usuários que possuem uma versão em cache a buscar a imagem recém-editada.

Se não funcionar, pelo menos você o fará agora, não tem nada a ver com a maneira como as imagens são criadas e verificadas.

Goran Jurić
fonte
Obrigado Goran, no entanto, esta não é a solução elegante que eu desejo: acho que há algo suspeito no meu caso, e que normalmente não leva muito tempo para que um script php saiba se passa um cabeçalho 304 ou assa o imagem etc. obrigado de qualquer maneira por sua sugestão, pois direciona o problema de uma perspectiva totalmente nova! O que é valioso por si só +1
Sam
3

Investigue o uso de dados da sessão pelo PHP. Talvez (apenas talvez), o script PHP de geração de imagens esteja esperando para bloquear os dados da sessão, bloqueados pela página principal de renderização contínua ou por outros scripts de renderização de imagem. Isso tornaria todas as otimizações de JavaScript / navegador quase irrelevantes, pois o navegador está aguardando o servidor.

O PHP bloqueia os dados da sessão para todos os scripts em execução, desde o momento em que o tratamento da sessão é iniciado, até o momento em que o script termina ou quando session_write_close () é chamado. Isso efetivamente serializa as coisas. Confira a página do PHP em sessões, especialmente os comentários, como este .

Ricardo Pardini
fonte
Obrigado pela sugestão Ricardo! Parece que Alix está sugerindo o mesmo que você (certo?). Em termos práticos, o que você sugere que eu coloque / remova do código e, em seguida, teste novamente os gráficos e faça o relatório? Muito apreciado.
Sam
1
Acho que sim. Sugiro que você altere os scripts de geração de imagens para que eles não dependam dos dados $ _SESSION ou similares (talvez não o façam). Em seguida, use session_write_close () o mais rápido possível ou, melhor ainda, evite usar sessões nesses scripts. Confira php.net/manual/en/function.session-write-close.php
Ricardo Pardini
3

Este é apenas um palpite, já que não examinei o seu código, mas suspeito que as sessões podem estar desempenhando um papel aqui, o seguinte é da entrada do Manual do PHP em session_write_close():

Os dados da sessão geralmente são armazenados após o script ser finalizado sem a necessidade de chamar session_write_close (), mas como os dados da sessão são bloqueados para impedir gravações simultâneas, apenas um script pode operar em uma sessão a qualquer momento. Ao usar conjuntos de quadros em conjunto com sessões, os quadros serão carregados um a um devido a esse bloqueio. Você pode reduzir o tempo necessário para carregar todos os quadros encerrando a sessão assim que todas as alterações nas variáveis ​​da sessão forem concluídas.

Como eu disse, não sei o que seu código está fazendo, mas esses gráficos parecem estranhamente suspeitos. Eu tive um problema semelhante ao codificar uma função de exibição de arquivo de várias partes e tive o mesmo problema. Ao exibir um arquivo grande, não consegui que a funcionalidade de várias partes funcionasse, nem abri outra página até que o download fosse concluído. Ligar session_write_close()corrigiu meus dois problemas.

Alix Axel
fonte
Obrigado Alix pela sua sugestão. Uma pergunta: a exit();função está em linhas semelhantes às session_write_close();? Atualmente, o autor original do código está investigando o problema, mas parece que ele também está um pouco no escuro, já que ele é uma atualização generosa do código com uma melhor manipulação If-Modified-Since que parece ter os mesmos atrasos (nova cascata gráficos produzidos mesmos gráficos, embora worls reais resultados pareciam / feeled cargas mais rápido Seu uma questão muito estranho ...!
Sam
1
@ Sam: Eu não posso lhe dar nenhuma fonte agora, mas acredito que exit () chama primeiro quaisquer destruidores e / ou funções registrados para desligamento e somente então a sessão é fechada. De qualquer forma, aposto que seu problema provavelmente está antes da sua chamada exit (). Veja também: stackoverflow.com/questions/1674314/…
Alix Axel
2

Você já tentou substituir os thumnails gerados pelo php por imagens regulares para ver se há alguma diferença? O problema pode estar presente - um bug no seu código php que leva à regeneração da miniatura em cada chamada do servidor - um atraso no seu código (sleep ()?) Associado a um problema de relógio - um problema no disco rígido que causa uma condição de corrida muito ruim pois todas as miniaturas são carregadas / geradas ao mesmo tempo.

Jerome WAGNER
fonte
Algo que, em algum momento, pensei em tentar +1 para ler meus pensamentos e revelar a primeira solução que já havia feito. O que eu esperava era descobrir que as imagens normais também carregariam lentamente, para que pudesse ser a velocidade da largura de banda de download ou algo fisicamente limitador, mas descobri que as imagens normais de despejo estático (salvei os polegares gerados e carreguei como estático) foram carregadas Extremamente rápido. Então isso tem a ver com o que o gerador de miniaturas php!
Sam
2

Acho que, em vez de usar esse script gerador de miniaturas, você deve tentar o TinySRC para uma rápida geração de miniaturas, rápida e hospedada na nuvem. Tem uma API muito simples e fácil de usar, você pode usar como: -

http://i.tinysrc.mobi/ [height] / [width] /http://domain.tld/path_to_img.jpg

[largura] (opcional): - É uma largura em pixels (que substitui o tamanho adaptável ou familiar). Se prefixado com '-' ou 'x', subtrairá ou diminuirá para uma porcentagem do tamanho determinado.

[altura] (opcional): - É uma altura em pixels, se também houver largura. Ele também substitui o tamanho adaptativo ou familiar e pode ser prefixado com '-' ou 'x'.

Você pode verificar o resumo da API aqui


Perguntas frequentes

Quanto o tinySrc me custa?

Nada.

Quando posso começar a usar tinySrc?

Agora.

Quão confiável é o serviço?

Não oferecemos garantias sobre o serviço tinySrc. No entanto, ele é executado em uma grande infraestrutura de nuvem distribuída , oferecendo alta disponibilidade em todo o mundo. Deve ser suficiente para todas as suas necessidades.

Quão rápido é?

tinySrc armazena em cache imagens redimensionadas na memória e em nosso armazenamento de dados por até 24 horas , e não buscará sua imagem original todas as vezes. Isso torna os serviços incrivelmente rápidos da perspectiva do usuário. (E reduz a carga do servidor como um bom efeito colateral.)


Boa sorte. Apenas uma sugestão, já que você não está nos mostrando o código: p

Salman von Abbas
fonte
2

Como alguns navegadores baixam apenas 2 downloads paralelos por domínio, você não pode adicionar domínios adicionais para dividir as solicitações em dois a três nomes de host diferentes. por exemplo 1.imagecdn.com 2.imagecdn.com

Tom
fonte
+1 pela sua sugestão: obrigado, mas se você olhar mais de perto nos meus (admitidos: desenhos muito caóticos), verá que alguns itens são provenientes de .......... alguns são provenientes de ........ com .......... de MAS, talvez isso não funcione tão bem quanto sua sugestão? (Vejo que você sugere subdomínios, em vez de apenas domínios diferentes.) #
315
1

Primeiro de tudo, você precisa lidar com If-Modified-Sincesolicitações e de maneira apropriada, como disse James. Esse erro afirma que: "Quando pergunto ao seu servidor se essa imagem foi modificada desde a última vez, ela envia a imagem inteira em vez de um simples sim / não".

O tempo entre a conexão e o primeiro byte geralmente é o tempo que o script PHP leva para executar. É aparente que algo está acontecendo quando esse script começa a ser executado.

  1. Você já pensou em criar um perfil? Pode ter alguns problemas.
  2. Combinado com o problema acima, seu script pode estar sendo executado muito mais vezes do que o necessário. Idealmente, ele deve gerar miniaturas apenas se a imagem original for modificada e enviar miniaturas em cache para todas as outras solicitações. Você verificou se o script está gerando as imagens desnecessariamente (por exemplo, para cada solicitação)?

A geração de cabeçalhos adequados por meio do aplicativo é um pouco complicada, e eles podem ser substituídos pelo servidor. E você está exposto a abusos, pois qualquer pessoa que envie alguns cabeçalhos de solicitação sem cache fará com que o gerador de miniaturas funcione continuamente (e aumente a carga). Portanto, se possível, tente salvar os polegares gerados, chamar as imagens salvas diretamente de suas páginas e gerenciar cabeçalhos .htaccess. Nesse caso, você nem precisaria de nada .htaccessse o seu servidor estiver configurado corretamente.

Além disso, você pode aplicar algumas das idéias brilhantes de otimização das partes de desempenho desta boa pergunta geral sobre SO sobre como criar sites da maneira certa , como dividir seus recursos em subdomínios sem culinária etc. Mas, de qualquer forma, uma imagem em 3k não deve demorar um segundo para carregar, isso é aparente quando comparado a outros itens nos gráficos. Você deve tentar identificar o problema antes de otimizar.

Halil Özgür
fonte
-1: responder a uma solicitação condicional com 'Não modificado' e sem tempo de expiração revisado tornará seu site mais lento em 99,9% dos casos (BTW, AFAIK, não há como fazer com que o Apache emita informações de cache revisadas com uma resposta 304)
symcbean 10/03/11
E o que isso tem a ver com a minha resposta?
Halil Özgür
1

Você já tentou configurar vários subdomínios no servidor NGINX, especialmente para fornecer dados estáticos, como imagens e folhas de estilo? Algo útil já pode ser encontrado neste tópico .

nefo_x
fonte
Obrigado! Após algumas pesquisas, parece que a configuração de subdomínios para cookies estáticos do servidor apenas torna o site mais rápido, quando há muitas imagens, a um custo de um pouco mais. No meu caso, aposto que as 6 imagens não serão carregadas mais rapidamente do que a sobrecarga do domínio sub / extra. Certo?
Sam
1
O NGinx suporta o sendfile syscall, que pode enviar arquivos diretamente do disco rígido. consulte o seguinte documento wiki.nginx.org/HttpCoreModule nas diretivas 'sendfile', 'aio'. Este servidor da web serve arquivos estáticos como imagens muito mais rapidamente que o apache.
Nefo_x 28/02
interessante ... eu não sabia que pode haver algo melhor que o Apache. By the way, o que você quer dizer com straight from hdd. você quer dizer em vez disso straight from DDR3 RAM/ straight from Solid State Diskeu sei que os discos rígidos, diferentemente da ram DDR3 ou dos discos de estado sólido, têm um tempo de acesso muito lento. Mas eu sinto que este não é o gargalo aqui ...
Sam
1
o ponto é que o nginx não armazena em buffer a saída de dados estáticos, como o apache.
Nefo_x 6/03/11
1

Em relação às miniaturas atrasadas, tente fazer uma chamada para flush () imediatamente após a última chamada para o cabeçalho () no script de geração de miniaturas. Depois de concluído, gere novamente o gráfico em cascata e veja se o atraso está agora no corpo, em vez dos cabeçalhos. Nesse caso, você precisa dar uma longa olhada na lógica que gera e / ou gera os dados da imagem.

Esperamos que o script que lida com as miniaturas use algum tipo de cache, para que as ações executadas nas imagens que você está exibindo só ocorram quando for absolutamente necessário. Parece que uma operação cara está ocorrendo toda vez que você exibe as miniaturas, o que atrasa qualquer saída (incluindo os cabeçalhos) do script.

AR Younce
fonte
+1 palpite emocionante vai experimentar agora! informará quando recebi o novo Cachoeira que flui ...
Sam
Infelizmente, depois de adicionar flush();logo após os cabeçalhos, parece não haver nenhuma alteração! O que isso poderia significar?
Sam
Não tenho certeza. Existe alguma maneira de nos vincular ao script PHP em questão? Sei que você pagou por isso, mas é incrivelmente difícil dizer o que pode estar causando o comportamento sem poder ver o que está fazendo.
AR Younce
As miniaturas estão sendo referenciadas em CSS ou em tags <img>?
AR Younce
O que você quer dizer com referenciado em css? eles estão no lado do HTML do corpo e como se segue: <img src="thumbprocessor.php?src=/folder/image.jpg&w=100&h=200" id="thumbnail"/>
Sam
1

A maioria dos problemas lentos é que seu TTFB (tempo até o primeiro byte) está muito alto. É difícil resolver isso sem se intimidar com os arquivos de configuração do servidor, o código e o hardware subjacente, mas posso ver que isso é galopante em todas as solicitações. Você tem muitas barras verdes (ruins) e muito poucas barras azuis (boas). Você pode parar de otimizar um pouco a interface, pois acredito que você fez muito nessa área. Apesar do ditado de que " 80% a 90% do tempo de resposta do usuário final é gasto no front-end ", acredito que o seu esteja ocorrendo no back-end.

TTFB é material de back-end, material de servidor, pré-processamento antes da saída e handshake.

Cronometre sua execução de código para encontrar coisas lentas, como consultas lentas de banco de dados, tempo entrando e saindo de funções / métodos para encontrar funções lentas. Se você usa php, tente o Firephp . Às vezes, uma ou duas consultas lentas são executadas durante a inicialização ou inicialização, como extrair informações da sessão ou verificar a autenticação e o que não é. A otimização de consultas pode levar a alguns bons ganhos de desempenho. Às vezes, o código é executado usando php prepend ou spl autoload, para que funcionem em tudo. Outras vezes, pode ser um mal configurado apache conf e ajustes que salvam o dia.

Procure loops ineficientes. Procure chamadas de busca lenta de caches ou operações de E / S lentas causadas por unidades de disco com defeito ou alto uso de espaço em disco. Procure usos de memória e o que está sendo usado e onde. Execute um teste repetido de 10 páginas na Web, em uma única imagem ou arquivo, usando apenas a primeira visualização de diferentes locais do mundo e não o mesmo local. E leia seus logs de acesso e de erro, muitos desenvolvedores os ignoram e confiam apenas nos erros de saída da tela. Se o seu host da Web tiver suporte, peça ajuda, se eles talvez não pedam ajuda educadamente de qualquer maneira, não vai doer.

Você pode tentar a Pré-busca de DNS para combater os vários domínios e recursos, http://html5boilerplate.com/docs/DNS-Prefetching/

O servidor é um servidor bom / decente? Às vezes, um servidor melhor pode resolver muitos problemas. Sou fã da mentalidade ' hardware é barato, programadores são caros ', se você tiver a chance e o dinheiro atualizar um servidor. E / ou use uma CDN como maxcdn ou cloudflare ou similar.

Boa sorte!

(ps eu não trabalho para nenhuma dessas empresas. Além disso, o link do cloudflare acima argumentará que o TTFB não é tão importante, joguei isso lá para que você possa fazer outra tentativa.)

Anthony Hatzopoulos
fonte
Caro Anthony, muito obrigado por esse conhecimento aprofundado do "fundo". Concordo que às vezes o hardware é o gargalo e isso é menos óbvio para medir, especialmente quando a empresa de hospedagem está hospedando a parte do servidor em um ambiente de hospedagem compartilhada. Eu acho que o cloudflare é uma boa opção para experimentar em conjunto com a otimização da configuração do apache. Saudações!
Sam
-1

Lamento dizer, você fornece poucos dados. E você já teve algumas boas sugestões.

Como você está servindo essas imagens? Se você está transmitindo esses arquivos via PHP, está fazendo uma coisa muito ruim, mesmo que eles já sejam gerados.

NUNCA TRANSMITE IMAGENS COM PHP. Isso reduzirá a velocidade do servidor, não importa como você o use.

Coloque-os em uma pasta acessível, com um URI significativo. Em seguida, ligue diretamente para o URI real. Se você precisar de geração dinâmica, deve colocar um arquivo .htaccess no diretório images, que será redirecionado para um gerador de script php somente se a imagem solicitada estiver ausente. (isso é chamado de estratégia de cache sob solicitação).

Isso corrigirá a sessão php, o proxy do navegador, o cache, o ETAGS, o que for de uma só vez.

O WP-Supercache usa essa estratégia, se configurado corretamente.

Escrevi isso há algum tempo ( http://code.google.com/p/cache-on-request/source/detail?r=8 ), as últimas revisões estão quebradas, mas acho que 8 ou menos devem funcionar e você pode pegue o arquivo .htaccess como exemplo apenas para testar as coisas (embora haja maneiras melhores de configurar o arquivo .htaccess do que antes).

Eu descrevi essa estratégia nesta postagem do blog ( http://www.stefanoforenza.com/need-for-cache/ ). Provavelmente está mal escrito, mas pode ajudar a esclarecer as coisas.

Leitura adicional: http://meta.wikimedia.org/wiki/404_handler_caching

tacone
fonte
Lembre-se, o ErrorDocument não é realmente a melhor coisa que você pode fazer, pois gerou entradas no log de erros do apache, um redirecionamento -f seria melhor.
Tacone
Obrigado pela sua entrada tacone. Você está dizendo que, por melhor que seja o script php, ele diminuirá a velocidade do servidor ou, como você disse em seu post "Isso matará o servidor, não importa o que aconteça."
Sam
isso diminuirá a velocidade do servidor, não importa quão bom seja o script. Para cada imagem, o servidor precisará carregar o php e transmitir a imagem byte a byte. Deixe o apache fazer o trabalho sem passar pelo intérprete php. Como resultado secundário, muitos outros erros possíveis serão automaticamente evitados, como sessões, comprimento do conteúdo, cache, mime / tipo etc.
Tacone 6/03
Desvalorizadores do voto, você poderia explicar o porquê?
Tacone