Thursday, February 14, 2008

40 Tips for optimizing your php code

  1. If a method can be static, declare it static. Speed improvement is by a factor of 4.


  2. echo is faster than print.

  3. Use echo's multiple parameters instead of string concatenation.

  4. Set the maxvalue for your for-loops before and not in the loop.

  5. Unset your variables to free memory, especially large arrays.

  6. Avoid magic like __get, __set, __autoload

  7. require_once() is expensive

  8. Use full paths in includes and requires, less time spent on resolving the OS paths.

  9. If you need to find out the time when the script started executing, $_SERVER[’REQUEST_TIME’] is preferred to time()


  10. See if you can use strncasecmp, strpbrk and stripos instead of regex

  11. str_replace is faster than preg_replace, but strtr is faster than str_replace by a factor of 4

  12. If the function, such as string replacement function, accepts both arrays and single characters as arguments, and if your argument list is not too long, consider writing a few redundant replacement statements, passing one character at a time, instead of one line of code that accepts arrays as search and replace arguments.

  13. It's better to use select statements than multi if, else if, statements.

  14. Error suppression with @ is very slow.

  15. Turn on apache's mod_deflate

  16. Close your database connections when you're done with them

  17. $row[’id’] is 7 times faster than $row[id]

  18. Error messages are expensive

  19. Do not use functions inside of for loop, such as for ($x=0; $x <>
  20. Incrementing a local variable in a method is the fastest. Nearly the same as calling a local variable in a function.


  21. Incrementing a global variable is 2 times slow than a local var.

  22. Incrementing an object property (eg. $this->prop++) is 3 times slower than a local variable.

  23. Incrementing an undefined local variable is 9-10 times slower than a pre-initialized one.

  24. Just declaring a global variable without using it in a function also slows things down (by about the same amount as incrementing a local var). PHP probably does a check to see if the global exists.

  25. Method invocation appears to be independent of the number of methods defined in the class because I added 10 more methods to the test class (before and after the test method) with no change in performance.

  26. Methods in derived classes run faster than ones defined in the base class.

  27. A function call with one parameter and an empty function body takes about the same time as doing 7-8 $localvar++ operations. A similar method call is of course about 15 $localvar++ operations.

  28. Surrounding your string by ' instead of " will make things interpret a little faster since php looks for variables inside "..." but not inside '...'. Of course you can only do this when you don't need to have variables in the string.


  29. When echoing strings it's faster to separate them by comma instead of dot. Note: This only works with echo, which is a function that can take several strings as arguments.

  30. A PHP script will be served at least 2-10 times slower than a static HTML page by Apache. Try to use more static HTML pages and fewer scripts.

  31. Your PHP scripts are recompiled every time unless the scripts are cached. Install a PHP caching product to typically increase performance by 25-100% by removing compile times.

  32. Cache as much as possible. Use memcached - memcached is a high-performance memory object caching system intended to speed up dynamic web applications by alleviating database load. OP code caches are useful so that your script does not have to be compiled on every request

  33. When working with strings and you need to check that the string is either of a certain length you'd understandably would want to use the strlen() function. This function is pretty quick since it's operation does not perform any calculation but merely return the already known length of a string available in the zval structure (internal C struct used to store variables in PHP). However because strlen() is a function it is still somewhat slow because the function call requires several operations such as lowercase & hashtable lookup followed by the execution of said function. In some instance you can improve the speed of your code by using an isset() trick.




    Ex.

    if (strlen($foo) < 5) { echo "Foo is too short"; }

    vs.

    if (!isset($foo{5})) { echo "Foo is too short"; }



    Calling isset() happens to be faster then strlen() because unlike strlen(), isset() is a language construct and not a function meaning that it's execution does not require function lookups and lowercase. This means you have virtually no overhead on top of the actual code that determines the string's length.


  34. When incrementing or decrementing the value of the variable $i++ happens to be a tad slower then ++$i. This is something PHP specific and does not apply to other languages, so don't go modifying your C or Java code thinking it'll suddenly become faster, it won't. ++$i happens to be faster in PHP because instead of 4 opcodes used for $i++ you only need 3. Post incrementation actually causes in the creation of a temporary var that is then incremented. While pre-incrementation increases the original value directly. This is one of the optimization that opcode optimized like Zend's PHP optimizer. It is a still a good idea to keep in mind since not all opcode optimizers perform this optimization and there are plenty of ISPs and servers running without an opcode optimizer.

  35. Not everything has to be OOP, often it is too much overhead, each method and object call consumes a lot of memory.

  36. Do not implement every data structure as a class, arrays are useful, too

  37. Don't split methods too much, think, which code you will really re-use

  38. You can always split the code of a method later, when needed

  39. Make use of the countless predefined functions

  40. If you have very time consuming functions in your code, consider writing them as C extensions

  41. Profile your code. A profiler shows you, which parts of your code consumes how many time. The Xdebug debugger already contains a profiler. Profiling shows you the bottlenecks in overview

  42. mod_gzip which is available as an Apache module compresses your data on the fly and can reduce the data to transfer up to 80%

  43. Excellent Article about optimizing php by John Lim

Wednesday, February 13, 2008

The Top 40 Free Ajax & Javascript Code for Web Development

Ajax has becoming very popular recently, but most designers seem to rehash the same script over and over (you’ll see it in a lot of Wordpress Themes and Plugins). Perhaps we aren’t using ajax technology to its full potential, myself included. The list below is made up of the best FREE scripts available, they are all of the highest quality and more or less easy to configure. Give them a try.
I have tried and tested the top 22, and aim to try the rest, because to be honest they look pretty cool.

1. Lightbox 2 (http://www.huddletogether.com)

Lightbox 2

Description:Lightbox is a simple, unobtrusive script used to overlay images on the current page. It’s a snap to setup and works on all modern browsers.
Technology:Lightbox 2 uses the Prototype Framework and Scriptaculous Effects Library.

2.Timeline (http://simile.mit.edu/timeline/)

Timeline

Description:Timeline is a widget for visualizing time-based events. It is like Google Maps for time-based information.
Technology:Ajax and DHTML.

3. Reflection.js (http://cow.neondragon.net)

Reflection.js

Description:Reflection.js allows you to add reflections to images on your webpages. It works in all the major browsers - Internet Explorer 5.5+, Mozilla Firefox 1.5+, Opera 9+ and Safari. On older browsers, it’ll degrade and your visitors won’t notice a thing. Best of all, it’s under 5KB.
Technology:Javascript.

4. Pie & Donut Chart (http://www.amcharts.com/pie/)

Pie & Donut Chart

Description:Pie & Donut (doughnut) is a very universal and fully configurable Flash chart. Using it, you can easily have good-looking, animated pies or donuts on your website. You can also use it for creating elaborate navigation menus.
Technology:Flash.

5. Plotr (http://solutoire.com/plotr/)

Plotr

Description:Plotr is a lightweight chart creating framework. It’s released under the BSD license.
Technology:Mochikit.

6. Ajax Instant Messenger (http://www.ajaxim.com/)

Ajax Instant Messenger

Description:Ajax im is a browser-based instant messaging client. It can be used in conjunction with community, intranet, and social websites. No refreshing of the page is ever needed for this “web application” to work.
Technology:Ajax and Javascript.

7. Starbox (http://www.nickstakenburg.com/projects/starbox/)

Starbox

Description:Starbox allows you to easily create all kinds of rating boxes using just one PNG image.
Technology:Prototype javascript framework.

8. Ajax Tabs Content (http://www.dynamicdrive.com/)

Ajax Tabs Content

Description: This is a versatile script that lets you display content pulled from external files inside a DIV and organized via CSS tabs. A fully unobtrusive, CSS and HTML based script.
Technology:Ajax.

9. Drag and Drop Shopping (http://demo.script.aculo.us/shop)

 Drag and Drop Shopping

Description: An excellent drag and drop shopping cart.
Technology:Ajax.

10. Progress Bar (http://www.webappers.com/progressBar/)

 Progress Bar

Description: A very stylish progress bar.
Technology:Ajax.

11. Thick Box (http://jquery.com/demo/thickbox/)

Thick Box

Description: ThickBox is a webpage UI dialog widget written in JavaScript on top of the jQuery library. Its function is to show a single image, multiple images, inline content, iframed content, or content served through AJAX in a hybrid modal.
Technology:Javascript.

12. Create Flickr Like Fields (http://dbachrach.com)

Create Flickr Like Fields

Description: The name says it all. Technology:Ajax.

13. jTip – A jQuery Tool Tip (http://codylindley.com)

 jTip – A jQuery Tool Tip

Description: jTip, not unlike Thickbox, pulls data from the server using a hidden http request. It’s nothing that fancy…
Technology:Ajax.

14.Accordian (http://demos.mootools.net/Accordion)

 Accordian

Description: A smooth and stylish ‘accordian’ effect menu.
Technology:Moo Tools Javascript Framework.

15. Unobtrusive AJAX Star Rating Bar (http://www.masugadesign.com)

 Unobtrusive AJAX Star Rating Bar

Description:This is a rating bar script done with PHP and mySQL that allows users to rate things like can be done on Netflix or Amazon, all web 2.0-like with no page refresh.
Technology:PHP.

And the rest…

16. Plotkit (Javascript Chart Plotting Script).
17. Pie (Create ajax pie charts).
18. Prototip (Prototip allows you to easily create both simple and complex tooltips using the Prototype javascript framework).
19. Ajax Inline Text Edit (This is a very simple script which only works with span tags).
20. Tabbed Content Browser (An Ajax powered tabbed content browser).
21. Table Sorting Script (An unobtrusive ajax Table Sorting Script).
22. Color Sphere (DHTML Color Picker).
23. Mapper.js (Thisallows you to add automatic area highlighting to image maps on your webpages (inc. export to SVG)).
24. Live Validation (LiveValidation is a small open source javascript library built for giving users real-time validation information).
25. Draggable Content (Javascript drag and drop).
26. Carousel (A Carousel Effect Image gallery).
27. Multibox (A javascript lightbox that supports images, flash, video, mp3s…).
28. Smooth Gallery (Using mootools v1.11, this javascript gallery and slideshow system allows you to have simple and smooth (cross-fading…) image galleries, slideshows, showcases and other cool stuff on your website…).
29. Form Style Generator
30. Auto Complete (A MooTools Autocompleter widget that creates a unobtrusive and customisable suggestion box for input fields from variable data sources).
31. Active Collab (An open Source Project Management Script).
32. Greybox (A small unobtusive pop up script).
33. Ajax Poller.
34. Tablekit (TableKit is a collection of HTML table enhancements using the Prototype framework).
35. J-query Shoutbox (This script is based on jQuery library and Form plugin.
It’s very easy to setup it, also an archive is available for download so you can play with the files on your localhost).
36. Ajax RSS Ticker.
37. Highslide (It streamlines the use of thumbnail images and HTML popups on web pages).
38. Slideshow Viewer (Stylish gallery script with a ‘lightbox’ effect).
39. Mocha (Mocha is a web applications user interface library built on the Mootools javascript framework. The Mocha GUI components are made with canvas tag graphics).
40. Loading XML into a page with xmlHttpRequest.

Thursday, February 07, 2008

40 sings if you are a lousy PHP programmer

This is something I prefer to call my "programming list of shame". Although having a formal university education with courses on software engineering, enterprise software architecture & database design I have been guilty of every single one of those things at one time or another. This is completely subjective & Eclipse oriented


You are a lousy PHP programmer if you



  1. don't comment your code properly with something like phpDoc

  2. don't see the need and/or benefits of a good programming IDE like Zend Studio or Eclipse PDT

  3. have never used some form of version control like Subclipse

  4. don't adopt some coding & naming standards and general conventions and stick to to them at least throughout the project

  5. don't use a consistent methodology

  6. don't escape and/or validate properly input or sql queries

  7. don't plan your application thoroughly before starting to code

  8. don't use test-driven development

  9. don't program & test with error reporting on

  10. don't see the benefits of a debugger

  11. don't refactor your code

  12. don't keep the different layers seperated using something like MVC

  13. don't know what these stand for: KISS, DRY, MVC, OOP, REST

  14. don't return content but echo or print it from your functions or classes

  15. have never seen the advantage of unit tests or testing in general

  16. return HTML, not data, strings, or objects.

  17. hard code messages and configuration parameters

  18. don't optimize your sql queries

  19. don't use __autoload

  20. don't allow intelligent error handling

  21. use $_GET instead of $_POST for any destructive actions

  22. don't know how to use regular expressions

  23. you've never heard of sql injection or cross-site scripting

  24. don't allow simple configuration, can be parameters passed to a class’s constructor, set/get methods called later, or constants defined at a runtime.

  25. don't understand the benefits and limitations of Object Oriented Programming

  26. misuse OOP / everything you write , no matter how small is OOP

  27. you think reusable software equals/requires your code to be OOP

  28. don't choose intelligent defaults

  29. don't have one single configuration file

  30. don't want the file contents to be seen, but give it a .inc extension instead of .php

  31. don't use a database abstraction layer

  32. don't keep it DRY, Don't repeat yourself. If you have to copy and paste or duplicate something your design may be off.

  33. don't make a function/class/method do just one thing and don't make them interact.

  34. don't try to take advantage of OOP specific features like abstract/interface classes, inheritage polymorphism & access modifiers.

  35. don't optimize your application design with established design patterns

  36. don't allow your user to define a base directory if you have multiple files and/or directories

  37. pollute the global namespace, one option is to prefix the functions in your library with a common string

  38. don't allow a table prefix when using database tables

  39. use a separate template engine

  40. don't take a look at established php frameworks for inspiration, most of them have advanced web dev concepts and good code