{"id":185,"date":"2006-08-02T02:19:47","date_gmt":"2006-08-02T01:19:47","guid":{"rendered":"http:\/\/inacreditavel.ioio.info\/?p=185"},"modified":"2006-08-06T13:10:27","modified_gmt":"2006-08-06T12:10:27","slug":"fo4-s3-para-o-php","status":"publish","type":"post","link":"http:\/\/www.inacreditavel.pt\/?p=185","title":{"rendered":"Fo#4-s3 para o PHP"},"content":{"rendered":"<p>Pela 2\u00aa vez esta semana, s\u00f3 me apetece mandar o PHP para o k4r41$0. E desta vez, pode levar o MySQL com ele. Um dia destes, largo isto e passo-me para o <a href=\"http:\/\/www.ruby-lang.org\/\">Ruby<\/a>.<\/p>\n<p>Passei um dia inteiro, das 10 da manh\u00e3 at\u00e9 agora, a resolver uma merdice que me fez perder 15 horas. Vou deixar isto escrito para ver se n\u00e3o me acontece mais vez nenhuma. Nem aos meus queridos leitores!<\/p>\n<p>Estive a passar tudo para UTF-8: textos em ficheiro e em BD, para poder colocar as l\u00ednguas que for preciso, no caso do jogo come\u00e7ar a expandir-se. O UTF-8 (Unicode em peda\u00e7os [eventualmente m\u00faltiplos] de 8 bits) \u00e9 porreiro, pois permite albergar todos os caracteres de todas as l\u00ednguas. E como o MySQL suporta UTF-8, decidi tentar.<\/p>\n<p>Primeiro passei os ficheiros PHP todos para UTF. Ainda demorei uns minutos. Depois foi a BD. A 1\u00aa passagem para UTF correu mal. Passei todas as tabelas com strings SQL com este formato:<\/p>\n<p>ALTER TABLE tabela CONVERT TO CHARACTER SET utf8 COLLATE utf8_unicode_ci;<\/p>\n<p>e o MySQL come\u00e7ou a reiniciar-se automaticamente de 2 em 2 minutos. Porra! L\u00e1 peguei no backup que tinha feito imediatamente antes e recuperei a BD. Voltei \u00e0 vers\u00e3o anterior dos ficheiros PHP tamb\u00e9m e testei: estava tudo OK.<\/p>\n<p>Experimentei de novo. Correu mal outra vez. Voltou tudo ao in\u00edcio.<\/p>\n<p>Brincar, assim, com uma BD que tem mais de 4.2 milh\u00f5es de registos d\u00e1 tempo para ir almo\u00e7ar, fumar um charuto, ver o CSI e sei l\u00e1 mais o qu\u00ea.<\/p>\n<p>3\u00aa tentativa. Desta vez comecei a converter por partes. Quando me estava a aproximar do fim, decidi n\u00e3o converter tabelas com campos bin\u00e1rios (que \u00e9 s\u00f3 uma) e correu bem.O PHP estava porreiro, o MySQL tamb\u00e9m, mas o jogo n\u00e3o funcionava. Talvez fossem s\u00f3 uns pormenores, pensei eu.<\/p>\n<p>Descobri que o Firefox estava a embirrar com os dados em UTF que vinham via Ajax. Mais cegada. Ao fim de mais duas horas, encontrei uma solu\u00e7\u00e3o. Retirei a linha seguinte, do meu objecto de comunica\u00e7\u00e3o Ajax, que estava a obrigar o FF a interpretar o XML de forma estrita e isso colidia com o facto dos dados chegarem em UTF:<\/p>\n<p>xmlHttpReq.overrideMimeType(&#8216;text\/xml&#8217;);<\/p>\n<p>Depois de retirar esta linha, o Ajax passou a funcionar. Comecei a receber dados. Fui testar o jogo de novo. Agora eram as imagens que n\u00e3o vinham. Tenho as imagens dos objectos do jogo em BD, pois a gest\u00e3o \u00e9 muito mais eficaz. E sempre que o PHP lia uma imagem da BD e a enviava para o browser, acrescentava-lhe uns bytes \u00e0 cabe\u00e7a (e retirava uns \u00e0 cauda).<\/p>\n<p>Depois de mais umas 3 horas de &#8220;trabalho&#8221;, e de consulta de muitos relat\u00f3rios de bugs, l\u00e1 encontrei uma solu\u00e7\u00e3o. Encontrei, n\u00e3o. Percebi. Pois n\u00e3o havia uma solu\u00e7\u00e3o directa para este problema.<\/p>\n<p>Aqui vai ela: Para ler imagens de bases de dados e envi\u00e1-las para o browser com PHP, nenhum dos ficheiros PHP envolvidos pode ser gravado em UTF. Nem o ficheiro de base, nem os includes nem os requires. Caso contr\u00e1rio, o PHP envia uns bytes (BOM = byte mark order) no in\u00edcio da imagem e estraga tudo. Este BOM  d\u00e1 indica\u00e7\u00e3o ao browser de que se trata de um ficheiro utf, e \u00e9 o suficiente para estragar a imagem. O BOM \u00e9 uma sequ\u00eancia de caracteres: EF BB BF EF BB BF EF BB BF EF BB BF &#8230; Aparentemente, pode ser qq sequ\u00eancia de EFBBBF.<\/p>\n<p>Voltei a gravar todos os ficheiros envolvidos na cria\u00e7\u00e3o de imagens como ANSI e l\u00e1 comecei a receber as imagens. Merda para isto. Com este n\u00edvel de produtividade at\u00e9 pare\u00e7o um funcion\u00e1rio p\u00fablico.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Pela 2\u00aa vez esta semana, s\u00f3 me apetece mandar o PHP para o k4r41$0. E desta vez, pode levar o MySQL com ele. Um dia destes, largo isto e passo-me para o Ruby. Passei um dia inteiro, das 10 da manh\u00e3 at\u00e9 agora, a resolver uma merdice que me fez perder 15 horas. Vou deixar [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[1,3],"tags":[],"_links":{"self":[{"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/posts\/185"}],"collection":[{"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=185"}],"version-history":[{"count":0,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=\/wp\/v2\/posts\/185\/revisions"}],"wp:attachment":[{"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=185"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=185"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/www.inacreditavel.pt\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=185"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}