Pergunta

Eu tenho um colega que está olhando para opcode cache / Zend Aceleração (Eu sempre assumiu estes são a mesma coisa) para o nosso aplicativo baseado em PHP. Seus Benchmarks parecem indicar que não estamos vendo um benefício de desempenho se incluirmos nossos (grandes) bibliotecas de classe com require_once, mas vemos o benefício de desempenho ao usar include_once.

Este cheira bem para nós dois, mas eu não tenho tempo para verificar em nossa metodologia de referência mim e meu colega tem mais tolerância para o cheiro de peixe do que eu. :)

Alguém já correr em nada parecido com isso? Se não, todos os pensamentos sobre outras coisas que podem estar causando o aparecimento de um aumento de desempenho, passando de include_once para require_once?

Foi útil?

Solução

Para começar, ambas as chamadas (require_once e include_once) duplo verificar se um arquivo não foi incluído antes.

Assim, a maneira que ambos conseguir isso é através de pesquisa o arquivo em todos os caminhos disponíveis e essencialmente verificar se não foi na mistura antes etc ..

No fundo o que acontece é que eles avaliam todas as diferentes opções (por exemplo, múltipla include_path do, etc.) e, em seguida, criando o realpath a partir desta forma abreviated eles criam um identificador exclusivo. Há apenas uma e o mesmo caminho -. Não dois

Este já não é o processo mais rápido do planeta e geralmente acontece a cada solicitação com o PHP. Em seguida, adicione outra operação cara que é o status quando ele cria o que chamei de realpath (realpath, porque é uma espécie do que realpath () faz) para verificar se o arquivo existe.

me corrija se eu estiver errado, mas APC tem otimizações especialmente para este caso.

De qualquer forma - agora em que a diferença entre require_once e include_once, o que é que require_once avalia o arquivo (para baixo nível erros de análise, etc.) quando se inclui-lo. Esta é uma verificação adicional que você pode se livrar de se você tem QA suficiente no lugar que um erro de análise nunca pode esgueirar-se em um include.

É difícil encontrar contrário. : -)

(Algo a considerar:. Você poderia desenvolver com require_once e substituir todas as chamadas com include_once quando você implanta)

Como para um cache opcode - Eu recomendo APC . Tem sido discutido em stackoverflow antes. Pessoalmente, estou / estamos a usá-lo por um tempo (lidamos com cerca de 100 mil visitantes / dia com 3 frontends e 1 backend) e estamos muito felizes. A APC também está optimizado para o require_once / loucura include_once.

Um muito legal efeito colateral é que APC também permite armazenar variáveis ??PHP na memória - espécie de persistente, etc ..

Um par de ponteiros adicionais:

  1. Um monte de pessoas afirmam acelerar qualquer aplicação com __autoload .
  2. Com um cache de código de operação, evitar condicional require_once / include_once (por exemplo, em ciclos ou em controlo de fluxo).
  3. Algumas pessoas dizem que /absolute/path/to/file.php em include_ ou require_once é mais rápido do que confiar no include_path.
  4. A ordem dos caminhos em seus assuntos include_path também.

Espero que ajude.

Outras dicas

Eu não posso guarantuee qualquer coisa como eu não olhei profundamente o suficiente para ele, mas sim, eu tenho visto diferenças de velocidade entre os dois. Eles eram o suficiente para nunca significativo para mim para passar para include_once vez de require_once embora.

Eu sempre assumiu a diferença era porque require_once tem de fazer mais trabalhos subaquáticos. pelo menos um erro mais potencial para se preparar e punho, e muito mais a fazer quando o arquivo desejado não existe.

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