01 de novembro de 2009 2 Comentários

A Cautionary Tale of Woe: A Bug That Got Away

http://markbeljaars.com/wp-content/plugins/sociofluid/images/digg_48.png~~V http://markbeljaars.com/wp-content/plugins/sociofluid/images/reddit_48.png~~V http://markbeljaars.com/wp-content/plugins/sociofluid/images/stumbleupon_48.png~~V http://markbeljaars.com/wp-content/plugins/sociofluid/images/delicious_48.png~~V http://markbeljaars.com/wp-content/plugins/sociofluid/images/furl_48.png~~V http://markbeljaars.com/wp-content/plugins/sociofluid/images/technorati_48.png~~V http://markbeljaars.com/wp-content/plugins/sociofluid/images/facebook_48.png~~V http://markbeljaars.com/wp-content/plugins/sociofluid/images/yahoobuzz_48.png~~V http://markbeljaars.com/wp-content/plugins/sociofluid/images/mixx_48.png~~V http://markbeljaars.com/wp-content/plugins/sociofluid/images/twitter_48.png~~V

Na semana passada, lançou uma versão atualizada do meu Índice Criador plugin para o WordPress. Eu orgulho-me em meu código, encontrar falhas e testar habilidades. Isso tudo veio abaixo em uma única noite.

Para cortar uma longa história curta, a nova revisão necessária uma função auxiliar para exibir os trabalhos no correio. A função de auxiliar só foi chamado por uma função e eu, portanto, eleito para incluir a função de auxiliar como uma criança dessa função. Esta é uma prática comum em muitas línguas como ordenadamente empacota todas as funções e seus ajudantes nas proximidades. A função dos pais pela forma como é chamada cada vez que uma página é exibida e termina imediatamente se essa página não inclui o site tag iniciador mapa.

Ok. O tempo passa. É agora 02:00. O código já está pronto para testar. Eu sei que a função sai mãe imediatamente se ele não encontrar a marca de iniciador. Este fato já havia trabalhado, e eu fui longe dele, por isso deve continuar a trabalhar. Certo? Eu verifique a página de mapa do site, experimente todas as opções de novos e antigos e provar que o código está funcionando conforme o esperado. Eu rapidamente sincronizar o repositório SVN e correr para a cama para dormir um pouco antes de o sol aparecer.

Na manhã seguinte eu decidir para verificar um grande site eu sei que usa meu plugin. Não há nenhum substituto para o teste do mundo real. Sim, tudo parece bom. Naquele momento eu percebi um post no mapa do site que parecia interessante. Eu cliquei no link da categoria e foi presenteado com o primeiro post na categoria e, em seguida, uma mensagem de erro grande desagradável php. Mmm. Olhei para outro grande site. Mmm. Talvez uma coincidência. Vamos olhar para mais um. Oh não!

Então, o que deu errado? Lembre-se que a função da criança? Eu ouvi dizer que as crianças podem estar mal e ele acabou por ser verdade neste caso. Se uma página do blog, página de categoria, página tag ou até mesmo uma página para casa foi exibido, vários posts são mostrados em uma única página. WordPress faz isso fingindo que cada post é uma mini-página e liga todas as páginas mini-juntos para formar uma grande página. Isto significa que a minha função de pai é chamado várias vezes. Normalmente não é um problema. Mas agora que a função contém funções de crianças, estas funções de crianças são criadas cada vez que a função dos pais é chamado (mesmo que eles não são usados). Portanto, quando o então segundo post é exibido, a página trava com uma mensagem de erro duplicado o nome da função. O resultado líquido era que um pequeno erro em uma função aparentemente não causou vários sites muito grandes para ir para baixo.

A moral da história: se você for um administrador do site, certifique-se de executar o conjunto completo de testes após cada atualização de plugins, não importa quão grande ou pequeno plug-in que pode ser.


SpinChimp Leaderboard 728x90