<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-8381632820921572011</id><updated>2011-08-01T11:49:22.780-07:00</updated><category term='apache'/><category term='debug'/><category term='installation'/><category term='mysql'/><category term='cache'/><category term='php'/><category term='header'/><category term='optimizing'/><category term='meta-refresh'/><category term='UI'/><category term='101'/><category term='myprofi'/><category term='error reporting'/><category term='Web design'/><category term='time'/><category term='worst practices'/><category term='smarty'/><category term='layers'/><category term='content-type'/><category term='errors'/><category term='optimization'/><category term='memcached'/><category term='mimetypes'/><category term='htaccess'/><category term='Data Logic Presentation'/><category term='redirect'/><title type='text'>CleanPhp</title><subtitle type='html'>Writing web applications in PHP can be very nice. But the learning curve to write the CLEAN can take some time. Perhaps you will find some good advice here.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://cleanphp.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://cleanphp.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Lavi</name><uri>http://www.blogger.com/profile/01759600610476602866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>15</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8381632820921572011.post-4483312223374322999</id><published>2011-07-12T03:53:00.000-07:00</published><updated>2011-07-12T03:57:51.182-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='optimizing'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='memcached'/><category scheme='http://www.blogger.com/atom/ns#' term='cache'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>MemCache</title><content type='html'>While thinking about optimizing a heavy-load site, I was referred to a tool name "&lt;a href="http://memcached.org/"&gt;MemCached&lt;/a&gt;".&lt;div&gt;Its purpose is to store variables/arrays etc in a hash-table for a set amount of time.&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Some links about it:&lt;/div&gt;&lt;div&gt;&lt;a href="http://wiki.slicehost.com/doku.php?id=use_memcached_in_php"&gt;http://wiki.slicehost.com/doku.php?id=use_memcached_in_php&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.i-marco.nl/weblog/archive/2005/05/06/blazing_speed_with_phps_memcac"&gt;http://www.i-marco.nl/weblog/archive/2005/05/06/blazing_speed_with_phps_memcac&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://il2.php.net/memcache"&gt;http://il2.php.net/memcache&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.majordojo.com/2007/03/memcached-howto.php"&gt;http://www.majordojo.com/2007/03/memcached-howto.php&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://www.dellanave.com/blog/2007/01/31/if-youre-not-using-memcached-youre-doing-it-wrong/"&gt;http://www.dellanave.com/blog/2007/01/31/if-youre-not-using-memcached-youre-doing-it-wrong/&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;a href="http://stackoverflow.com/questions/1442411/using-memcache-vs-memcached-with-php"&gt;http://stackoverflow.com/questions/1442411/using-memcache-vs-memcached-with-php&lt;/a&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;I'm having it setup and will test its performance.&lt;/div&gt;&lt;div&gt;Stay tuned.&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8381632820921572011-4483312223374322999?l=cleanphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cleanphp.blogspot.com/feeds/4483312223374322999/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cleanphp.blogspot.com/2011/07/memcache.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/4483312223374322999'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/4483312223374322999'/><link rel='alternate' type='text/html' href='http://cleanphp.blogspot.com/2011/07/memcache.html' title='MemCache'/><author><name>Lavi</name><uri>http://www.blogger.com/profile/01759600610476602866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8381632820921572011.post-1516192558406136951</id><published>2009-07-06T04:04:00.000-07:00</published><updated>2009-07-06T04:18:24.474-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='optimizing'/><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><category scheme='http://www.blogger.com/atom/ns#' term='myprofi'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Analysing MySQL logs</title><content type='html'>From time to time you may get shouts from your server administrator about the load your queries put on your shared hosting account.&lt;br /&gt;Several people I know have been "kicked out" without notice from shared hosting. Not a very nice feeling.&lt;br /&gt;But then you move to a dedicated server, and suddenly you feel like kicking yourself out, since your server starts complaining and stops serving the users...&lt;br /&gt;&lt;br /&gt;Time to go over your queries, add indexes and make other necessary changes to lower (or spread) the load.&lt;br /&gt;&lt;br /&gt;But WHERE DO WE START? There are a billion different query types in our application. How do we know which one is the current bottle-neck?&lt;br /&gt;&lt;br /&gt;MySQL logs to the rescue.&lt;br /&gt;&lt;br /&gt;There are two main MySQL logs you should use:&lt;br /&gt;1. mysqld.log - a log of ALL the queries&lt;br /&gt;2. mysqld-slow.log - a log of queries that took more then x seconds to run.&lt;br /&gt;&lt;br /&gt;These logs tend to fill up really quickly..&lt;br /&gt;&lt;br /&gt;Your hava-amina (first thought) might be to look in the slow-queries log. But in it you will find many queries that ran slowly because the server was already loaded. a problem...&lt;br /&gt;&lt;br /&gt;To the RESCUE: &lt;strong&gt;MyProfi. &lt;/strong&gt;A MySQL log analyser.&lt;br /&gt;&lt;code&gt;&lt;br /&gt;MyProfi is a command line tool that parses mysql query log and outputs statistics of most frequently used queries, sorting them by number of times they appear in a log file. The similar queries are groupped together. Thus, select id from user where login="admin" and select id from user where login='root' become select id from user where login={} - the variable parts of queries are replaced with {} markers, this make statistics analysis as easy as revewing the top of most frequently occured queries' patterns.&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;You can get MyProfi at: &lt;a href="http://myprofi.sourceforge.net/"&gt;http://myprofi.sourceforge.net/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Example of its output:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Queries by type:&lt;br /&gt;================&lt;br /&gt;select 346 887 [84.11%]&lt;br /&gt;set 29 643 [ 7.19%]&lt;br /&gt;insert 23 748 [ 5.76%]&lt;br /&gt;update 11 916 [ 2.89%]&lt;br /&gt;execute 155 [ 0.04%]&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Queries by pattern:&lt;br /&gt;===================&lt;br /&gt;1. 118 471 [28.73%] - select*from visitedurl where siteid={}and pagetypeid={}&lt;br /&gt;2. 27 713 [ 6.72%] - set names utf8&lt;br /&gt;3. 20 476 [ 4.97%] - select mimage,timage from images where id={}limit{}&lt;br /&gt;4. 20 475 [ 4.96%] - select*from users where id={}&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;See the 28.73%? This can tell you exactly where to look and what to change. Notice that these are not actual queries, but QUERY-TYPES instead. the {} in id={} replaces various different ids that were entered.&lt;br /&gt;Also notice the SET NAMES UTF8 query. This can be set in my.ini and never again be needed. (Lowering 6.72% of your query load)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8381632820921572011-1516192558406136951?l=cleanphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cleanphp.blogspot.com/feeds/1516192558406136951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cleanphp.blogspot.com/2009/07/analysing-mysql-logs.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/1516192558406136951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/1516192558406136951'/><link rel='alternate' type='text/html' href='http://cleanphp.blogspot.com/2009/07/analysing-mysql-logs.html' title='Analysing MySQL logs'/><author><name>Lavi</name><uri>http://www.blogger.com/profile/01759600610476602866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8381632820921572011.post-1876696093978687062</id><published>2009-06-30T02:14:00.000-07:00</published><updated>2009-06-30T02:19:24.746-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='worst practices'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><title type='text'>Coding - worst practices</title><content type='html'>&lt;div&gt;How NOT to code:&lt;br /&gt;&lt;br /&gt;1. Don't mix Logic,Data and Presentation in the same file.&lt;br /&gt;Example: &lt;a href="http://4.bp.blogspot.com/_cMM0-UZPV34/SknYYNysxKI/AAAAAAAAAsE/OboiwsH5-tg/s1600-h/worst1.jpg"&gt;&lt;img id="BLOGGER_PHOTO_ID_5353047542637315234" style="FLOAT: left; MARGIN: 0px 10px 10px 0px; WIDTH: 320px; CURSOR: hand; HEIGHT: 221px" alt="" src="http://4.bp.blogspot.com/_cMM0-UZPV34/SknYYNysxKI/AAAAAAAAAsE/OboiwsH5-tg/s320/worst1.jpg" border="0" /&gt;&lt;/a&gt;&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div&gt;Notice the DB connection, the PHP codes, and the HTML all tangled...&lt;/div&gt;&lt;div&gt; &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8381632820921572011-1876696093978687062?l=cleanphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cleanphp.blogspot.com/feeds/1876696093978687062/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cleanphp.blogspot.com/2009/06/coding-worst-practices.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/1876696093978687062'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/1876696093978687062'/><link rel='alternate' type='text/html' href='http://cleanphp.blogspot.com/2009/06/coding-worst-practices.html' title='Coding - worst practices'/><author><name>Lavi</name><uri>http://www.blogger.com/profile/01759600610476602866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_cMM0-UZPV34/SknYYNysxKI/AAAAAAAAAsE/OboiwsH5-tg/s72-c/worst1.jpg' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8381632820921572011.post-5516182447823580376</id><published>2009-06-26T05:52:00.000-07:00</published><updated>2009-06-26T05:58:35.835-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='debug'/><category scheme='http://www.blogger.com/atom/ns#' term='error reporting'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='errors'/><title type='text'>Turn ON error reporting for DEBUGing</title><content type='html'>PHP usually hides many of the compiler warnings and errors.&lt;br /&gt;Use the following to display errors while debuging your application:&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;error_reporting(E_ALL);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;OR:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;ini_set('error_reporting', E_ALL);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;More advanced users may want to display only some of the errors.&lt;br /&gt;Such as:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;error_reporting(E_ALL ^ E_NOTICE);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;To avoid showing notices for uninitiallized variables.&lt;br /&gt;&lt;br /&gt;Some more options to experiment with:&lt;br /&gt;E_ERROR  &lt;br /&gt;E_WARNING  &lt;br /&gt;E_PARSE  &lt;br /&gt;E_NOTICE  &lt;br /&gt;E_CORE_ERROR  &lt;br /&gt;E_CORE_WARNING  &lt;br /&gt;E_COMPILE_ERROR  &lt;br /&gt;E_COMPILE_WARNING  &lt;br /&gt;E_USER_ERROR  &lt;br /&gt;E_USER_WARNING  &lt;br /&gt;E_USER_NOTICE  &lt;br /&gt;E_ALL  &lt;br /&gt;E_STRICT  &lt;br /&gt;E_RECOVERABLE_ERROR  &lt;br /&gt;E_DEPRECATED  &lt;br /&gt;E_USER_DEPRECATED&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8381632820921572011-5516182447823580376?l=cleanphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cleanphp.blogspot.com/feeds/5516182447823580376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cleanphp.blogspot.com/2009/06/turn-on-error-reporting-for-debuging.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/5516182447823580376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/5516182447823580376'/><link rel='alternate' type='text/html' href='http://cleanphp.blogspot.com/2009/06/turn-on-error-reporting-for-debuging.html' title='Turn ON error reporting for DEBUGing'/><author><name>Lavi</name><uri>http://www.blogger.com/profile/01759600610476602866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8381632820921572011.post-3813312241492182993</id><published>2009-06-26T05:42:00.000-07:00</published><updated>2009-06-26T05:51:09.460-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='content-type'/><category scheme='http://www.blogger.com/atom/ns#' term='mimetypes'/><category scheme='http://www.blogger.com/atom/ns#' term='header'/><title type='text'>Content-Types</title><content type='html'>When serving a document dynamically, you may need to tell the browser what kind of file it is.&lt;br /&gt;In PHP (For JPG):&lt;br /&gt;&lt;code&gt;&lt;br /&gt;header("Content-type: image/jpeg;");&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;These are called mime-types.&lt;br /&gt;&lt;br /&gt;A list of possible types:&lt;br /&gt;Type Extension&lt;br /&gt;application/envoy evy&lt;br /&gt;application/fractals fif&lt;br /&gt;application/futuresplash spl&lt;br /&gt;application/hta hta&lt;br /&gt;application/internet-property-stream acx&lt;br /&gt;application/mac-binhex40 hqx&lt;br /&gt;application/msword doc&lt;br /&gt;application/msword dot&lt;br /&gt;application/octet-stream *&lt;br /&gt;application/octet-stream bin&lt;br /&gt;application/octet-stream class&lt;br /&gt;application/octet-stream dms&lt;br /&gt;application/octet-stream exe&lt;br /&gt;application/octet-stream lha&lt;br /&gt;application/octet-stream lzh&lt;br /&gt;application/oda oda&lt;br /&gt;application/olescript axs&lt;br /&gt;application/pdf pdf&lt;br /&gt;application/pics-rules prf&lt;br /&gt;application/pkcs10 p10&lt;br /&gt;application/pkix-crl crl&lt;br /&gt;application/postscript ai&lt;br /&gt;application/postscript eps&lt;br /&gt;application/postscript ps&lt;br /&gt;application/rtf rtf&lt;br /&gt;application/set-payment-initiation setpay&lt;br /&gt;application/set-registration-initiation setreg&lt;br /&gt;application/vnd.ms-excel xla&lt;br /&gt;application/vnd.ms-excel xlc&lt;br /&gt;application/vnd.ms-excel xlm&lt;br /&gt;application/vnd.ms-excel xls&lt;br /&gt;application/vnd.ms-excel xlt&lt;br /&gt;application/vnd.ms-excel xlw&lt;br /&gt;application/vnd.ms-outlook msg&lt;br /&gt;application/vnd.ms-pkicertstore sst&lt;br /&gt;application/vnd.ms-pkiseccat cat&lt;br /&gt;application/vnd.ms-pkistl stl&lt;br /&gt;application/vnd.ms-powerpoint pot&lt;br /&gt;application/vnd.ms-powerpoint pps&lt;br /&gt;application/vnd.ms-powerpoint ppt&lt;br /&gt;application/vnd.ms-project mpp&lt;br /&gt;application/vnd.ms-works wcm&lt;br /&gt;application/vnd.ms-works wdb&lt;br /&gt;application/vnd.ms-works wks&lt;br /&gt;application/vnd.ms-works wps&lt;br /&gt;application/winhlp hlp&lt;br /&gt;application/x-bcpio bcpio&lt;br /&gt;application/x-cdf cdf&lt;br /&gt;application/x-compress z&lt;br /&gt;application/x-compressed tgz&lt;br /&gt;application/x-cpio cpio&lt;br /&gt;application/x-csh csh&lt;br /&gt;application/x-director dcr&lt;br /&gt;application/x-director dir&lt;br /&gt;application/x-director dxr&lt;br /&gt;application/x-dvi dvi&lt;br /&gt;application/x-gtar gtar&lt;br /&gt;application/x-gzip gz&lt;br /&gt;application/x-hdf hdf&lt;br /&gt;application/x-internet-signup ins&lt;br /&gt;application/x-internet-signup isp&lt;br /&gt;application/x-iphone iii&lt;br /&gt;application/x-javascript js&lt;br /&gt;application/x-latex latex&lt;br /&gt;application/x-msaccess mdb&lt;br /&gt;application/x-mscardfile crd&lt;br /&gt;application/x-msclip clp&lt;br /&gt;application/x-msdownload dll&lt;br /&gt;application/x-msmediaview m13&lt;br /&gt;application/x-msmediaview m14&lt;br /&gt;application/x-msmediaview mvb&lt;br /&gt;application/x-msmetafile wmf&lt;br /&gt;application/x-msmoney mny&lt;br /&gt;application/x-mspublisher pub&lt;br /&gt;application/x-msschedule scd&lt;br /&gt;application/x-msterminal trm&lt;br /&gt;application/x-mswrite wri&lt;br /&gt;application/x-netcdf cdf&lt;br /&gt;application/x-netcdf nc&lt;br /&gt;application/x-perfmon pma&lt;br /&gt;application/x-perfmon pmc&lt;br /&gt;application/x-perfmon pml&lt;br /&gt;application/x-perfmon pmr&lt;br /&gt;application/x-perfmon pmw&lt;br /&gt;application/x-pkcs12 p12&lt;br /&gt;application/x-pkcs12 pfx&lt;br /&gt;application/x-pkcs7-certificates p7b&lt;br /&gt;application/x-pkcs7-certificates spc&lt;br /&gt;application/x-pkcs7-certreqresp p7r&lt;br /&gt;application/x-pkcs7-mime p7c&lt;br /&gt;application/x-pkcs7-mime p7m&lt;br /&gt;application/x-pkcs7-signature p7s&lt;br /&gt;application/x-sh sh&lt;br /&gt;application/x-shar shar&lt;br /&gt;application/x-shockwave-flash swf&lt;br /&gt;application/x-stuffit sit&lt;br /&gt;application/x-sv4cpio sv4cpio&lt;br /&gt;application/x-sv4crc sv4crc&lt;br /&gt;application/x-tar tar&lt;br /&gt;application/x-tcl tcl&lt;br /&gt;application/x-tex tex&lt;br /&gt;application/x-texinfo texi&lt;br /&gt;application/x-texinfo texinfo&lt;br /&gt;application/x-troff roff&lt;br /&gt;application/x-troff t&lt;br /&gt;application/x-troff tr&lt;br /&gt;application/x-troff-man man&lt;br /&gt;application/x-troff-me me&lt;br /&gt;application/x-troff-ms ms&lt;br /&gt;application/x-ustar ustar&lt;br /&gt;application/x-wais-source src&lt;br /&gt;application/x-x509-ca-cert cer&lt;br /&gt;application/x-x509-ca-cert crt&lt;br /&gt;application/x-x509-ca-cert der&lt;br /&gt;application/ynd.ms-pkipko pko&lt;br /&gt;application/zip zip&lt;br /&gt;audio/basic au&lt;br /&gt;audio/basic snd&lt;br /&gt;audio/mid mid&lt;br /&gt;audio/mid rmi&lt;br /&gt;audio/mpeg mp3&lt;br /&gt;audio/x-aiff aif&lt;br /&gt;audio/x-aiff aifc&lt;br /&gt;audio/x-aiff aiff&lt;br /&gt;audio/x-mpegurl m3u&lt;br /&gt;audio/x-pn-realaudio ra&lt;br /&gt;audio/x-pn-realaudio ram&lt;br /&gt;audio/x-wav wav&lt;br /&gt;image/bmp bmp&lt;br /&gt;image/cis-cod cod&lt;br /&gt;image/gif gif&lt;br /&gt;image/ief ief&lt;br /&gt;image/jpeg jpe&lt;br /&gt;image/jpeg jpeg&lt;br /&gt;image/jpeg jpg&lt;br /&gt;image/pipeg jfif&lt;br /&gt;image/svg+xml svg&lt;br /&gt;image/tiff tif&lt;br /&gt;image/tiff tiff&lt;br /&gt;image/x-cmu-raster ras&lt;br /&gt;image/x-cmx cmx&lt;br /&gt;image/x-icon ico&lt;br /&gt;image/x-portable-anymap pnm&lt;br /&gt;image/x-portable-bitmap pbm&lt;br /&gt;image/x-portable-graymap pgm&lt;br /&gt;image/x-portable-pixmap ppm&lt;br /&gt;image/x-rgb rgb&lt;br /&gt;image/x-xbitmap xbm&lt;br /&gt;image/x-xpixmap xpm&lt;br /&gt;image/x-xwindowdump xwd&lt;br /&gt;message/rfc822 mht&lt;br /&gt;message/rfc822 mhtml&lt;br /&gt;message/rfc822 nws&lt;br /&gt;text/css css&lt;br /&gt;text/h323 323&lt;br /&gt;text/html htm&lt;br /&gt;text/html html&lt;br /&gt;text/html stm&lt;br /&gt;text/iuls uls&lt;br /&gt;text/plain bas&lt;br /&gt;text/plain c&lt;br /&gt;text/plain h&lt;br /&gt;text/plain txt&lt;br /&gt;text/richtext rtx&lt;br /&gt;text/scriptlet sct&lt;br /&gt;text/tab-separated-values tsv&lt;br /&gt;text/webviewhtml htt&lt;br /&gt;text/x-component htc&lt;br /&gt;text/x-setext etx&lt;br /&gt;text/x-vcard vcf&lt;br /&gt;video/mpeg mp2&lt;br /&gt;video/mpeg mpa&lt;br /&gt;video/mpeg mpe&lt;br /&gt;video/mpeg mpeg&lt;br /&gt;video/mpeg mpg&lt;br /&gt;video/mpeg mpv2&lt;br /&gt;video/quicktime mov&lt;br /&gt;video/quicktime qt&lt;br /&gt;video/x-la-asf lsf&lt;br /&gt;video/x-la-asf lsx&lt;br /&gt;video/x-ms-asf asf&lt;br /&gt;video/x-ms-asf asr&lt;br /&gt;video/x-ms-asf asx&lt;br /&gt;video/x-msvideo avi&lt;br /&gt;video/x-sgi-movie movie&lt;br /&gt;x-world/x-vrml flr&lt;br /&gt;x-world/x-vrml vrml&lt;br /&gt;x-world/x-vrml wrl&lt;br /&gt;x-world/x-vrml wrz&lt;br /&gt;x-world/x-vrml xaf&lt;br /&gt;x-world/x-vrml xof&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8381632820921572011-3813312241492182993?l=cleanphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cleanphp.blogspot.com/feeds/3813312241492182993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cleanphp.blogspot.com/2009/06/content-types.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/3813312241492182993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/3813312241492182993'/><link rel='alternate' type='text/html' href='http://cleanphp.blogspot.com/2009/06/content-types.html' title='Content-Types'/><author><name>Lavi</name><uri>http://www.blogger.com/profile/01759600610476602866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8381632820921572011.post-7792607766169900070</id><published>2009-06-26T03:07:00.000-07:00</published><updated>2009-06-26T03:11:50.286-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='htaccess'/><title type='text'>Enable/Disable display of list of files in directory</title><content type='html'>When going to &lt;a href="http://yoursite.com/afolder/"&gt;http://yoursite.com/afolder/&lt;/a&gt; you may or may not wish the user to see the list of files.&lt;br /&gt;&lt;br /&gt;Heres how to do it via the .htaccess file:&lt;br /&gt;&lt;br /&gt;To enable directory listing:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Options +Indexes&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;To disable directory listing:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;Options +Indexes&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr&gt;&lt;br /&gt;You can specify how to show the files.&lt;br /&gt;To display icons, file sizes, etc, FANCY style:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;IndexOptions +FancyIndexing &lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;You can also hide certain files:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;IndexIgnore *.gif *.jpg *.php &lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8381632820921572011-7792607766169900070?l=cleanphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cleanphp.blogspot.com/feeds/7792607766169900070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cleanphp.blogspot.com/2009/06/enabledisable-display-of-list-of-files.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/7792607766169900070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/7792607766169900070'/><link rel='alternate' type='text/html' href='http://cleanphp.blogspot.com/2009/06/enabledisable-display-of-list-of-files.html' title='Enable/Disable display of list of files in directory'/><author><name>Lavi</name><uri>http://www.blogger.com/profile/01759600610476602866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8381632820921572011.post-2972235436608063668</id><published>2009-06-22T12:33:00.001-07:00</published><updated>2009-06-22T13:03:56.831-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='meta-refresh'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='redirect'/><category scheme='http://www.blogger.com/atom/ns#' term='htaccess'/><title type='text'>Moving a site to a different domain</title><content type='html'>Sometimes you need to move a site from one domain to another.&lt;br /&gt;Happens mostly when beta testing on a temporary subdomain, and one day, you wanna move, but what will happen to all the incoming links?&lt;br /&gt;There is one method for a TEMPORARY domain change [302] (for maintenance or something similar) , and there is one for a PERMANENT domain change [301].&lt;br /&gt;&lt;br /&gt;Two good methods, via .htaccess via PHP or via HTML:&lt;br /&gt;&lt;br /&gt;The htaccess redirection method:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;redirect&lt;/span&gt; 301 / &lt;a href="http://newdomain.com/"&gt;http://&lt;span style="color:#cc0000;"&gt;newDomain&lt;/span&gt;.com&lt;/a&gt; &lt;/code&gt;&lt;br /&gt;&lt;br /&gt;For a PERMANENT redirect, or&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;redirect&lt;/span&gt; 302 / &lt;a href="http://newdomain.com/"&gt;http://&lt;span style="color:#cc0000;"&gt;newDomain&lt;/span&gt;.com&lt;/a&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;For a TEMPORARY redirect.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;The PHP redirection methods:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;header&lt;/span&gt;('HTTP/1.1 301 Moved Permanently', true);&lt;br /&gt;&lt;span style="color:#000099;"&gt;header&lt;/span&gt;('Location: &lt;a href="http://newdomain.com/"&gt;http://&lt;span style="color:#cc0000;"&gt;newDomain&lt;/span&gt;.com/'&lt;/a&gt;);&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;For a PERMANENT redirect, or&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&lt;span style="color:#000099;"&gt;header&lt;/span&gt;('Location: http://&lt;span style="color:#cc0000;"&gt;newDomain&lt;/span&gt;.com/');&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;For a TEMPORARY redirect.&lt;br /&gt;&lt;br /&gt;&lt;hr /&gt;&lt;br /&gt;The HTML redirection method:&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;meta http-equiv=refresh content="&lt;span style="color:#000099;"&gt;0&lt;/span&gt;; url=http://&lt;span style="color:#cc0000;"&gt;newDomain&lt;/span&gt;.com" /&gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;NOTE: The 0 (Zero) can be changed to a number of seconds you'd like the browser to wait before redirecting. Usually used to display a "We have moved" notice.&lt;br /&gt;NOTE2: When using 0 (zero) as the timeout param, Google/Yahoo will treat it as a 301 PERMANENT move, while when using a higher timeout duration they will treat it as a 301 TEMPORARY move.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8381632820921572011-2972235436608063668?l=cleanphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cleanphp.blogspot.com/feeds/2972235436608063668/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cleanphp.blogspot.com/2009/06/moving-site-to-different-domain.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/2972235436608063668'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/2972235436608063668'/><link rel='alternate' type='text/html' href='http://cleanphp.blogspot.com/2009/06/moving-site-to-different-domain.html' title='Moving a site to a different domain'/><author><name>Lavi</name><uri>http://www.blogger.com/profile/01759600610476602866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8381632820921572011.post-1832955022245649735</id><published>2009-06-21T04:23:00.000-07:00</published><updated>2009-06-21T05:15:18.995-07:00</updated><title type='text'>Flash is hiding your menu?</title><content type='html'>Sometimes a flash SWF object will always stay ABOVE any other content.&lt;br /&gt;So your nice folding menu will be inoperable.&lt;br /&gt;&lt;br /&gt;Solution:&lt;br /&gt;Add to the flash:&lt;br /&gt;&lt;pre style="BORDER-RIGHT: rgb(153,153,153) 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: rgb(153,153,153) 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: rgb(153,153,153) 1px dashed; WIDTH: 100%; COLOR: rgb(0,0,0); LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: rgb(153,153,153) 1px dashed; FONT-FAMILY: Andale Mono,Lucida Console,Monaco,fixed,monospace; BACKGROUND-COLOR: rgb(238,238,238)"&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;param value="transparent" name="wmode" &amp;gt;&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And in the EMBED tag:&lt;br /&gt;&lt;pre style="BORDER-RIGHT: rgb(153,153,153) 1px dashed; PADDING-RIGHT: 5px; BORDER-TOP: rgb(153,153,153) 1px dashed; PADDING-LEFT: 5px; FONT-SIZE: 12px; PADDING-BOTTOM: 5px; OVERFLOW: auto; BORDER-LEFT: rgb(153,153,153) 1px dashed; WIDTH: 100%; COLOR: rgb(0,0,0); LINE-HEIGHT: 14px; PADDING-TOP: 5px; BORDER-BOTTOM: rgb(153,153,153) 1px dashed; FONT-FAMILY: Andale Mono,Lucida Console,Monaco,fixed,monospace; BACKGROUND-COLOR: rgb(238,238,238)"&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;wmode=transparent&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Solution by &lt;a href="http://intercity.co.il/"&gt;Lior&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8381632820921572011-1832955022245649735?l=cleanphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cleanphp.blogspot.com/feeds/1832955022245649735/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cleanphp.blogspot.com/2009/06/flash-is-hiding-your-menu.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/1832955022245649735'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/1832955022245649735'/><link rel='alternate' type='text/html' href='http://cleanphp.blogspot.com/2009/06/flash-is-hiding-your-menu.html' title='Flash is hiding your menu?'/><author><name>Lavi</name><uri>http://www.blogger.com/profile/01759600610476602866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8381632820921572011.post-8738958382497005512</id><published>2009-06-15T12:26:00.000-07:00</published><updated>2009-06-15T12:50:45.870-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='101'/><category scheme='http://www.blogger.com/atom/ns#' term='smarty'/><title type='text'>Smarty 101</title><content type='html'>&lt;p&gt;&lt;u&gt;&lt;strong&gt;The Smarty template engine - basics&lt;/strong&gt;&lt;/u&gt;&lt;/p&gt;&lt;p&gt;NOTE: I use &lt;strong&gt;&lt;{ to begin&lt;/strong&gt; and &lt;strong&gt;}&gt; to end &lt;/strong&gt;a smarty instruction. The default installations uses just { and }. (which get confused with css) So replace them in my code if needed.&lt;/p&gt;&lt;p&gt;&lt;u&gt;In PHP:&lt;/u&gt;&lt;/p&gt;&lt;p&gt;$name = 'Tim';&lt;/p&gt;&lt;p&gt;$smarty-&gt;assign('name', $name);&lt;/p&gt;&lt;p&gt;$smarty-&gt;display('myTemplateFile.tpl');&lt;/p&gt;&lt;p&gt;** Thats IT.&lt;/p&gt;&lt;p&gt;&lt;u&gt;Inside the template ('myTemplateFile.tpl'):&lt;/u&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;{include file="header.tpl"}&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Always include a header file. You never know when you'll need it. And yes, this is the way you include a smarty template file from another smarty template file.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;/p&gt;Hello &lt;{$name}&gt;, how are you?&lt;br /&gt;&lt;/strong&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;This is how to ECHO a variable.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;{foreach from=$myPeopleArray key=personId item=person }&gt; &lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;{$personId}&gt;. Hello &lt;{$person.name}&gt;.&lt;br /&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;{/foreach}&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This is how to go over an array in smarty. The $personId (variable) and $person (array in this case) will contain a different row from $myPeopleArray each run of the FOREACH loop.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;{$nameescape:"html"}&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This is how to escape html characters from a variable inside a smarty template.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;{$shipment.pickupTimedate_format:'%A %x %H:%M'}&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Dates can also be manipulated inside smarty.&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;strong&gt;&lt;{debug}&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;This is the last command for today. Displaying all your variables and arrays so you can debug your template. All the designer ever needs is to start with this command, and see what material the developer handed to him.&lt;/p&gt;&lt;p&gt;These are the basics. 95% of the time you will not need anything else.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8381632820921572011-8738958382497005512?l=cleanphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cleanphp.blogspot.com/feeds/8738958382497005512/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cleanphp.blogspot.com/2009/06/smarty-101.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/8738958382497005512'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/8738958382497005512'/><link rel='alternate' type='text/html' href='http://cleanphp.blogspot.com/2009/06/smarty-101.html' title='Smarty 101'/><author><name>Lavi</name><uri>http://www.blogger.com/profile/01759600610476602866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8381632820921572011.post-9082369594149414106</id><published>2009-06-15T12:17:00.001-07:00</published><updated>2009-06-16T04:15:30.195-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='installation'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='smarty'/><title type='text'>Smarty Installation</title><content type='html'>Smarty - the template engine.&lt;br /&gt;Can make your life much better.&lt;br /&gt;&lt;br /&gt;1. Download the package: &lt;a href="http://www.smarty.net/"&gt;http://www.smarty.net/&lt;/a&gt;&lt;br /&gt;2. Upload it to a "/smarty" directory. (Can be below your web root, i.e. not accessible from afar)&lt;br /&gt;3. Call it, in your header file:&lt;br /&gt;&lt;pre style="border: 1px dashed rgb(153, 153, 153); padding: 5px; overflow: auto; font-family: Andale Mono,Lucida Console,Monaco,fixed,monospace; color: rgb(0, 0, 0); background-color: rgb(238, 238, 238); font-size: 12px; line-height: 14px; width: 100%;"&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;$rootDirectory ='YOUR_ROOT_DIRECTORY';&lt;br /&gt;require_once('Smarty.class.php');&lt;br /&gt;$smarty = new Smarty();&lt;br /&gt;$smarty-&gt;template_dir = $rootDirectory.'/smarty/projectName/templates';&lt;br /&gt;$smarty-&gt;compile_dir = $rootDirectory.'/smarty/projectName/templates_c';&lt;br /&gt;$smarty-&gt;cache_dir = $rootDirectory.'/smarty/projectName/cache';&lt;br /&gt;$smarty-&gt;config_dir = $rootDirectory.'/smarty/projectName/configs';&lt;br /&gt;$smarty-&gt;left_delimiter = '&lt;{'; $smarty-&gt;right_delimiter = '}&gt;';&lt;br /&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;4. Make the /templates_c directory writeable (777 is fine)&lt;br /&gt;&lt;br /&gt;Thats it. You are go to go.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8381632820921572011-9082369594149414106?l=cleanphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cleanphp.blogspot.com/feeds/9082369594149414106/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cleanphp.blogspot.com/2009/06/smarty-installation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/9082369594149414106'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/9082369594149414106'/><link rel='alternate' type='text/html' href='http://cleanphp.blogspot.com/2009/06/smarty-installation.html' title='Smarty Installation'/><author><name>Lavi</name><uri>http://www.blogger.com/profile/01759600610476602866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8381632820921572011.post-4491754277069377388</id><published>2009-06-15T12:11:00.001-07:00</published><updated>2009-06-24T02:50:51.888-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='time'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='optimization'/><title type='text'>Optimization: How to time your scripts</title><content type='html'>When looking for bottle-necks in your application, you sometimes need to check how long a certain code segment runs.&lt;br /&gt;Here is how to measure it:&lt;br /&gt;&lt;br /&gt;&lt;div id="code"&gt;&lt;br /&gt;&lt;span id="command"&gt;list&lt;/span&gt;($usec, $sec) &lt;span id="command"&gt;= explode&lt;/span&gt;(&lt;span id="string"&gt;" "&lt;/span&gt;, &lt;span id="command"&gt;microtime&lt;/span&gt;());$t1&lt;span id="command"&gt;=&lt;/span&gt;((float)$usec &lt;span id="command"&gt;+&lt;/span&gt; (float)$sec);&lt;br /&gt;&lt;span id="comment"&gt;// the CODE SEGMENT goes here&lt;/span&gt;&lt;br /&gt;&lt;span id="command"&gt;list&lt;/span&gt;($usec, $sec) &lt;span id="command"&gt;= explode&lt;/span&gt;(&lt;span id="string"&gt;" "&lt;/span&gt;, &lt;span id="command"&gt;microtime&lt;/span&gt;());$t2&lt;span id="command"&gt;=&lt;/span&gt;((float)$usec &lt;span id="command"&gt;+&lt;/span&gt; (float)$sec);&lt;br /&gt;$time &lt;span id="command"&gt;=&lt;/span&gt; (float)($t2&lt;span id="command"&gt;-&lt;/span&gt;$t1);&lt;br /&gt;&lt;span id="command"&gt;echo&lt;/span&gt; $time;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8381632820921572011-4491754277069377388?l=cleanphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cleanphp.blogspot.com/feeds/4491754277069377388/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cleanphp.blogspot.com/2009/06/optimization-how-to-time-your-scripts.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/4491754277069377388'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/4491754277069377388'/><link rel='alternate' type='text/html' href='http://cleanphp.blogspot.com/2009/06/optimization-how-to-time-your-scripts.html' title='Optimization: How to time your scripts'/><author><name>Lavi</name><uri>http://www.blogger.com/profile/01759600610476602866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8381632820921572011.post-3466671152506025390</id><published>2009-06-15T12:07:00.000-07:00</published><updated>2009-06-15T12:10:27.451-07:00</updated><title type='text'>Header and Footer</title><content type='html'>&lt;p&gt;&lt;strong&gt;&lt;u&gt;The importance of using Headers and Footers&lt;/u&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Always use a header file that is &lt;em&gt;&lt;strong&gt;require_once('myHeader.php')&lt;/strong&gt;;&lt;/em&gt;  from the top of every file.&lt;/p&gt;&lt;p&gt;Always use a header file that is &lt;strong&gt;&lt;em&gt;require_once('myFooter.php');&lt;/em&gt;&lt;/strong&gt;  from the bottom of every file.&lt;/p&gt;&lt;p&gt;You may leave them empty if you want, but DO put them in place. You WILL need them.&lt;/p&gt;&lt;p&gt; &lt;/p&gt;&lt;p&gt;That is true for both the logic PHP side of the application, and for the presentation TEMPLATE side.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8381632820921572011-3466671152506025390?l=cleanphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cleanphp.blogspot.com/feeds/3466671152506025390/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cleanphp.blogspot.com/2009/06/header-and-footer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/3466671152506025390'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/3466671152506025390'/><link rel='alternate' type='text/html' href='http://cleanphp.blogspot.com/2009/06/header-and-footer.html' title='Header and Footer'/><author><name>Lavi</name><uri>http://www.blogger.com/profile/01759600610476602866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8381632820921572011.post-6958664769038540967</id><published>2009-06-15T11:47:00.000-07:00</published><updated>2009-06-15T12:04:43.801-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='apache'/><category scheme='http://www.blogger.com/atom/ns#' term='htaccess'/><title type='text'>htAccess Magic</title><content type='html'>.Htaccess (Hypertext Access configuration file) can help you perform several important tasks.&lt;br /&gt;Here are some examples:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;AddDefaultCharset utf-8&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;What do you think this does? Eliminating your strange chars from appearing in non-latin languages.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;Options +FollowSymlinks&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;RewriteEngine on&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;These are needed for the REWRITE section which is now coming.&lt;br /&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;RewriteCond %{THE_REQUEST} ^[^/]*/index\.php [NC]&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;strong&gt;RewriteRule . / [R=301,L]&lt;/strong&gt;&lt;/em&gt;&lt;br /&gt;Instead of having both &lt;a href="http://simania.co.il/"&gt;http://simania.co.il/&lt;/a&gt; and &lt;a href="http://simania.co.il/index.php"&gt;http://simania.co.il/index.php&lt;/a&gt; you will only have one. [Why this is good is another story]&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;RewriteCond %{http_host} ^www.simania.co.il [nc]&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;RewriteRule ^(.*)$ &lt;/em&gt;&lt;/strong&gt;&lt;a href="http://simania.co.il/$1"&gt;&lt;strong&gt;&lt;em&gt;http://simania.co.il/$1&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt; [r=301,nc]&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;Instead of having both &lt;a href="http://simania.co.il/"&gt;http://simania.co.il/&lt;/a&gt; and &lt;a href="http://www.simania.co.il/"&gt;http://www.simania.co.il/&lt;/a&gt; you will only have one. [ same note]&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;RewriteCond %{http_host} ^somethingOLD.simania.co.il [nc]&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;RewriteRule ^(.*)$ &lt;/em&gt;&lt;/strong&gt;&lt;a href="http://simania.co.il/$1"&gt;&lt;strong&gt;&lt;em&gt;http://simania.co.il/$1&lt;/em&gt;&lt;/strong&gt;&lt;/a&gt;&lt;strong&gt;&lt;em&gt; [r=301,nc]&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;Old subdomain that no longer exists. Make it disappear, without loosing traffic.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;RewriteCond %{REQUEST_FILENAME} !-f&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;RewriteCond %{REQUEST_FILENAME} !-d&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;RewriteCond %{REQUEST_FILENAME} ^/(.*)/(.*)/(.*)/(.*)$&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;RewriteRule ^rss/([^/]*)/([^/]*)/([^/]*) /feed.php?type=$1&amp;amp;user=$2&amp;amp;item=$3 [T=application/x-httpd-php]&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;Have some FRIENDLY urls. From &lt;a href="http://simania.co.il/rss/AAA/BBB/CCC"&gt;http://simania.co.il/rss/AAA/BBB/CCC&lt;/a&gt; you get &lt;a href="http://simania.co.il/feed.php?type=AAA&amp;amp;user=BBB&amp;amp;item=CCC"&gt;http://simania.co.il/feed.php?type=AAA&amp;amp;user=BBB&amp;amp;item=CCC&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;ErrorDocument 404 /404.php&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;Have all the mistyped urls (and those that no longer exist) bring up your custom 404 error file.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;order allow,deny&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;deny from 41.208.&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;&lt;strong&gt;&lt;em&gt;allow from all&lt;/em&gt;&lt;/strong&gt;&lt;br /&gt;Block some nasty IP addresses, or allow just the ones you want.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8381632820921572011-6958664769038540967?l=cleanphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cleanphp.blogspot.com/feeds/6958664769038540967/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cleanphp.blogspot.com/2009/06/htaccess-magic.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/6958664769038540967'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/6958664769038540967'/><link rel='alternate' type='text/html' href='http://cleanphp.blogspot.com/2009/06/htaccess-magic.html' title='htAccess Magic'/><author><name>Lavi</name><uri>http://www.blogger.com/profile/01759600610476602866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8381632820921572011.post-2772105794384273198</id><published>2009-06-15T11:37:00.000-07:00</published><updated>2009-06-15T13:20:02.706-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Web design'/><category scheme='http://www.blogger.com/atom/ns#' term='UI'/><category scheme='http://www.blogger.com/atom/ns#' term='smarty'/><title type='text'>Requirements from a web designer</title><content type='html'>Designers used to work in printshops.&lt;br /&gt;Brochures were the bread and butter for them.&lt;br /&gt;&lt;br /&gt;Web sites came along.&lt;br /&gt;DYNAMIC web sites came along.&lt;br /&gt;&lt;br /&gt;Designers (most of them) still think in static terms.&lt;br /&gt;&lt;br /&gt;"I'll give you a PSD", they say. "Wow, thanks", I reply, "and who will do the DESIGN?"&lt;br /&gt;"HA?" they reply...&lt;br /&gt;&lt;br /&gt;Designing a dynamic web site involves more then just statically making a sketch in Photoshop.&lt;br /&gt;Some areas need to be made &lt;em&gt;stretchable&lt;/em&gt;, other areas need to have AJAX loading or other javascript effects. CSS needs to be used to perform various functions, and ofcourse browser dependance need to be addressed.&lt;br /&gt;These are all part of the DESIGN. You can't escape it. It's a brave new world out there.&lt;br /&gt;&lt;br /&gt;Idealy, a designer would get the list of variables and create a full template (in Smarty or other engine) to bring the site to life. Nothing short of that.&lt;br /&gt;&lt;br /&gt;User Interface design is needed, one that will serve many users, not a flat one-time mailbox brochure that will later serve as a pizza tray.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8381632820921572011-2772105794384273198?l=cleanphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cleanphp.blogspot.com/feeds/2772105794384273198/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cleanphp.blogspot.com/2009/06/requirements-from-web-designer.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/2772105794384273198'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/2772105794384273198'/><link rel='alternate' type='text/html' href='http://cleanphp.blogspot.com/2009/06/requirements-from-web-designer.html' title='Requirements from a web designer'/><author><name>Lavi</name><uri>http://www.blogger.com/profile/01759600610476602866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8381632820921572011.post-545284521511727136</id><published>2009-06-15T11:04:00.000-07:00</published><updated>2009-06-24T02:39:20.282-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='layers'/><category scheme='http://www.blogger.com/atom/ns#' term='Data Logic Presentation'/><category scheme='http://www.blogger.com/atom/ns#' term='php'/><category scheme='http://www.blogger.com/atom/ns#' term='smarty'/><title type='text'>Three layers of seperation</title><content type='html'>&lt;strong&gt;Data, Logic and Presentation&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;When building an application(i.e. something) in PHP it is very easy to fall into the pit of putting everything in one big file.&lt;br /&gt;Usually starting with a database connection:&lt;br /&gt;&lt;div id="code"&gt;&lt;br /&gt;&lt;em&gt;$connection = &lt;span id="command"&gt;mysql_connect&lt;/span&gt;(&lt;span id="string"&gt;"localhost", "USER", "PASSWORD"&lt;/span&gt;);&lt;br /&gt;&lt;span id="command"&gt;mysql_select_db&lt;/span&gt;(&lt;span id="string"&gt;"DATABASE"&lt;/span&gt;, $connection); &lt;/em&gt;&lt;br /&gt;&lt;em&gt;$result = &lt;span id="command"&gt;mysql_query&lt;/span&gt;(&lt;span id="string"&gt;'SELECT * FROM people'&lt;/span&gt;);&lt;/em&gt;&lt;br /&gt;&lt;em&gt;$row = &lt;span id="command"&gt;mysql_fetch_assoc&lt;/span&gt;($result);&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;/em&gt;&lt;em&gt;&lt;/em&gt;continue with some logic:&lt;br /&gt;&lt;div id="code"&gt;&lt;br /&gt;&lt;em&gt;$people = &lt;span id="command"&gt;array&lt;/span&gt;(&lt;span id="string"&gt;'Joe'&lt;/span&gt;,&lt;span id="string"&gt; 'Marry'&lt;/span&gt;,&lt;span id="string"&gt; 'Tim'&lt;/span&gt;, $row[&lt;span id="string"&gt;'personName'&lt;/span&gt;]);&lt;/em&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;and put some presentation:&lt;br /&gt;&lt;div id="code"&gt;&lt;br /&gt;&lt;em&gt;&lt;span id="command"&gt;echo&lt;/span&gt; &lt;span id="string"&gt;'Hello'&lt;/span&gt;.$people[0];&lt;/em&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Then some more data, and more logic and more presentation.&lt;br /&gt;All in one big mess.&lt;br /&gt;&lt;br /&gt;So, how do we clean this mess? Using the three layers of seperation.&lt;br /&gt;DATA belongs in one(or more) file(usually a class).&lt;br /&gt;LOGIC belongs in a different file(usually also a class).&lt;br /&gt;PRESENTATION belongs in a template of some kind.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Suggestion&lt;/u&gt;&lt;br /&gt;Start your file with a:&lt;br /&gt;&lt;div id="code"&gt;&lt;br /&gt;&lt;em&gt;&lt;span id="green"&gt;require_once&lt;/span&gt;(&lt;span id="string"&gt;"MyData.class.php"&lt;/span&gt;);&lt;/em&gt;&lt;br /&gt;&lt;em&gt;$oData = &lt;span id="green"&gt;new&lt;/span&gt; Data;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span id="green"&gt;require_once&lt;/span&gt;(&lt;span id="string"&gt;"MyLogic.class.php"&lt;/span&gt;);&lt;br /&gt;$oMyLogic= &lt;span id="green"&gt;new&lt;/span&gt; MyLogic;&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;span id="green"&gt;require_once&lt;/span&gt;(&lt;span id="string"&gt;"MyPresentation.class.php"&lt;/span&gt;);&lt;/em&gt;&lt;br /&gt;&lt;em&gt;$oMyPresentation = &lt;span id="green"&gt;new&lt;/span&gt; MyPresentation;&lt;/em&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;Continue with:&lt;br /&gt;&lt;div id="code"&gt;&lt;br /&gt;&lt;em&gt;$theData = $oData-&gt;getTheData();&lt;/em&gt;&lt;br /&gt;&lt;em&gt;$theImprovedData = $oMyLogic-&gt;doTheMath($theData);&lt;/em&gt;&lt;br /&gt;&lt;em&gt;$oMyPresentation-&gt;doThePresentation($theImprovedData);&lt;/em&gt;&lt;br /&gt;&lt;em&gt;&lt;/em&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;u&gt;Benefits:&lt;/u&gt;&lt;br /&gt;The Designer (see post about him later) can mess around with his design without disturbing the programmer. If there is a bug, it is simple to see whose job it is to fix it.&lt;br /&gt;Managing you application is much easier.&lt;br /&gt;Reusing code is doable.&lt;br /&gt;UpScaling your application is doable.&lt;br /&gt;&lt;br /&gt;&lt;u&gt;Recommended tool of trade:&lt;/u&gt;&lt;br /&gt;SMARTY (A PHP template engine): &lt;br /&gt;&lt;a href="http://www.smarty.net/"&gt;http://www.smarty.net/&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8381632820921572011-545284521511727136?l=cleanphp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://cleanphp.blogspot.com/feeds/545284521511727136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://cleanphp.blogspot.com/2009/06/three-layers-of-seperation.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/545284521511727136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8381632820921572011/posts/default/545284521511727136'/><link rel='alternate' type='text/html' href='http://cleanphp.blogspot.com/2009/06/three-layers-of-seperation.html' title='Three layers of seperation'/><author><name>Lavi</name><uri>http://www.blogger.com/profile/01759600610476602866</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
