1. Advertising
    y u no do it?

    Advertising (learn more)

    Advertise virtually anything here, with CPM banner ads, CPM email ads and CPC contextual links. You can target relevant areas of the site and show ads based on geographical location of the user if you wish.

    Starts at just $1 per CPM or $0.10 per CPC.

How to optimize PHP script to increase speed

Discussion in 'PHP' started by Aragorn, Mar 18, 2007.

  1. #1
    I saw a similar post in the parent forum (Programming) and thought about this. Can any PHP gurus here please provide some help on how to optimize php code to increase the execution speed? Below are 3 tips I've found somewhere else
    * include is faster than include_once
    * Error suppresion can decrease the execution speed.
    * Declare variables as static where ever possible.

    Can anyone please provide any similar tips?

    Thanks is advance :)
     
    Aragorn, Mar 18, 2007 IP
  2. streety

    streety Peon

    Messages:
    321
    Likes Received:
    15
    Best Answers:
    0
    Trophy Points:
    0
    #2
    The more general thread is here

    Personally I'm not really a fan of these ideas for optimising php scripts. Unless you're including thousands of files the fraction of a millisecond gained from using include rather than include_once is going to go unnoticed.

    This isn't to say it doesn't matter. You should try and stick with include and require rather than include_once and require_once but because it is just good coding practice, not because it is faster. You should know when and where you are including code in your scripts, include_once and require_once are just there for when you don't know what is going on in your script.

    If you are concerned by the speed of your scripts there is only one thing you need to remember to do . . . TEST. Time the different sections of your script and find out where the bottlenecks are. Locate the parts that are slowing down your script and improve them.
     
    streety, Mar 18, 2007 IP
    Aragorn likes this.
  3. Aragorn

    Aragorn Peon

    Messages:
    1,491
    Likes Received:
    72
    Best Answers:
    1
    Trophy Points:
    0
    #3
    Thanks a lot for your reply. Though I said a not so important tips, I expected more important tips from the PHP Gurus here. Is there any program for benchmarking? Or should I do it manually?
     
    Aragorn, Mar 18, 2007 IP
  4. streety

    streety Peon

    Messages:
    321
    Likes Received:
    15
    Best Answers:
    0
    Trophy Points:
    0
    #4
    It depends at what level you want to benchmark your scripts. If all you want to do is see how many page requests your server can handle then I think Apache has a tool called Apache benchmark or something similar.

    Actually looking at the code itself I just use a small class which I think I took from a tutorial on phpfreaks a long time ago. If you want something more feature rich then perhaps this pear package - http://pear.php.net/package/Benchmark
     
    streety, Mar 18, 2007 IP
  5. phper

    phper Active Member

    Messages:
    247
    Likes Received:
    17
    Best Answers:
    0
    Trophy Points:
    60
    #5
    street wrote:

    "... This isn't to say it doesn't matter. You should try and stick with include and require rather than include_once and require_once but because it is just good coding practice, not because it is faster. You should know when and where you are including code in your scripts, include_once and require_once are just there for when you don't know what is going on in your script. ..."


    I disagree.

    What you're suggesting is, programmers need to know when and where each script is included, which is practicable only in small applications, although still not a good practice.

    Imagine this case scenario. We have script A that requires script B and script C, with script B also requires script C. What you're suggesting is, script B doesn't need to do an include/require_once(C), because script A (which requires script B) already includes/requires it. This builds a dependancy (coupling) of script B to script A, which means reduced code maintainability. Imagine if further down the track, we need to modify script A, such that it no longer requires script C. If we remove the include/require[_once](C) line from script A, we'd then break script B. If we don't, it'd be a redundancy in script A, which also hurts code maintainability.

    That's when we only have 3 scripts. Things will get much messier in medium to large apps, and when the codes are updated frequently.


    What I think should be done is, each script should be as much as possible independent to other scripts. If it needs to include another script, it should have its own include/require_once(), regardless of whether or not another script already includes/requires it. As such, include_once() and require_once() will be used most of the time, as opposed to include() and require().

    There will be a trade-off in performance, but as you've already mentioned, it's very insignificant.
     
    phper, Mar 18, 2007 IP
  6. mikeid22

    mikeid22 Notable Member

    Messages:
    1,459
    Likes Received:
    57
    Best Answers:
    1
    Trophy Points:
    210
    #6
    Did you ever find a program for benchmarking in this way, or did you give up looking?
     
    mikeid22, Dec 24, 2007 IP
  7. InFloW

    InFloW Peon

    Messages:
    1,488
    Likes Received:
    39
    Best Answers:
    0
    Trophy Points:
    0
    #7
    Zend Studio has a great profiler which isn't to tough to setup the server side of things for it so it'll work.
     
    InFloW, Dec 24, 2007 IP
  8. templates4sale

    templates4sale Active Member

    Messages:
    176
    Likes Received:
    2
    Best Answers:
    0
    Trophy Points:
    55
    #8
    just use template engine
     
    templates4sale, Dec 28, 2007 IP
  9. DarkMindZ

    DarkMindZ Guest

    Messages:
    175
    Likes Received:
    6
    Best Answers:
    0
    Trophy Points:
    0
    #9
    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. Set the maxvalue for your for-loops before and not in the loop.

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

    5. Avoid magic like __get, __set, __autoload

    6. require_once() is expensive

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

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

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

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

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

    12. Error suppression with @ is very slow.

    13. $row[�id�] is 7 times faster than $row[id]

    14. Error messages are expensive

    15. Do not use functions inside of for loop, such as for ($x=0; $x < count($array); $x) The count() function gets called each time.

    16. Incrementing a local variable in a method is the fastest. Nearly the same as calling a local variable in a function.

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

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

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

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

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

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

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

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

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

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

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

    28. Use memcached - memcached is a high-performance memory object caching system intended to speed up dynamic web applications by alleviating database load

    29. Use ip2long() and long2ip() to store IP addresses as integers instead of strings in a database. This will reduce the storage space by almost a factor of four (15 bytes for char(15) vs. 4 bytes for the integer), make it easier to calculate whether a certain address falls within a range, and speed-up searches and sorts (sometimes by quite a bit).

    30. Partially validate email addresses by checking that the domain name exists with checkdnsrr(). This built-in function checks to ensure that a specified domain name resolves to an IP address. A simple user-defined function that builds on checkdnsrr() to partially valid email addresses can be found in the user comments section in the PHP docs. This is handy for catching those occasional folks who think their email address is �joeuser@wwwphp.net� instead of �joeuser@php.net�.

    31. If you�re using PHP 5 with MySQL 4.1 or above, consider ditching the mysql_* functions for the improved mysqli_* functions. One nice feature is that you can use prepared statements, which may speed up queries if you maintain a database-intensive website. Some benchmarks.

    32. Learn to love the ternary operator.

    33. If you get the feeling that you might be reinventing the wheel during a project, check PEAR before you write another line. PEAR is a great resource that many PHP developers are aware of, yet many more are not. It�s an online repository containing over 400 reusable snippets that can be dropped right into your PHP application. Unless your project is trully unique, you ought to be able to find a PEAR package that saves at least a little time. (Also see PECL)

    34. Automatically print a nicely formatted copy of a page�s source code with highlight_file().This function is handy for when you need to ask for some assistance with a script in a messageboard, IRC, etc. Obviously, some care must be taken not to accidently show your source when it contains DB connection information, passwords, etc.

    35. Prevent potentially sensitive error messages from being shown to users with the error_reporting(0) function. Ideally error reporting should be completely disabled on a production server from within php.ini. However if you�re on a shared webhost and you aren�t given your own php.ini, then your best bet is to add error_reporting(0); as the first line in each of your scripts (or use it with require_once().) This will prevent potentially sensitive SQL queries and path names from being displayed if things go awry.

    36. Use gzcompress() and gzuncompress() to transparently compress/decompress large strings before storing them in a database. These built-in functions use the gzip algorithm and can compress plaintext up to 90%. I use these functions almost everytime I read/write to a BLOB field within PHP. The only exception is when I need full text indexing capabilities.

    37. Return multiple values from a function with �by reference� parameters. Like the ternary operator, most PHP developers who come from a more formalized programming background already know this one. However, those who�s background is more HTML than Pascal, probably have wondered at one time �how do I get multiple values back from a function I wrote, even though I can only use one return value?� The answer is that you precede a variable with �&� and use it �by reference� instead of �by value�.

    38. Fully understand �magic quotes� and the dangers of SQL injection. I�m hoping that most developers reading this are already familiar with SQL injection. However, I list it here because it�s absolutely critical to understand. If you�ve never heard the term before, spend the entire rest of the day googling and reading.

    39. 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 a 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.

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

    41. Excellent Article about optimizing php by John Lim http://phplens.com/lens/php-book/optimizing-debugging-php.php
     
    DarkMindZ, Dec 28, 2007 IP
  10. Aragorn

    Aragorn Peon

    Messages:
    1,491
    Likes Received:
    72
    Best Answers:
    1
    Trophy Points:
    0
    #10
    Nice list DarkMindZ. Thanks
     
    Aragorn, Feb 4, 2008 IP
  11. kendo1979

    kendo1979 Peon

    Messages:
    208
    Likes Received:
    1
    Best Answers:
    0
    Trophy Points:
    0
    #11
    thanks DarkMindz
     
    kendo1979, Feb 4, 2008 IP
  12. ravi72194

    ravi72194 Banned

    Messages:
    270
    Likes Received:
    4
    Best Answers:
    0
    Trophy Points:
    0
    #12
    thnx mr DarkMindz for the useful information about how to optimise php script...
     
    ravi72194, Jul 12, 2008 IP
  13. genetrix

    genetrix Banned

    Messages:
    400
    Likes Received:
    5
    Best Answers:
    0
    Trophy Points:
    0
    #13
    Code in object oriented method !!!!
     
    genetrix, Jul 12, 2008 IP
  14. mlkshake

    mlkshake Peon

    Messages:
    73
    Likes Received:
    2
    Best Answers:
    0
    Trophy Points:
    0
    #14
    Please note that a lot of these methods for improving the speed are only minuscule and most are premature over-optimizations.

    You can save a lot of time by reducing calls to functions and db.
     
    mlkshake, Jul 12, 2008 IP
  15. clinton

    clinton Well-Known Member

    Messages:
    2,166
    Likes Received:
    44
    Best Answers:
    0
    Trophy Points:
    110
    #15
    Finding ways to optimize loops and sql queries is a biggy
     
    clinton, Jul 12, 2008 IP
  16. Danltn

    Danltn Well-Known Member

    Messages:
    679
    Likes Received:
    36
    Best Answers:
    0
    Trophy Points:
    120
    #16
    What?

    That's MUCH worse than procedural PHP for the server load.
     
    Danltn, Jul 13, 2008 IP
  17. clinton

    clinton Well-Known Member

    Messages:
    2,166
    Likes Received:
    44
    Best Answers:
    0
    Trophy Points:
    110
    #17
    I agree, but OOP is still way better in general.
     
    clinton, Jul 13, 2008 IP
  18. Danltn

    Danltn Well-Known Member

    Messages:
    679
    Likes Received:
    36
    Best Answers:
    0
    Trophy Points:
    120
    #18
    Yeah, OOP is nicer - but the overhead from it is pretty large. :eek:
     
    Danltn, Jul 13, 2008 IP
  19. clinton

    clinton Well-Known Member

    Messages:
    2,166
    Likes Received:
    44
    Best Answers:
    0
    Trophy Points:
    110
    #19
    Once again, I agree. However speed can't always be the #1 priority. Code theory has its place one the top.
     
    clinton, Jul 13, 2008 IP
  20. revvi

    revvi Peon

    Messages:
    58
    Likes Received:
    1
    Best Answers:
    0
    Trophy Points:
    0
    #20
    After you follow some great tips from DarkMindz, you can improve further by using php optimizer such as eaccelerator, Zend Guard, ioncube, etc.
    Last time I use eaccelerator to compile it in special bytecode (PHP4 scripts) and use caching, thus it could gain performance couple times faster. For php5 I think you can use others such as Zend Guard to compile (and encrypt) the script. The reason is to reduce overhead compilation for every script whenever it is called by the web users.

    Please note : the term compile in PHP does not mean compile it to native code. it is just interpreting the code.
     
    revvi, Jul 13, 2008 IP