Pergunta

toneladas para o nosso jogo on-line, temos escritos de classes e funções PHP agrupadas por tema nos arquivos e, em seguida, pastas. No final, temos agora todo o nosso código de backend (lógica & DB camadas de acesso) em um conjunto de arquivos que chamamos de libs e incluímos nossos libs em nossa GUI (páginas web, camada de apresentação) usando include_once ( 'pathtolib / file.inc') .

O problema é que temos sido preguiçoso com inclusões ea maioria inclui declarações são feitas dentro de nosso arquivo libs resultando que a partir de cada página, cada vez que incluem qualquer arquivo libs, nós realmente carregar as libs inteiras, arquivo por arquivo.

Isto tem um impacto significativo sobre o desempenho. Portanto, o que seria a melhor solução?

  • Remova todas as instruções include do arquivo de libs e só chamar o necessário a partir das páginas da web?
  • fazer outra coisa?

Server utiliza uma pilha LAMP clássica (PHP5).

EDIT: Nós temos uma mistura de funções simples (razão legado e a maior parte do código) e classes. Então autoload não será suficiente.

Foi útil?

Solução

  • Gerenciar tudo inclui manualmente, apenas onde for necessário
  • Defina o seu include_path apenas onde tem que ser, o padrão é algo como:. / Usr / lib / pêra /: / usr / lib / php, aponte-se apenas com onde ele tem que ser, php.net/ set_include_path
  • Não use autoload, é lento e faz APC e empregos caches equivalentes muito mais difícil
  • Você pode desligar o -operation "status" em APC, mas então você tem que limpar o cache manualmente cada vez que você atualizar os arquivos

Outras dicas

Se você já fez a sua programação de forma orientada a objetos, você pode fazer uso do autoload função, que irá carregar classes de seus arquivos de origem sob demanda como você chamá-los.

Editar : Notei que alguém downvoted ambas as respostas que se refere o carregamento automático. Será que estamos errados? É a sobrecarga da função __autoload alto demais para usá-lo para fins de desempenho? Se há algo que eu não estou percebendo sobre esta técnica, eu estaria realmente interessado em saber o que é.

Se você quiser ficar realmente hard-core, fazer alguma análise estática, e descobrir exatamente o que as bibliotecas são necessários quando, e apenas incluem aqueles.

Se você usar include e não include_once, então há um pouco de uma economia de velocidade lá também.

Tudo o que disse, a resposta de Matt sobre o Zend Optimizer é certo sobre o dinheiro. Se você quiser, experimentar o avançado PHP Cache (APC), que é um cache opcode, e livre. Ele deve estar no repositório PECL.

Você pode usar spl_autoload_register () ou __autoload () para criar quaisquer regras que você precisa para incluir os arquivos que você precisa para as aulas, no entanto autoLoad introduz suas próprias despesas gerais de desempenho. Você vai precisar para se certificar de que você usa é anexado a todas as páginas GUI usando uma configuração php.ini ou um apache configuração.

Para seus arquivos com funções genéricas, gostaria de sugerir que você envolvê-los em uma classe de utilitário e fazer um simples localizar e substituir para substituir toda a sua função () chama com util :: function (), que passaria então a permitir-lhe autoLoad estas funções (mais uma vez, há uma sobrecarga introduzida para chamar um método em vez de uma função global).

Essencialmente, a melhor coisa a fazer é voltar passar por seu código e saldar a sua dívida projeto fixando a incluir questões. Isto lhe dará o benefício mais desempenho, e vai permitir que você faça o máximo de optimisers como eAccelerator, Plataforma Zend e APC

Aqui é um método de amostra para o material de carga dinamicamente

public static function loadClass($class)
{
    if (class_exists($class, false) ||
        interface_exists($class, false))
    {
        return;
    }

    $file = YOUR_LIB_ROOT.str_replace('_', DIRECTORY_SEPARATOR, $class).'.php';

    if (file_exists($file))
    {
        include_once $file;
        if (!class_exists($class, false) &&
            !interface_exists($class, false))
        {
            throw new Exception('File '.$file.' was loaded but class '.$class.' was not found');
        }
    }
}

O que você está procurando é Automap PECL extensão .

Ele basicamente permite carregamento automático com apenas uma pequena sobrecarga de carregar um arquivo de mapa pré-calculado. Você pode também sub dividir o arquivo de mapa se você conhece um diretório específico só puxar a partir de determinados arquivos PHP.

Você pode ler mais sobre isso aqui .

Tem sido um tempo desde que eu usei php, mas não deve a ajuda Zend Optimizer ou Cache neste caso? O PHP ainda carregar e compilar cada arquivo incluído novamente para cada solicitação?

Eu não tenho certeza se autoloading é a resposta. Se esses arquivos são incluídos, eles são provavelmente necessárias na classe, incluindo-lo, então eles ainda serão carregados automaticamente de qualquer maneira.

Use um cache de código byte (idealmente APC), de modo que o PHP não precisa analisar as bibliotecas em cada carregamento da página. Esteja ciente de que usando autoload vai negar os benefícios de usar um cache de código byte (você pode ler mais sobre este aqui ).

Use a profiler . Se você tentar otimizar sem ter medidas, você está cego funcionando.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top