Alteração de arquivo em um servidor de desenvolvimento LAMP não levado em conta

4

Eu configurei uma pequena máquina virtual LAMP para desenvolvimento em PHP.

Funciona bem, exceto que quando uma imagem que já foi exibida é modificada no disco e, em seguida, solicitada novamente, a imagem "antiga" ainda está sendo exibida (recebo uma resposta não modificada do apache2). Esse comportamento de armazenamento em cache é desejável em um servidor, mas é um problema em um ambiente de desenvolvimento em que os arquivos são editados com freqüência.

As únicas maneiras (inconvenientes) que encontrei para acessar o novo conteúdo do arquivo são:

  1. reinicializando a VM,
  2. ou emissão de sync; echo 3 > /proc/sys/vm/drop_caches

Existe uma diretiva do apache que eu possa usar para garantir que o apache verifique se um arquivo foi alterado no disco toda vez que é solicitado?

Atualizar : módulos do Apache carregados:

# apache2ctl -t -D DUMP_MODULES
Loaded Modules:
 core_module (static)
 log_config_module (static)
 logio_module (static)
 mpm_prefork_module (static)
 http_module (static)
 so_module (static)
 alias_module (shared)
 auth_basic_module (shared)
 authn_file_module (shared)
 authz_default_module (shared)
 authz_groupfile_module (shared)
 authz_host_module (shared)
 authz_user_module (shared)
 autoindex_module (shared)
 cgi_module (shared)
 deflate_module (shared)
 dir_module (shared)
 env_module (shared)
 mime_module (shared)
 negotiation_module (shared)
 php5_module (shared)
 setenvif_module (shared)
 status_module (shared)
Syntax OK

Editar : na verdade, meu DocumentRoot é armazenado em uma pasta compartilhada do VirtualBox. Parece que quando um arquivo é sobrescrito, o módulo virtualbox não notifica o Linux para invalidar seu cache. Daí o comportamento contra-intuitivo. Quando eu executo a mesma operação de sobrescrita em um diretório linux "regular", nada disso acontece.

    
por oparisy 25.07.2010 / 16:08

3 respostas

4

OK, eu encontrei a explicação em um ticket do VirtualBox : a otimização do "sendfile" parece não ser implementada pelo módulo vboxsf.

Até que este problema seja resolvido, uma solução alternativa é usar essa diretiva do Apache:

EnableSendfile Off 

Usando isso, as alterações nas imagens do lado do servidor são levadas em conta imediatamente.

    
por 31.07.2010 / 11:51
1

Como este é apenas um servidor de desenvolvimento, onde os arquivos são alterados frequentemente, a solução mais fácil é desabilitar o armazenamento em cache inteiramente para o servidor (ou pelo menos para o VirtualHost responsável pelo site que está sendo modificado). Você pode usar a Diretiva CacheDisable para instruir mod_cache no Apache para lidar com isso.

The CacheDisable directive instructs mod_cache to not cache urls at or below url-string.

CacheDisable /local_files

Outras opções incluem observar as diretivas disponíveis para mod_disk_cache e < href="http://httpd.apache.org/docs/2.2/mod/mod_mem_cache.html" title="mod_mem_cache"> mod_mem_cache e usá-los para controlar o armazenamento em cache no seu servidor. Você também pode executar htcacheclean como um daemon para controlar / limitar o cache de disco usado por mod_disk_cache.

Atualização: Se o mod_cache não estiver habilitado, as diretivas acima não funcionarão. Isso também significa que qualquer armazenamento em cache está sendo feito no nível do sistema operacional em vez do Apache - tanto quanto eu sei, apenas mod_cache (com mod_mem_cache / mod_disk_cache) ou mod_file_cache são as únicas duas maneiras de realizar o cache no Apache. Você pode ver mais informações sobre isso lendo a seção Cache de sistema operacional no Guia de cache do Apache .

Você também pode ver as respostas para essa pergunta ( Desabilitar todo o cache de disco do apache2 no linux ) também postado no ServerFault. Ele não fornece uma maneira de desativar o armazenamento em cache no nível do Linux, mas indica que você pode executar constantemente o seguinte:

watch -n 1 'sync; echo 3 > /proc/sys/vm/drop_caches'

Isso pode ser usado para liberar o conteúdo de tudo armazenado em cache na memória.

    
por 25.07.2010 / 17:17
1
O

verifica - parece que os carimbos de hora não estão sendo definidos para a hora atual quando o arquivo é implementado.

Veja minha resposta aqui . Basicamente, o pedido condicional é um PITA e normalmente piora o desempenho em vez de melhorá-los. Embora essa resposta seja em relação ao desempenho do cache, ela também resolverá seu problema.

C.

    
por 26.07.2010 / 18:40