{"id":2640,"date":"2009-08-04T11:08:21","date_gmt":"2009-08-04T10:08:21","guid":{"rendered":"https:\/\/www.fullo.net\/blog\/?p=2640"},"modified":"2009-08-04T11:08:21","modified_gmt":"2009-08-04T10:08:21","slug":"ottimizzare-symfony-su-dreamhost","status":"publish","type":"post","link":"https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/","title":{"rendered":"Ottimizzare symfony su DreamHost"},"content":{"rendered":"<p><a href=\"http:\/\/www.twitornot.com\"><img data-recalc-dims=\"1\" loading=\"lazy\" decoding=\"async\" src=\"https:\/\/i0.wp.com\/www.fullo.net\/blog\/wp-content\/uploads\/2009\/08\/twitornot-symfony-on-dreamhost1.png?resize=500%2C191\" alt=\"twitornot: symfony on dreamhost optimization\" title=\"twitornot: symfony on dreamhost optimization\" width=\"500\" height=\"191\" class=\"alignleft size-full wp-image-2644\" srcset=\"https:\/\/i0.wp.com\/www.fullo.net\/blog\/wp-content\/uploads\/2009\/08\/twitornot-symfony-on-dreamhost1.png?w=500&amp;ssl=1 500w, https:\/\/i0.wp.com\/www.fullo.net\/blog\/wp-content\/uploads\/2009\/08\/twitornot-symfony-on-dreamhost1.png?resize=300%2C114&amp;ssl=1 300w\" sizes=\"auto, (max-width: 500px) 100vw, 500px\" \/><\/a> Qualche giorno fa, come esperimento personale, ho aggiornato (grazie all&#8217;aiuto di <a href=\"http:\/\/federicomoretti.name\/\">Federico<\/a> per il layout), <a href=\"http:\/\/twitornot.com\">TwitOrNot<\/a>. Di per s\u00e8 l&#8217;applicazione \u00e8 abbastanza banale, ma l&#8217;esercizio \u00e8 stato fatto per testare alcune idee che da qualche tempo mi giravano per il cervello.<\/p>\n<p>Innanzitutto, <a href=\"http:\/\/twitornot.com\">TwitOrNot<\/a> migra dalla versione 1.1 alla 1.2.x di <a href=\"http:\/\/symfony.it\">symfony<\/a>, nel suo piccolo implementa l&#8217;autenticazione <a href=\"http:\/\/apiwiki.twitter.com\/OAuth-FAQ\">oAuth<\/a> di <a href=\"http:\/\/fullo.net\/blog\/search\/twitter\">Twitter<\/a> non salvando in locale le password ma gestendo tutto tramite le API di quest&#8217;ultimo. Altra miglioria \u00e8 stata la sostituzione, indolore visto l&#8217;esiguo numero di tabelle, di Propel con <a href=\"http:\/\/www.doctrine-project.org\/\">Doctrine<\/a>, usando per quest&#8217;ultimo <a href=\"http:\/\/www.symfony-project.org\/doctrine\/1_2\/en\/07-Migrations\">gli script di migrazione<\/a> per gestire future implementazioni.<\/p>\n<p>La cosa su cui per\u00f2 mi sono divertito di pi\u00f9 \u00e8 stata l&#8217;ottimizzazione dell&#8217;applicazione per l&#8217;utilizzo su un hosting come <a href=\"http:\/\/www.dreamhost.com\/r.cgi?98914\">DreamHost<\/a> utilizzando <a href=\"http:\/\/developer.yahoo.com\/yslow\/\">ySlow<\/a> come calibro del mio lavoro.<\/p>\n<p>Utilizzando lo script di analisi di Yahoo!, l&#8217;applicazione, nuda e cruda, presentava un bel D (a volte E) come risultato. Successivamente portato, tramite tweak del file di default <code>.htaccess<\/code> di symfony ad un onestissimo B (a volte C).<\/p>\n<p>Vediamo in dettaglio i passaggi fatti.<\/p>\n<p><!--more--><\/p>\n<p>Settiamo come prima cosa nel file <code>settings.yml<\/code> della nostra applicazione il parametro <code>etags<\/code> a true proseguiamo l&#8217;opera di ottimizzazione modificando il file <code>.htaccess<\/code> presente nella directory web della nostra applicazione symfony cos\u00ec come segue.<\/p>\n<p>Fortunatamente DreamHost mette a nostra disposizione i moduli  <code>mod_expires<\/code>, <code>mod_headers<\/code> e <code>mod_deflate<\/code> per Apache gi\u00e0 abilitati, altrimenti se state usando un vostro server dar\u00f2 per scontato che siano stati abilitati. Inoltre <a href=\"http:\/\/www.dreamhost.com\/r.cgi?98914\">DreamHost<\/a> utilizza FastCGI, purtroppo per\u00f2 con APC disabilitato (anche se \u00e8 possibile, <a href=\"http:\/\/www.ercoppa.org\/blog-PHP-53--Xdebug--APC-install-script-per-Dreamhost.htm\">con qualche trick<\/a>, abilitarlo).<\/p>\n<p>[code]<br \/>\nOptions +FollowSymLinks +ExecCGI<\/p>\n<p><IfModule mod_expires.c><br \/>\n  FileETag None<\/p>\n<p>  ExpiresActive On<br \/>\n  ExpiresDefault &#8220;access plus 300 seconds&#8221;<br \/>\n  ExpiresByType text\/html &#8220;access plus 1 day&#8221;<br \/>\n  ExpiresByType text\/css &#8220;access plus 10 day&#8221;<br \/>\n  ExpiresByType text\/javascript &#8220;access plus 10 day&#8221;<br \/>\n  ExpiresByType image\/gif &#8220;access plus 10 day&#8221;<br \/>\n  ExpiresByType image\/jpg &#8220;access plus 10 day&#8221;<br \/>\n  ExpiresByType image\/png &#8220;access plus 10 day&#8221;<br \/>\n  ExpiresByType image\/x-icon &#8220;access plus 90 day&#8221;<br \/>\n<\/IfModule><\/p>\n<p><IfModule mod_deflate.c><br \/>\n  AddOutputFilterByType DEFLATE text\/html text\/plain text\/xml text\/javascript text\/css application\/javascript<br \/>\n<\/IfModule><\/p>\n<p>#il restante .htaccess ufficiale<br \/>\n[\/code]<\/p>\n<p>Vediamo punto per punto quello che \u00e8 stato fatto.<\/p>\n<p>[code]<br \/>\n<IfModule mod_expires.c><br \/>\n  FileETag None<br \/>\n[\/code]<\/p>\n<p>Innanzitutto, dopo aver controllato che il modulo <a href=\"http:\/\/httpd.apache.org\/docs\/2.0\/mod\/mod_expires.html\">mod_expires<\/a> sia stato attivato, disabilito la generazione degli <a href=\"http:\/\/httpd.apache.org\/docs\/2.2\/mod\/core.html#fileetag\">ETAG di Apache<\/a> in modo da forzare il browser a credere agli header che saranno passati dal server senza controllare nella sua cache. Altra conseguenza del disabilitare gli ETAG \u00e8 che, se la nostra applicazione prevede l&#8217;accesso a molti file contemporaneamente (non \u00e8 il caso di TwitOrNot) <strong>viene ridotto il carico di lavoro di I\/O<\/strong> in quanto non vengono controllate, ad ogni richiesta, le informazioni sulle risorse richieste.<\/p>\n<p>[code]<br \/>\n  ExpiresActive On<br \/>\n  ExpiresDefault &#8220;access plus 300 seconds&#8221;<br \/>\n  ExpiresByType text\/html &#8220;access plus 1 day&#8221;<br \/>\n  ExpiresByType text\/css &#8220;access plus 10 day&#8221;<br \/>\n  ExpiresByType text\/javascript &#8220;access plus 10 day&#8221;<br \/>\n  ExpiresByType image\/gif &#8220;access plus 10 day&#8221;<br \/>\n  ExpiresByType image\/jpg &#8220;access plus 10 day&#8221;<br \/>\n  ExpiresByType image\/png &#8220;access plus 10 day&#8221;<br \/>\n  ExpiresByType image\/x-icon &#8220;access plus 90 day&#8221;<br \/>\n[\/code]<\/p>\n<p>Ecco quindi che inviamo gli header modificati in modo che il browser sappia cosa, e come, mettere in cache. E&#8217; molto importante fare un attento tuning degli expire header da configurare. Infatti se \u00e8 abbastanza sensato far si che la favicon sia salvata in cache per lunghi periodi di tempo ( <code>ExpiresByType image\/x-icon \"access plus 90 day\"<\/code> ) lo \u00e8 un p\u00f2 di meno per i file html che potrebbero essere modificati anche pi\u00f9 volte al giorno. Nel caso specifico di TwitOrNot ho preferito configurare l&#8217;expire ad 1 giorno, ma avrei potuto benissimo abbassare la soglia a qualche ora, cos\u00ec come avrei potuto alzare la soglia di javascript e css a valori pi\u00f9 alti.<\/p>\n<p>Sconsiglio di usare <code>Modified<\/code> come metodo di default di expire, in quanto se non modificate le immagini per lunghi periodi di tempo i browser cercheranno di riscaricarle ogni volta.<\/p>\n<p>[code]<br \/>\n<IfModule mod_deflate.c><br \/>\n  AddOutputFilterByType DEFLATE text\/html text\/plain text\/xml text\/javascript text\/css application\/javascript<br \/>\n<\/IfModule><br \/>\n[\/code]<\/p>\n<p>Dopo aver modificato gli header e gli expire, in modo da ottimizzare la cache del browser, \u00e8 tempo di concentrarsi sulla riduzione della banda utilizzata. Per farlo ho usato <a href=\"http:\/\/httpd.apache.org\/docs\/2.2\/mod\/mod_deflate.html\">mod_deflate<\/a>, ottima alternativa al vecchio <a href=\"http:\/\/sourceforge.net\/projects\/mod-gzip\/\">mod_gzip<\/a> e (cosa importante) supportato pienamente anche su sistemi non LAMP. La configurazione proposta per il metodo \u00e8 abbastanza banale, forzo che tutti i file di testo serviti dal server siano compressi. Se pensate che da 140kb di prototype (puro) si pu\u00f2 passare a meno di 30k la soluzione \u00e8 pi\u00f9 che soddisfacente. <\/p>\n<p>Usare <code>mod_deflate<\/code> \u00e8 sicuramente un&#8217;ottima soluzione se la vostra applicazione offre delle API JSON, o genera un gran numero di pagine HTML di cui volete ridurre il bandwidth footprint. Se per\u00f2 avete solo qualche file javascript potreste limitarvi al solo <a href=\"http:\/\/developer.yahoo.com\/yui\/compressor\/\">YUI compressor<\/a> per ridurre voi stessi le dimensioni degli stessi, piuttosto che andare ad incidere sulla CPU della vostra macchina.<\/p>\n<p>Un altro trucchetto, da usare con symfony, consiste nell&#8217;inserire all&#8217;interno di una action particolarmente pesante, e che non deve essere aggiornata troppo di frequente il seguente comando:<\/p>\n<p>[code]<br \/>\n  $this->getResponse()->setHttpHeader(&#8216;Last-Modified&#8217;, $this->getResponse()->getDate($timestamp));<br \/>\n[\/code]<\/p>\n<p>questo forzer\u00e0 all&#8217;interno dell&#8217;output di symfony l&#8217;inserimento di un header con valore <code>Last-Modified<\/code> uguale al <code>$timestamp<\/code> dichiarato. Se ad esempio la vostra action invoca un oggetto che ha l&#8217;attributo <em>automagico<\/em> <code>updated_at<\/code>, potreste usare quest&#8217;ultimo come valore del timestamp da applicare all&#8217;header.<\/p>\n<p>Come ultimi approfondimenti, lato <a href=\"http:\/\/www.symfony.it\">symfony<\/a>, vi suggerisco di leggere il <a href=\"http:\/\/www.symfony-project.org\/book\/1_2\/18-Performance\">capitolo 18 della guida definitiva a symfony<\/a> ed a dare un occhio alla documentazione di <a href=\"http:\/\/pecl.php.net\/package\/memcached\">memcached<\/a> (a cui, forse, dedicher\u00f2 un post in futuro).<\/p>\n<p>ciuaz<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Qualche giorno fa, come esperimento personale, ho aggiornato (grazie all&#8217;aiuto di Federico per il layout), TwitOrNot. Di per s\u00e8 l&#8217;applicazione \u00e8 abbastanza banale, ma l&#8217;esercizio \u00e8 stato fatto per testare alcune idee che da qualche tempo mi giravano per il cervello. Innanzitutto, TwitOrNot migra dalla versione 1.1 alla 1.2.x di symfony, nel suo piccolo implementa [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_jetpack_newsletter_access":"","_jetpack_dont_email_post_to_subs":false,"_jetpack_newsletter_tier_id":0,"_jetpack_memberships_contains_paywalled_content":false,"_jetpack_memberships_contains_paid_content":false,"footnotes":"","jetpack_publicize_message":"","jetpack_publicize_feature_enabled":true,"jetpack_social_post_already_shared":false,"jetpack_social_options":{"image_generator_settings":{"template":"highway","default_image_id":0,"font":"","enabled":false},"version":2},"jetpack_post_was_ever_published":false},"categories":[9,12],"tags":[808,313,1962,2097,2096,1465,926,2098],"class_list":["post-2640","post","type-post","status-publish","format-standard","hentry","category-php","category-webdev","tag-apache","tag-dreamhost","tag-ideato","tag-mod_deflate","tag-mod_expires","tag-ottimizzazione","tag-symfony","tag-yslow"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.5 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Ottimizzare symfony su DreamHost - Fullo<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Ottimizzare symfony su DreamHost - Fullo\" \/>\n<meta property=\"og:description\" content=\"Qualche giorno fa, come esperimento personale, ho aggiornato (grazie all&#8217;aiuto di Federico per il layout), TwitOrNot. Di per s\u00e8 l&#8217;applicazione \u00e8 abbastanza banale, ma l&#8217;esercizio \u00e8 stato fatto per testare alcune idee che da qualche tempo mi giravano per il cervello. Innanzitutto, TwitOrNot migra dalla versione 1.1 alla 1.2.x di symfony, nel suo piccolo implementa [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/\" \/>\n<meta property=\"og:site_name\" content=\"Fullo\" \/>\n<meta property=\"article:published_time\" content=\"2009-08-04T10:08:21+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/www.fullo.net\/blog\/wp-content\/uploads\/2009\/08\/twitornot-symfony-on-dreamhost1.png\" \/>\n<meta name=\"author\" content=\"Francesco Fullone\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:creator\" content=\"@fullo\" \/>\n<meta name=\"twitter:site\" content=\"@fullo\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Francesco Fullone\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"4 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/2009\\\/08\\\/04\\\/ottimizzare-symfony-su-dreamhost\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/2009\\\/08\\\/04\\\/ottimizzare-symfony-su-dreamhost\\\/\"},\"author\":{\"name\":\"Francesco Fullone\",\"@id\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/#\\\/schema\\\/person\\\/24e91bc6caea6c411a8668df5639428c\"},\"headline\":\"Ottimizzare symfony su DreamHost\",\"datePublished\":\"2009-08-04T10:08:21+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/2009\\\/08\\\/04\\\/ottimizzare-symfony-su-dreamhost\\\/\"},\"wordCount\":887,\"commentCount\":1,\"publisher\":{\"@id\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/#\\\/schema\\\/person\\\/24e91bc6caea6c411a8668df5639428c\"},\"image\":{\"@id\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/2009\\\/08\\\/04\\\/ottimizzare-symfony-su-dreamhost\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/www.fullo.net\\\/blog\\\/wp-content\\\/uploads\\\/2009\\\/08\\\/twitornot-symfony-on-dreamhost1.png\",\"keywords\":[\"apache\",\"dreamhost\",\"ideato\",\"mod_deflate\",\"mod_expires\",\"ottimizzazione\",\"symfony\",\"yslow\"],\"articleSection\":[\"php\",\"webdev\"],\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"CommentAction\",\"name\":\"Comment\",\"target\":[\"https:\\\/\\\/www.fullo.net\\\/blog\\\/2009\\\/08\\\/04\\\/ottimizzare-symfony-su-dreamhost\\\/#respond\"]}]},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/2009\\\/08\\\/04\\\/ottimizzare-symfony-su-dreamhost\\\/\",\"url\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/2009\\\/08\\\/04\\\/ottimizzare-symfony-su-dreamhost\\\/\",\"name\":\"Ottimizzare symfony su DreamHost - Fullo\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/2009\\\/08\\\/04\\\/ottimizzare-symfony-su-dreamhost\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/2009\\\/08\\\/04\\\/ottimizzare-symfony-su-dreamhost\\\/#primaryimage\"},\"thumbnailUrl\":\"http:\\\/\\\/www.fullo.net\\\/blog\\\/wp-content\\\/uploads\\\/2009\\\/08\\\/twitornot-symfony-on-dreamhost1.png\",\"datePublished\":\"2009-08-04T10:08:21+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/2009\\\/08\\\/04\\\/ottimizzare-symfony-su-dreamhost\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/www.fullo.net\\\/blog\\\/2009\\\/08\\\/04\\\/ottimizzare-symfony-su-dreamhost\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/2009\\\/08\\\/04\\\/ottimizzare-symfony-su-dreamhost\\\/#primaryimage\",\"url\":\"http:\\\/\\\/www.fullo.net\\\/blog\\\/wp-content\\\/uploads\\\/2009\\\/08\\\/twitornot-symfony-on-dreamhost1.png\",\"contentUrl\":\"http:\\\/\\\/www.fullo.net\\\/blog\\\/wp-content\\\/uploads\\\/2009\\\/08\\\/twitornot-symfony-on-dreamhost1.png\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/2009\\\/08\\\/04\\\/ottimizzare-symfony-su-dreamhost\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Ottimizzare symfony su DreamHost\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/\",\"name\":\"Fullo\",\"description\":\"nulla e&#039; impossibile per chi non lo deve fare!\",\"publisher\":{\"@id\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/#\\\/schema\\\/person\\\/24e91bc6caea6c411a8668df5639428c\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/#\\\/schema\\\/person\\\/24e91bc6caea6c411a8668df5639428c\",\"name\":\"Francesco Fullone\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/i0.wp.com\\\/www.fullo.net\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/hawiaina-gold-circled-white.png?fit=622%2C622&ssl=1\",\"url\":\"https:\\\/\\\/i0.wp.com\\\/www.fullo.net\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/hawiaina-gold-circled-white.png?fit=622%2C622&ssl=1\",\"contentUrl\":\"https:\\\/\\\/i0.wp.com\\\/www.fullo.net\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/hawiaina-gold-circled-white.png?fit=622%2C622&ssl=1\",\"width\":622,\"height\":622,\"caption\":\"Francesco Fullone\"},\"logo\":{\"@id\":\"https:\\\/\\\/i0.wp.com\\\/www.fullo.net\\\/blog\\\/wp-content\\\/uploads\\\/2024\\\/10\\\/hawiaina-gold-circled-white.png?fit=622%2C622&ssl=1\"},\"sameAs\":[\"http:\\\/\\\/www.fullo.net\",\"https:\\\/\\\/www.linkedin.com\\\/in\\\/fullo\",\"https:\\\/\\\/x.com\\\/fullo\"],\"url\":\"https:\\\/\\\/www.fullo.net\\\/blog\\\/author\\\/fullo\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Ottimizzare symfony su DreamHost - Fullo","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/","og_locale":"en_US","og_type":"article","og_title":"Ottimizzare symfony su DreamHost - Fullo","og_description":"Qualche giorno fa, come esperimento personale, ho aggiornato (grazie all&#8217;aiuto di Federico per il layout), TwitOrNot. Di per s\u00e8 l&#8217;applicazione \u00e8 abbastanza banale, ma l&#8217;esercizio \u00e8 stato fatto per testare alcune idee che da qualche tempo mi giravano per il cervello. Innanzitutto, TwitOrNot migra dalla versione 1.1 alla 1.2.x di symfony, nel suo piccolo implementa [&hellip;]","og_url":"https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/","og_site_name":"Fullo","article_published_time":"2009-08-04T10:08:21+00:00","og_image":[{"url":"https:\/\/www.fullo.net\/blog\/wp-content\/uploads\/2009\/08\/twitornot-symfony-on-dreamhost1.png","type":"","width":"","height":""}],"author":"Francesco Fullone","twitter_card":"summary_large_image","twitter_creator":"@fullo","twitter_site":"@fullo","twitter_misc":{"Written by":"Francesco Fullone","Est. reading time":"4 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/#article","isPartOf":{"@id":"https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/"},"author":{"name":"Francesco Fullone","@id":"https:\/\/www.fullo.net\/blog\/#\/schema\/person\/24e91bc6caea6c411a8668df5639428c"},"headline":"Ottimizzare symfony su DreamHost","datePublished":"2009-08-04T10:08:21+00:00","mainEntityOfPage":{"@id":"https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/"},"wordCount":887,"commentCount":1,"publisher":{"@id":"https:\/\/www.fullo.net\/blog\/#\/schema\/person\/24e91bc6caea6c411a8668df5639428c"},"image":{"@id":"https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/#primaryimage"},"thumbnailUrl":"https:\/\/www.fullo.net\/blog\/wp-content\/uploads\/2009\/08\/twitornot-symfony-on-dreamhost1.png","keywords":["apache","dreamhost","ideato","mod_deflate","mod_expires","ottimizzazione","symfony","yslow"],"articleSection":["php","webdev"],"inLanguage":"en-US","potentialAction":[{"@type":"CommentAction","name":"Comment","target":["https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/#respond"]}]},{"@type":"WebPage","@id":"https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/","url":"https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/","name":"Ottimizzare symfony su DreamHost - Fullo","isPartOf":{"@id":"https:\/\/www.fullo.net\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/#primaryimage"},"image":{"@id":"https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/#primaryimage"},"thumbnailUrl":"https:\/\/www.fullo.net\/blog\/wp-content\/uploads\/2009\/08\/twitornot-symfony-on-dreamhost1.png","datePublished":"2009-08-04T10:08:21+00:00","breadcrumb":{"@id":"https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/#primaryimage","url":"https:\/\/www.fullo.net\/blog\/wp-content\/uploads\/2009\/08\/twitornot-symfony-on-dreamhost1.png","contentUrl":"https:\/\/www.fullo.net\/blog\/wp-content\/uploads\/2009\/08\/twitornot-symfony-on-dreamhost1.png"},{"@type":"BreadcrumbList","@id":"https:\/\/www.fullo.net\/blog\/2009\/08\/04\/ottimizzare-symfony-su-dreamhost\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/www.fullo.net\/blog\/"},{"@type":"ListItem","position":2,"name":"Ottimizzare symfony su DreamHost"}]},{"@type":"WebSite","@id":"https:\/\/www.fullo.net\/blog\/#website","url":"https:\/\/www.fullo.net\/blog\/","name":"Fullo","description":"nulla e&#039; impossibile per chi non lo deve fare!","publisher":{"@id":"https:\/\/www.fullo.net\/blog\/#\/schema\/person\/24e91bc6caea6c411a8668df5639428c"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/www.fullo.net\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/www.fullo.net\/blog\/#\/schema\/person\/24e91bc6caea6c411a8668df5639428c","name":"Francesco Fullone","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/i0.wp.com\/www.fullo.net\/blog\/wp-content\/uploads\/2024\/10\/hawiaina-gold-circled-white.png?fit=622%2C622&ssl=1","url":"https:\/\/i0.wp.com\/www.fullo.net\/blog\/wp-content\/uploads\/2024\/10\/hawiaina-gold-circled-white.png?fit=622%2C622&ssl=1","contentUrl":"https:\/\/i0.wp.com\/www.fullo.net\/blog\/wp-content\/uploads\/2024\/10\/hawiaina-gold-circled-white.png?fit=622%2C622&ssl=1","width":622,"height":622,"caption":"Francesco Fullone"},"logo":{"@id":"https:\/\/i0.wp.com\/www.fullo.net\/blog\/wp-content\/uploads\/2024\/10\/hawiaina-gold-circled-white.png?fit=622%2C622&ssl=1"},"sameAs":["http:\/\/www.fullo.net","https:\/\/www.linkedin.com\/in\/fullo","https:\/\/x.com\/fullo"],"url":"https:\/\/www.fullo.net\/blog\/author\/fullo\/"}]}},"jetpack_publicize_connections":[],"jetpack_featured_media_url":"","jetpack_sharing_enabled":true,"jetpack_shortlink":"https:\/\/wp.me\/p3OSc1-GA","jetpack_likes_enabled":true,"jetpack-related-posts":[{"id":1905,"url":"https:\/\/www.fullo.net\/blog\/2006\/03\/16\/pim-gestire-le-fatture-con-symfony\/","url_meta":{"origin":2640,"position":0},"title":"P.I.M. gestire le fatture con symfony","author":"Francesco Fullone","date":"16\/03\/2006","format":false,"excerpt":"Ciccio ha finalmente rilasciato la prima versione di P.I.M. un softwarillo scritto in php usando il framework Symfony (di cui ho gi\u00e0 parlato in diverse occasioni) per la gestione delle fatture. Il progetto \u00e8 nato perch\u00e8 il soggetto in questione (diventato da poco libero professionista e mio esperto eZ publish\u2026","rel":"","context":"In &quot;open source&quot;","block_context":{"text":"open source","link":"https:\/\/www.fullo.net\/blog\/category\/tecnologia\/open-source\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2226,"url":"https:\/\/www.fullo.net\/blog\/2007\/03\/01\/symfony-10-ed-ajax\/","url_meta":{"origin":2640,"position":1},"title":"Symfony 1.0 ed Ajax","author":"Francesco Fullone","date":"01\/03\/2007","format":false,"excerpt":"E' finalmente stata rilasciata la prima versione stabile di Symfony 1.0. Noto application framework per PHP 5 di cui ho gi\u00e0 discusso pi\u00f9 volte e che ho iniziato ad usare attivamente nell'ultimo mese e mezzo grazie ad un lavoro con Ciccio (mio guru sull'argomento). Tra le magie di questa versione,\u2026","rel":"","context":"In &quot;ajax&quot;","block_context":{"text":"ajax","link":"https:\/\/www.fullo.net\/blog\/category\/tecnologia\/ajax\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":2456,"url":"https:\/\/www.fullo.net\/blog\/2008\/07\/30\/twitter-su-symfony-11\/","url_meta":{"origin":2640,"position":2},"title":"Twitter su Symfony 1.1","author":"Francesco Fullone","date":"30\/07\/2008","format":false,"excerpt":"Ho appena rilasciato la prima versione del plugin per Symfony 1.1 che permette di utilizzare tutte le api di Twitter, comprese le nuove relative al motore di ricerca. Il plugin, chiamato con tanta fantasia idTwitterClientPlugin, permette quindi di modificare il proprio status, scaricare nei formati disponibili le varie timeline messe\u2026","rel":"","context":"In &quot;php&quot;","block_context":{"text":"php","link":"https:\/\/www.fullo.net\/blog\/category\/tecnologia\/php\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":3232,"url":"https:\/\/www.fullo.net\/blog\/2015\/12\/15\/10-anni-di-symfony\/","url_meta":{"origin":2640,"position":3},"title":"10 anni di symfony","author":"Francesco Fullone","date":"15\/12\/2015","format":"video","excerpt":"Qualche giorno fa hanno festeggiato 10 anni di Symfony. Anche se non fisicamente a Parigi posso dire che ero (in qualche modo)\u00a0presente ai festeggiamenti... https:\/\/www.youtube.com\/watch?v=sjH-kV1Jb3I&feature=youtu.be&t=39s (soprattutto intorno al secondo 39) \u00a0","rel":"","context":"In &quot;lifehack&quot;","block_context":{"text":"lifehack","link":"https:\/\/www.fullo.net\/blog\/category\/di-tutto-un-po\/lifehack\/"},"img":{"alt_text":"","src":"https:\/\/i0.wp.com\/img.youtube.com\/vi\/sjH-kV1Jb3I\/0.jpg?resize=350%2C200","width":350,"height":200},"classes":[]},{"id":2568,"url":"https:\/\/www.fullo.net\/blog\/2009\/01\/22\/twit-or-not-ovvero-scrivere-applicazioni-durante-un-barcamp\/","url_meta":{"origin":2640,"position":4},"title":"Twit Or Not, ovvero scrivere applicazioni durante un barcamp","author":"Francesco Fullone","date":"22\/01\/2009","format":false,"excerpt":"Sabato scorso ho partecipato all'AgileCamp organizzato dai ragazzi di Sketchin. L'evento \u00e8 stato molto piacevole e mi ha permesso, oltre che a sentire talk molto interessanti, di rivedere un po' di quei contatti con cui si dice sempre \"un giorno faremo qualcosa insieme\". Con Massimiliano c'\u00e8 gi\u00e0 qualcosa in ballo\u2026","rel":"","context":"In &quot;php&quot;","block_context":{"text":"php","link":"https:\/\/www.fullo.net\/blog\/category\/tecnologia\/php\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]},{"id":1808,"url":"https:\/\/www.fullo.net\/blog\/2005\/12\/09\/symfony-lessons\/","url_meta":{"origin":2640,"position":5},"title":"Symfony lessons","author":"Francesco Fullone","date":"09\/12\/2005","format":false,"excerpt":"Il framework symfony per php 5.x ha adesso anche un tutorial del tipo \"qualcosa in n giorni\". Il primo ciclo di lezioni, che dura 8 giorni, \u00e8 gi\u00e0 online e copre lo startup dell'applicazione, la spiegazione del modello MVC e l'uso delle form. ciuaz","rel":"","context":"In &quot;ajax&quot;","block_context":{"text":"ajax","link":"https:\/\/www.fullo.net\/blog\/category\/tecnologia\/ajax\/"},"img":{"alt_text":"","src":"","width":0,"height":0},"classes":[]}],"_links":{"self":[{"href":"https:\/\/www.fullo.net\/blog\/wp-json\/wp\/v2\/posts\/2640","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/www.fullo.net\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.fullo.net\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.fullo.net\/blog\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/www.fullo.net\/blog\/wp-json\/wp\/v2\/comments?post=2640"}],"version-history":[{"count":7,"href":"https:\/\/www.fullo.net\/blog\/wp-json\/wp\/v2\/posts\/2640\/revisions"}],"predecessor-version":[{"id":2649,"href":"https:\/\/www.fullo.net\/blog\/wp-json\/wp\/v2\/posts\/2640\/revisions\/2649"}],"wp:attachment":[{"href":"https:\/\/www.fullo.net\/blog\/wp-json\/wp\/v2\/media?parent=2640"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.fullo.net\/blog\/wp-json\/wp\/v2\/categories?post=2640"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.fullo.net\/blog\/wp-json\/wp\/v2\/tags?post=2640"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}