Sunday, December 16, 2007

PHP coding tips

Since I'm so tired of seeing scrappy and illegible PHP code, I've decided to put up some tips for good and readable PHP coding.


* Always have function names and variable names in lower case, and any words in them separated by underscores


* Always capitalise

NULL


* Always capitalise constants

* Always use the proper C-style condition symbols, e.g.

&&

instead of

and

, and

||

instead of

or


* Always enclose separate condition clauses in brackets, e.g.

if(($a==1) || ($b==1))

, not

if($a==1 || $b==1)


* Always put block brackets on new lines, and indent the block contents, e.g.

if($a==1)
{

, not

if($a==1) {

, and

}
else
{

, not

} else {


* Always contract blocks when possible (if blocks with only one line of code in the block are a prime target)

Use contracted if statements when possible,

e.g.

($a=($b==1)?'hello':'goodbye';)

Thursday, November 22, 2007

40+ Tips for optimizing your php Code

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%

Wednesday, November 21, 2007

Simple Optimization for PHP and MySQL

Simple Optimization for PHP and MySQL


Here is a list of a few very simple tips for optimizing your php/mysql applications. Keep these in mind while developing.


MySQL


  • MySQL is interpreted from right to left so you should put the most significant limiters as far to the right as possible.

  • Only select fields you need, instead of selecting * (everything).

  • Don't put things that changes very rarely in the database, instead put it in a global array in some include file.

  • Use indexes on the columns in the WHERE clause and on the columns you want to ORDER BY.

  • Indexes are great if you search the table alot, but it slows down insertion.

  • Use the EXPLAIN command to analyze your indexes.

  • If you only want one line as a result from the database you should always use LIMIT 1. This way mysql stops searching when it finds the first line instead of continuing through the whole database, only to find that there weren't any more lines that matched the query.

  • If you use $line = mysql_fetch_array($result) you'll get two ways of accessing the columns, $line[0] and $line['columnname']. If you only use the $line['columnname'] you should use $line = mysql_fetch_assoc($result) instead, then there will not be any $line[int index] array.

  • Sometimes mysql_free_result() end up wasting more memory than it saves. Check the difference with memory_get_usage().

  • Don't ask the database for the same stuff over and over again, save the result.

  • Use NOT NULL as default value as much as you can, it speeds up execution and saves one bit.

  • Use datatypes that fits your data, not too large. For example, INT can hold values up to 4294967295 unsigned, which is often unnecessarily big. Use MEDIUMINT or SMALLINT where applicable.

  • Make use of the default values, only insert values that differs from the default values to speed up the insertion.




PHP:

  • Many code blocks might slow down the interpretation a little bit.

    <?
    ...
    ...
    ...
    ?>

    is faster than


    <? ... ?>
    <? ... ?>
    <? ... ?>


  • Don't concatenate when you don't need to.

    "SELECT id FROM tabell WHERE id = $_SESSION[id] LIMIT 1"

    is faster than:

    "SELECT id FROM tabell WHERE id = ".$_SESSION['id']." LIMIT 1"


  • 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.



  • The previous item makes it all boil down to

    'SELECT id FROM tabell WHERE id =

    '.$_SESSION['id'].' LIMIT 1'

    as the fastest way of concatenating querys.

  • When echoing strings it's faster to separate them by comma instead of dot.

    echo "echoing ",$variable," something";

    Note: This only works with echo, which is a function that can take several strings as arguments.


  • echo is faster than print.

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


    $maxvalue = 100/10;
    for($i=0; $i<$maxvalue; $i++){
    // Some code
    }

    is faster than:


    for($i=0; $i<100/10; $i++){
    // Some code
    }

    because the value is calculated once instead of ten times.


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


If possible it's of course always better to generate static html pages every time something is updated or as often as an update might be relevant instead of querying the database every time.

Tuesday, November 20, 2007

Video Streaming & Media Streaming Servers

Video Streaming

This article covers the different types of video streaming on the internet and introduces the two main methods of streaming video: Streaming servers (true streaming) and HTTP streaming.

File Formats

There are many video file formats to choose from. The most common formats are:

1. Windows Media
2. RealMedia
3. Quicktime
4. MPEG (in particular MPEG-4)
5. Adobe Flash

There are pros and cons for each format but in the end it comes down to personal preference.

Streaming Methods

There are two ways to view media on the internet (such as video, audio, animations, etc): Downloading and Streaming.

Downloading

When you download a file the entire file is saved on your computer (usually in a temporary folder), which you then open and view. This has some advantages (such as quicker access to different parts of the file) but has the big disadvantage of having to wait for the whole file to download before any of it can be viewed. If the file is quite small this may not be too much of an inconvenience, but for large files and long presentations it can be very off-putting.

The easiest way to provide downloadable video files is to use a simple hyperlink to the file. A slightly more advanced method is to embed the file in a web page using special HTML code.

Delivering video files this way is known as HTTP streaming or HTTP delivery. HTTP means Hyper Text Transfer Protocol, and is the same protocol used to deliver web pages. For this reason it is easy to set up and use on almost any website, without requiring additional software or special hosting plans.

Note: This is not technically "true" video streaming — the best it can do is a passable imitation.

Streaming

Streaming media works a bit differently — the end user can start watching the file almost as soon as it begins downloading. In effect, the file is sent to the user in a (more or less) constant stream, and the user watches it as it arrives. The obvious advantage with this method is that no waiting is involved. Streaming media has additional advantages such as being able to broadcast live events (sometimes referred to as a webcast or netcast).

True streaming video must be delivered from a specialized streaming server.

Progressive Downloading

There is also a hybrid method known as progressive download. In this method the video clip is downloaded but begins playing as soon as a portion of the file has been received. This simulates true streaming, but doesn't have all the advantages.

Which Method to Use?

The method you choose will depend on your situation, but most people will opt for HTTP streaming (download or progressive download). This is the easiest and cheapest way to get started. If necessary you can upgrade to a streaming server later.

Media Streaming Servers

A streaming media or streaming video server is a specialized application which runs on an Internet server. This is often referred to as "true streaming", since other methods only simulate streaming. True streaming has advantages such as:

* The ability to handle much larger traffic loads.
* The ability to detect users' connection speeds and supply appropriate files automatically.
* The ability to broadcast live events.

There are two ways to have access to a streaming server:

1. Operate you own server (by purchasing or leasing)
2. Sign up for a hosted streaming plan with an ISP (Internet Service Provider)

Operate your own server

Note: This is a serious step and is well beyond the needs of most websites.

To run your own streaming server, you can either purchase a standalone server machine or purchase a streaming server software package and install it on an existing web server. Streaming software is available for all common server platforms such as Linux, Windows, etc.

Some examples of streaming media software:

* Helix Universal Server from RealNetworks. This server supports a variety of formats, including RealMedia, Windows Media, Quicktime and MPEG-4.
* Apple Quicktime Streaming Server, supporting a few formats including MPEG-4 and 3GPP.
* Macromedia Communication Server, specializing in Flash-based video and interactive multimedia.

Be warned: True video streaming in any form can be an expensive business.

Unless you really have a need for it, you are probably better off starting with basic HTTP streaming...

HTTP Streaming Video

This is the simplest and cheapest way to stream video from a website. Small to medium-sized websites are more likely to use this method than the more expensive streaming servers.

For this method you don't need any special type of website or host — just a host server which recognises common video file types (most standard hosting accounts do this). You also need to know how to upload files and how to create hyperlinks.

There are some limitations to bear in mind regarding HTTP streaming:

* HTTP streaming is a good option for websites with modest traffic, i.e. less than about a dozen people viewing at the same time. For heavier traffic a more serious streaming solution should be considered.
* You can't stream live video, since the HTTP method only works with complete files stored on the server.
* You can't automatically detect the end user's connection speed using HTTP. If you want to create different versions for different speeds, you need to create a separate file for each speed.
* HTTP streaming is not as efficient as other methods and will incur a heavier server load.

These things won't bother most website producers — it's normally only when you get into heavy traffic that you should be worried about them.


System Requirements

• 8-Core Intel Xeon processor 3.2GHz
• 4GB RAM
• 64-bit PCI-X RAID controller
• Ultra320 SCSI RAID subsystem
• 1GB Ethernet Card

Monday, November 19, 2007

PHP 6 - Future Development

PHP 6 in development aims to address some of PHP 5's shortcomings.

* Namespace support will be added.

* Native Unicode support will be added.

* The magic_quotes option will be removed.

* The HTTP_*_VARS global variables will be removed.

* The register_globals option will be removed.

* The safe_mode option will be removed.

* Late static binding will be added.