You are on page 1of 59

Performance Tuning PHP

Welcome!

Performance Tuning PHP

2005-05-29

0

Performance Tuning PHP
January 23th 2004. Vancouver, Canada Ilia Alshanetsky http://talks.php.net/
© Copyright 2004 Ilia Alshanetsky

http://talks.php.net/show/perf_tunning/ [5/29/2005 3:48:38 PM]

Performance Tuning PHP

Compiling: CFLAGS

Performance Tuning PHP

2005-05-29

1

The first step to tuning PHP begins with compiling an optimized version of PHP.
q q

q

• Enable all compiler optimizations with -O3 • Make the compiler tune the code to your CPU via -march -mcpu Use Caution • Try to make the compiler use CPU specific features -msse -mmmx mfpmath=sse

Revised Build Procedure

export CFLAGS="-O3 -msse -mmmx -march=pentium3 -mcpu=pentium3 -funroll-loops mfpmath=sse" ./configure make make install

http://talks.php.net/show/perf_tunning/1 [5/29/2005 3:48:42 PM]

Performance Tuning PHP

Compile what you need

Performance Tuning PHP

2005-05-29

2

Avoid useless bloat and compile only the extensions you need. Extensions that are rarely used, should be compiled as shared modules and loaded by the few scripts requiring them. --disable-all is your friend.

http://talks.php.net/show/perf_tunning/2 [5/29/2005 3:48:45 PM]

Performance Tuning PHP

Static vs Dynamic

Performance Tuning PHP

2005-05-29

3

For maximum performance compile PHP statically into apache (up to 20% speed increase) Static Compile of PHP
# PHP ./configure --with-apache=/path/to/apache_source # Apache ./configure --activate-module=src/modules/php4/libphp4.a

Increased speed comes at a cost of a slightly longer installation procedure, requiring Apache recompile every time PHP is upgraded.

http://talks.php.net/show/perf_tunning/3 [5/29/2005 3:48:47 PM]

Performance Tuning PHP

Strip your binaries

Performance Tuning PHP

2005-05-29

4

Eliminate waste by removing symbols from object files using strip utility.

Saves disk space and more importantly memory needed to load the library or run the binary. In case of PHP makes the binary or Apache library 20-30% smaller.

http://talks.php.net/show/perf_tunning/4 [5/29/2005 3:48:49 PM]

Performance Tuning PHP

PHP Configuration (php.ini)

Performance Tuning PHP

2005-05-29

5

PHP configuration directives can have significant impact on performance of PHP applications.
q q

• Make sure that register_globals is disabled (default since 4.2.0) • Disable magic_quotes_* directives.
q

• make sure your applications will escape input when necessary

q q q

• Turn off expose_php • Turn off register_argc_argv for non-cli SAPIs • Unless absolutely necessary do not enable always_populate_raw_post_data

http://talks.php.net/show/perf_tunning/5 [5/29/2005 3:48:51 PM]

Performance Tuning PHP

PHP Configuration Cont.

Performance Tuning PHP

2005-05-29

6

For non-persistent SAPIs like CLI prevent long searches for php.ini, by placing the file where PHP would look for it first. PHP CLI
/usr/local/lib/php-cli.ini

PHP CGI
/usr/local/lib/php-cgi-fcgi.ini or ./php-cgi-fcgi.ini

http://talks.php.net/show/perf_tunning/6 [5/29/2005 3:48:53 PM]

Performance Tuning PHP

Apache Configuration

Performance Tuning PHP

2005-05-29

7

Since the webserver plays an important part in the request serving process, it is important to tune it. A big part of this is the Apache child creation process.
q q

q

q

• StartServers set to avg. # of requests you'd expect. • MaxSpareServers keep this number high, to allow Apache to gracefully handle traffic spikes. • MaxClients keep this number at about 2/5 of the maximum processes your server can handle. • MaxRequestsPerChild ideally unlimited (0), but practically should be limited to a large number.

http://talks.php.net/show/perf_tunning/7 [5/29/2005 3:48:56 PM]

Performance Tuning PHP

Apache Configuration Cont.

Performance Tuning PHP

2005-05-29

8

Reducing File IO
q q q

q q q

• Keep DirectoryIndex file list as short as possible. • Whenever possible disable .htaccess via AllowOverride none • Use Options FollowSymLinks to simplify file access process in Apache • Avoid using mod_rewrite or at least complex regexs • If logs are unnecessary disable them. • If logging is a must, log everything to 1 file, and break it up during analysis stage.

http://talks.php.net/show/perf_tunning/8 [5/29/2005 3:48:58 PM]

Performance Tuning PHP

Apache Configuration Cont.

Performance Tuning PHP

2005-05-29

9

Eliminate Expensive System Calls
q q

q

• Do not enable ExtendedStatus (prevents 2 calls to timing functions per request). • For Deny/Allow rules use IPs rather then domains. (prevents superfluous DNS lookups). • Do not enable HostnameLookups (DNS is slow).
q

• This can be done during log analysis when speed is not an issue.

q

• Keep ServerSignature off (do not sent Apache identification string)

http://talks.php.net/show/perf_tunning/9 [5/29/2005 3:49:00 PM]

Performance Tuning PHP

KeepAlive

Performance Tuning PHP

2005-05-29

10

In theory KeepAlive is supposed to make things faster, however if not used carefully it can cripple the server.
q

• Set KeepAlive timeout, KeepAliveTimeout as low as possible.

If the server is only serving dynamic requests, disable KeepAlive.

http://talks.php.net/show/perf_tunning/10 [5/29/2005 3:49:03 PM]

Performance Tuning PHP

lingerd

Performance Tuning PHP

2005-05-29

11

Lingerd is a daemon (service) designed to take over the job of properly closing network connections from an http server like Apache. Because of some technical complications in the way TCP/IP and HTTP work, each Apache process currently wastes a lot of time "lingering" on client connections, after the page has been generated and sent. Lingerd takes over this job, leaving the Apache process immediately free to handle a new connection. As a result, Lingerd makes it possible to serve the same load using considerably fewer Apache processes. Warning: will only work (properly) if KeepAlive is disabled.

http://talks.php.net/show/perf_tunning/11 [5/29/2005 3:49:05 PM]

Performance Tuning PHP

Optimizing Content Serving

Performance Tuning PHP

2005-05-29

12

Virtually any webpage is the combination of dynamic (php) and static content (images, CSS, JavaScript, etc...) For maximum performance it is best to separate the serving of dynamic and static content.

Benefits
q q q

q

• Ability to disable KeepAlive for server handling dynamic data. • Simpler and Faster serving numerous static requests. • Allow more complex configuration (.htaccess, mod_rewrite) for dynamic data without affecting static content • Easy distribution of the content serving load across servers.

http://talks.php.net/show/perf_tunning/12 [5/29/2005 3:49:07 PM]

Performance Tuning PHP

Static Content Web Servers

Performance Tuning PHP

2005-05-29

13

Web Servers ideal for serving static requests
TUX - kernel-based web server
q

• Virtual Host support.

thttpd - tiny/turbo/throttling HTTP server
q q

• Non-blocking I/O is good. • Throttling capabilities.

http://talks.php.net/show/perf_tunning/13 [5/29/2005 3:49:09 PM]

Performance Tuning PHP

OPcode Caching

Performance Tuning PHP

2005-05-29

14

The first step in the script execution is the conversion of said script into a series instructions (opcodes), which the Zend Engine can understand and run.

Since scripts rarely change, an obvious optimization is to cache the opcodes so that the scripts do not need to be parsed every time.

http://talks.php.net/show/perf_tunning/14 [5/29/2005 3:49:11 PM]

Performance Tuning PHP

OPcode Caching Cont.

Performance Tuning PHP

2005-05-29

15

http://talks.php.net/show/perf_tunning/15 [5/29/2005 3:49:14 PM]

Performance Tuning PHP

OPcode Cache Benefits

Performance Tuning PHP

2005-05-29

16

q

• Script parsing performed only once. • Significant reduction in FileIO. • Faster execution, thanks to optimized opcodes. • Elimination of certain function calls by the optimizer.

q

q

q

http://talks.php.net/show/perf_tunning/16 [5/29/2005 3:49:16 PM]

Performance Tuning PHP

Cache Implementations
q

Performance Tuning PHP

2005-05-29

17

q

q

q

• Turck MMCache (GPL) q • Implements many features beyond opcode caching. q • Development halted. • APC (PHP) q • Slow, but steady progress. q • Weak optimizer. • ionCube PHP Accelerator q • It works, but no new development in past year. q • Free, but closed source. • Zend Cache (Proprietary) q • Implements many features beyond opcode caching. q • $$$

http://talks.php.net/show/perf_tunning/17 [5/29/2005 3:49:18 PM]

Performance Tuning PHP

Cache Benchmarks

Performance Tuning PHP

2005-05-29

18

http://talks.php.net/show/perf_tunning/18 [5/29/2005 3:49:21 PM]

Performance Tuning PHP

Content Caching

Performance Tuning PHP

2005-05-29

19

Often enough output of PHP scripts can remain static for an extended period of time. In these cases, certain actions can be eliminated, resulting in a faster script execution.

Pre-generation
When the content changes, generate static versions of the affected pages, taking PHP out of the equation completely.

On demand
Same as pre-generation, only the content is not generated until the 1st request for the specified content arrives.

http://talks.php.net/show/perf_tunning/19 [5/29/2005 3:49:23 PM]

Performance Tuning PHP

Content Caching in PHP

Performance Tuning PHP

2005-05-29

20

<?php function cache_start() { global $cache_file_name, $age; // a superbly creative way for creating cache files $cache_file_name = __FILE__ . '_cache'; // default cache age if (empty($age)) $age = 600; // check if cache exists and if the cached data is still valid if (@filemtime($cache_file_name) + $age > time()) { // Yey! cache hit, output cached data and exit readfile($cache_file_name); unset($cache_file_name); exit; } // nothing in cache or cache is too old ob_start(); } function cache_end()
http://talks.php.net/show/perf_tunning/20 (1 of 2) [5/29/2005 3:49:25 PM]

Performance Tuning PHP

{ global $cache_file_name; // nothing to do if (empty($cache_file_name)) return; // fetch output of the script $str = ob_get_clean(); // output data to the user, so they don't need to wait // for the cache writing to complete echo $str; // write to cache fwrite(fopen($cache_file_name.'_tmp', "w"), $str); // atomic write rename($cache_file_name.'_tmp', $cache_file_name); } cache_start(); // set cache termination code as the exit handler // this way we don't need to modify the script register_shutdown_function("cache_end"); ?>

http://talks.php.net/show/perf_tunning/20 (2 of 2) [5/29/2005 3:49:25 PM]

Performance Tuning PHP

Content Caching in PHP Cont.

Performance Tuning PHP

2005-05-29

21

<?php require "./cache.php"; // our cache code // Simple guestbook script. $db = new sqlite_db("gb.sqlite"); $r = $db->array_query("SELECT * FROM guestbook", SQLITE_ASSOC); foreach ($r as $row) { echo $r->user . ' wrote on ' . date("Ymd", $r->date) . ":<br />\n"; echo $r->message . "<hr /><hr />"; } ?>

Implementing cache without modifying the script
# Add to .htaccess php_value auto_prepend_file "/path/to/cache.php" # Or to virtual host entry in httpd.conf php_admin_value auto_prepend_file "/path/to/cache.php"

http://talks.php.net/show/perf_tunning/21 [5/29/2005 3:49:27 PM]

Performance Tuning PHP

Better Content Caching

Performance Tuning PHP

2005-05-29

22

As nice as PHP caching is, it is still slow, and who wants to spend time implementing it?
Fortunately, both Zend and MMcache developers have realized this need and developed a content caching mechanism into their PHP acceleration packages.
MMCache Content Cache
<?php mmcache_cache_page(__FILE__, 600); // MMcache cache // Simple guestbook script. $db = new sqlite_db("gb.sqlite"); $r = $db->array_query("SELECT * FROM guestbook", SQLITE_ASSOC); foreach ($r as $row) { echo $r->user . ' wrote on ' . date("Ymd", $r->date) . ":<br />\n"; echo $r->message . "<hr /><hr />"; } ?>

http://talks.php.net/show/perf_tunning/22 [5/29/2005 3:49:29 PM]

Performance Tuning PHP

Why is it better?

Performance Tuning PHP

2005-05-29

23

q

• Faster (C is faster PHP). • Can easily store cache in memory or disk or both. • Better atomicity. • Supports zlib compression for cached pages. • Bypasses PHP completely. • No need to write/test/debug any code.

q

q

q

q

q

http://talks.php.net/show/perf_tunning/23 [5/29/2005 3:49:31 PM]

Performance Tuning PHP

Partial Caching

Performance Tuning PHP

2005-05-29

24

I'd like to use caching, but my content is completely dynamic and cannot be time delayed. LIES! LIES! LIES! Even the most dynamic pages, often have static elements generated by PHP. Partial caching can accelerate the page generation by caching the static portions of otherwise dynamic pages.

http://talks.php.net/show/perf_tunning/24 [5/29/2005 3:49:33 PM]

Performance Tuning PHP

Partial Caching in Action

Performance Tuning PHP

2005-05-29

25

<?php // Authenticates a user and stores their id inside $uid require "./user_auth.inc.php"; function header() { if ($uid) echo "Welcome {$GLOBALS['user_nick']}"; echo rest_of_header(); } function footer() { if ($uid) echo "Logout: <a href='/logout.php'>{$GLOBALS['user_nick']}</a>"; echo rest_of_footer(); } // cache the output of the header function // we append $uid to they key to ensure each user has their own // non conflicting entry. mmcache_cache_output(__FILE__ . $uid, 'header();', 60 * 24); // rest of the dynamic page
http://talks.php.net/show/perf_tunning/25 (1 of 2) [5/29/2005 3:49:35 PM]

Performance Tuning PHP

// cache the output of the footer for 24 minutes (avg. session length) mmcache_cache_output(__FILE__ . $uid, 'footer();', 60 * 24); ?>

http://talks.php.net/show/perf_tunning/25 (2 of 2) [5/29/2005 3:49:35 PM]

Performance Tuning PHP

Content Reduction

Performance Tuning PHP

2005-05-29

26

One way to make pages appear faster is to reduce the amount of data that needs to be sent.

Benefits of Content Reduction
q q

q

• Less data to send, leads to smaller bandwidth bill. • Pages appear faster for the users, especially those on slower connections. • Less network IO, frees up server processes faster.

http://talks.php.net/show/perf_tunning/26 [5/29/2005 3:49:38 PM]

Performance Tuning PHP

Content Reduction: Compression

Performance Tuning PHP

2005-05-29

27

The easiest way to reduce amount of sent data is by compressing it.

Advantages
q q q

• Text output drastically reduced. • Requires no or very little modification to the code. • Supported by majority of modern browsers.

Disadvantages
q q

• May increase CPU load by up to 10% • Some browsers claim to support it, but really don't.

http://talks.php.net/show/perf_tunning/27 [5/29/2005 3:49:40 PM]

Performance Tuning PHP

Content Reduction: CSS

Performance Tuning PHP

2005-05-29

28

Another way to reduce content, is to replace bulky legacy HTML elements with CSS.

Advantages
q q q q

• 20-30% smaller pages. • CSS can be moved to static files and be served independently. • In some cases makes the browser render page faster. • More flexible layout.

Disadvantages
q q q

• Can be A LOT of manual labor. • Older browsers (Netscape 4.0) do not support CSS. • Some CSS is rendered differently or is unsupported all together.

http://talks.php.net/show/perf_tunning/28 [5/29/2005 3:49:42 PM]

Performance Tuning PHP

Content Reduction: Compacting

Performance Tuning PHP

2005-05-29

29

HTML contains a large quantity of useless data such as whitespace, comments etc... that is normally used to make the output readable to the developers. In production no one other then the browser will be reading the HTML we can use the tidy extension to strip all the unnecessary bits.

Advantages
q q

• 10-30% smaller pages. • While compressing HTML can fix HTML bugs.

Disadvantages
q q

• Requires Tidy extension. • CPU costs make this useful only if the output is cached.

http://talks.php.net/show/perf_tunning/29 [5/29/2005 3:49:44 PM]

Performance Tuning PHP

Tidy Example
Compacting Tidy Config
indent: no hide-endtags: yes char-encoding: ascii word-2000: yes clean: yes bare: yes show-errors: 0 show-warnings: no quiet: yes drop-proprietary-attributes: yes hide-comments: yes wrap: 0

Performance Tuning PHP

2005-05-29

30

PHP script bit
<?php ini_set("tidy.default_config", "/path/to/compact_tidy.cfg"); ini_set("tidy.clean_output", 1); ?>
http://talks.php.net/show/perf_tunning/30 [5/29/2005 3:49:46 PM]

Performance Tuning PHP

File IO

Performance Tuning PHP

2005-05-29

31

Most PHP scripts perform File IO operations, whether it be inclusion of scripts or opening or writing to files. One common mistake made by developers often makes these operations much slower then necessary.

How NOT to open files
<?php include "file.php"; ?>
http://talks.php.net/show/perf_tunning/31 [5/29/2005 3:49:47 PM]

Performance Tuning PHP

File IO Cont.

Performance Tuning PHP

2005-05-29

32

Always use full path file path when opening files, to avoid expensive normalization of the file's path.

<?php include "/path/to/file.php"; // or include "./file.php"; ?>
http://talks.php.net/show/perf_tunning/32 (1 of 2) [5/29/2005 3:49:49 PM]

Performance Tuning PHP

This is very important even if you use opcode cache, since the paths of includes and normal files will still need to be resolved.

http://talks.php.net/show/perf_tunning/32 (2 of 2) [5/29/2005 3:49:49 PM]

Performance Tuning PHP

RAM Disk

Performance Tuning PHP

2005-05-29

33

One way to accelerate File IO operations is by moving the files to a RAM disk. On Linux this is extremely simple todo using via tmpfs. tmpfs acceleration
# Speed Up /tmp Directory mount --bind -ttmpfs /tmp /tmp # Accelerate Scripts Directory mount --bind -ttmpfs /home/webroot /home/webroot

http://talks.php.net/show/perf_tunning/33 [5/29/2005 3:49:51 PM]

Performance Tuning PHP

RAM Disk Cont.

Performance Tuning PHP

2005-05-29

34

Advantages
q q

• Significant improvement in all File IO operations. • Easy to use.

Disadvantages
q

• Can end up using A LOT of memory.

http://talks.php.net/show/perf_tunning/34 [5/29/2005 3:49:53 PM]

Performance Tuning PHP

Sessions

Performance Tuning PHP

2005-05-29

35

Common element of various PHP scripts are sessions.

Generic Session Optimizations
q q q

q q q

• Don't use session.auto_start. • Do not enable session.use_trans_sid • Whenever possible set session.cache_limiter to private_no_expire • Assign each user (vhost) it's own sessions directory. • For large sites consider using session.save_path = "N;/path" • If possible avoid automatic garbage collection.

http://talks.php.net/show/perf_tunning/35 [5/29/2005 3:49:55 PM]

Performance Tuning PHP

Sessions Cont.

Performance Tuning PHP

2005-05-29

36

The surest way to accelerate sessions is by moving away from the files session handler to a memory based one.

Memory Session Handlers
q

q

q

• tmpfs q • mount the session directory as a RAM disk. q • not available on all OSes • --with-mm q • available with every PHP version. q • not thread-safe • mmcache q • very fast q • work on virtually all OSes and is thread-safe q • you need mmcache

http://talks.php.net/show/perf_tunning/36 [5/29/2005 3:49:57 PM]

Performance Tuning PHP

SQL

Performance Tuning PHP

2005-05-29

37

Virtually every script uses some database system. How it is used can be the difference between a fast script and an extremely slow one. All optimizations can be for naught if the SQL queries executed are slow.

http://talks.php.net/show/perf_tunning/37 [5/29/2005 3:50:00 PM]

Performance Tuning PHP

SQL: Explain

Performance Tuning PHP

2005-05-29

38

Always use EXPLAIN to analyze your queries to determine if they use proper indexes.
Slow Query

EXPLAIN select * from mm_users where login LIKE '%ilia%'; +----------+------+---------------+------+---------+------+-------+------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +----------+------+---------------+------+---------+------+-------+------------+ | mm_users | ALL | NULL | NULL | NULL | NULL | 27506 | where used | +----------+------+---------------+------+---------+------+-------+------------+

Fast Query

EXPLAIN select * from mm_users where login LIKE 'ilia%'; +----------+-------+---------------+-------+---------+------+------+-----------+ | table | type | possible_keys | key | key_len | ref | rows |
http://talks.php.net/show/perf_tunning/38 (1 of 2) [5/29/2005 3:50:02 PM]

Performance Tuning PHP

Extra | +----------+-------+---------------+-------+---------+------+------+-----------+ | mm_users | range | login | login | 50 | NULL | 2 | where used | +----------+-------+---------------+-------+---------+------+------+-----------+

http://talks.php.net/show/perf_tunning/38 (2 of 2) [5/29/2005 3:50:02 PM]

Performance Tuning PHP

SQL: Query Chaining

Performance Tuning PHP

2005-05-29

39

Executing one query at a time is boring (and slow), chain them and execute many queries at once.
Query Chaining
<?php // Slow Approach for ($i = 0; $i < 10; $i++) mysql_query("INSERT INTO foo VALUES({$i})"); // Faster MySQL/SQLite Specific approach $query = "INSERT INTO foo VALUES"; $query = "(" . implode("),(", array_keys(array_fill(0, 10, 1))) . ")"; // INSERT INTO foo VALUES (0), (1), (2) ... mysql_query($query); // Query Chaining // for DBs that support it PostgreSQL, MSSQL, SQLite, MySQL 4.0+ $query = ''; for ($i = 0; $i < 10; $i++) $query .= "INSERT INTO foo VALUES({$i});"; mysql_query($query);
http://talks.php.net/show/perf_tunning/39 (1 of 2) [5/29/2005 3:50:04 PM]

Performance Tuning PHP

?>

http://talks.php.net/show/perf_tunning/39 (2 of 2) [5/29/2005 3:50:04 PM]

Performance Tuning PHP

SQL: Avoiding Locks

Performance Tuning PHP

2005-05-29

40

To ensure data integrity in certain situations you will need to use locks. However, overuse of locks or improper implementation can severely hinder the performance of your application.
q q q

• If supported, whenever possible use row level locks instead of table locks. • When using table locks, try to lock as few tables as possible. • Whenever possible avoid locks all together.

http://talks.php.net/show/perf_tunning/40 [5/29/2005 3:50:07 PM]

Performance Tuning PHP

SQL: MySQL 4.0

Performance Tuning PHP

2005-05-29

41

If you are using MySQL 3.23.X, consider switching to MySQL 4.0.

Performance Advantages
q q q q

• Query Cache • Sub-Queries (as of 4.0.4) • Faster bulk inserts • Improved FULLTEXT

http://talks.php.net/show/perf_tunning/41 [5/29/2005 3:50:08 PM]

Performance Tuning PHP

SQL: Joins

Performance Tuning PHP

2005-05-29

42

Usage of joins allows simplification & acceleration of the script by moving portions of the logic to the database engine.
<?php // slow joinless approach $a = sqlite_fetch_single($db, "SELECT id FROM foo WHERE name='ilia'"); $b = sqlite_array_query($db, "SELECT * FROM bar WHERE id={$a}"); // Fast Join implementation $b = sqlite_array_query($db, "SELECT b.* FROM foo f INNER JOIN bar b ON f.id=b.id WHERE f.name='ilia'"); ?>

Join Gotchas
q q

• Unoptimized joins can be VERY slow. • Internal (read) lock on all tables involved.

http://talks.php.net/show/perf_tunning/42 [5/29/2005 3:50:11 PM]

Performance Tuning PHP

SQL: Sub-queries

Performance Tuning PHP

2005-05-29

43

Like Joins, Sub-queries can be used to move some of the logic from PHP into the database engine.
<?php $b = sqlite_array_query($db, "SELECT * FROM bar WHERE id=(SELECT id FROM foo WHERE name='ilia')"); ?>

In MySQL, the full support for sub-queries starts from version 4.1 In many instances it is better to use Joins rather then sub-queries.

http://talks.php.net/show/perf_tunning/43 [5/29/2005 3:50:13 PM]

Performance Tuning PHP

SQL: Temporary Tables

Performance Tuning PHP

2005-05-29

44

Temporary tables are memory buffers that can be used as in between steps for data retrieval, to avoid complex (and slow) PHP logic.
<?php // Quickly fetch the ids of needed messages mysql_query("CREATE TEMPORARY TABLE mtmp AS SELECT id FROM msg WHERE thread_id={$_GET['th']} AND apr=1 ORDER BY id ASC LIMIT {$count}, {$_GET['start']}"); // Retrieve needed data by using the temporary table as base $result = mysql_query("SELECT * FROM mtmp mt INNER JOIN msg m ON m.id=mt.id INNER JOIN thread t ON m.thread_id=t.id INNER JOIN forum f ON t.forum_id=f.id LEFT JOIN users u ON m.poster_id=u.id LEFT JOIN level l ON u.level_id=l.id LEFT JOIN poll p ON m.poll_id=p.id LEFT JOIN poll_opt_track pot ON pot.poll_id=p.id
http://talks.php.net/show/perf_tunning/44 (1 of 2) [5/29/2005 3:50:15 PM]

Performance Tuning PHP

AND pot.user_id="._uid." ORDER BY m.id ASC"); ?>

http://talks.php.net/show/perf_tunning/44 (2 of 2) [5/29/2005 3:50:15 PM]

Performance Tuning PHP

SQL: Right Tool for the Job

Performance Tuning PHP

2005-05-29

45

It is important that you choose the right database system for your needs. An overly complex database system, who's features you do not use will only hinder performance. At the same time be cautious with overly simple database systems that lack features you may need.

http://talks.php.net/show/perf_tunning/45 [5/29/2005 3:50:20 PM]

Performance Tuning PHP

Regular Expressions

Performance Tuning PHP

2005-05-29

46

PHP being is often using for templating and as such often needs to manipulate strings, which is often done with Regular Expressions.

Unfortunately, the flexibility that makes regular expressions so useful, also makes them extremely slow.

http://talks.php.net/show/perf_tunning/46 [5/29/2005 3:50:22 PM]

Performance Tuning PHP

Regular Expressions Cont.

Performance Tuning PHP

2005-05-29

47

Significant speed gains can be made by replacing regular expression with one or more string functions offered by PHP.

Common Alternatives
q q q q

• Replacement - str_replace, substr_replace, strtr, etc... • Matching - strpos, stripos, strchr, strrchr, etc.. • Type Checking - ctype extension (enabled by default) • Comparison - strcmp, strncasecmp, etc...

http://talks.php.net/show/perf_tunning/47 [5/29/2005 3:50:24 PM]

Performance Tuning PHP

Regular Expressions Cont.

Performance Tuning PHP

2005-05-29

48

In some situations, regular expressions would take too long to replace. Now you need to decide which regular expression implementation you want ereg or PCRE.
q

q

• PCRE q • Much faster in most cases. q • UTF-8 support. q • Significantly greater functionality. • ereg q • Always available. q • Can operate on multi-byte strings w/mbstring extension.

http://talks.php.net/show/perf_tunning/48 [5/29/2005 3:50:26 PM]

Performance Tuning PHP

Type Conversion

Performance Tuning PHP

2005-05-29

49

PHP is a type less language, which can seamlessly manipulate variables containing any sort of data.
However, forgetting about the underlying types can make your application slow and potentially open to security vulnerabilities.
Forcing correct type via casting
<?php $_GET['n_entries'] = (int) $_GET['n_entries']; ?>

Type conversion prevents things like SQL injection due to unexpected input. It also optimizes the application by providing PHP with a type it expects, rather having to internally perform type conversions each time the variable is used.

http://talks.php.net/show/perf_tunning/49 [5/29/2005 3:50:28 PM]

Performance Tuning PHP

References Tricks
Optimize passing of large objects by passing them by reference (PHP 4).
<?php function display_function(&$obj) { ... } $obj = mysql_fetch_object($result); display_function($obj); ?>

Performance Tuning PHP

2005-05-29

50

When modifying complex or large variables inside a function/method.
<?php function template_apply(&$str) { $str = str_replace(..., ..., $str); } ?>

Simplify and Speed up access to large multi-dimensional arrays

http://talks.php.net/show/perf_tunning/50 (1 of 2) [5/29/2005 3:50:31 PM]

Performance Tuning PHP

<?php $foo =& $bar['foo']['bar']['test']; $foo['imp'] = implode(',', $foo); $foo['imp'] = addslashes($foo['imp']); ?>

http://talks.php.net/show/perf_tunning/50 (2 of 2) [5/29/2005 3:50:31 PM]

Performance Tuning PHP

Thank You

Performance Tuning PHP

2005-05-29

51

Online Resources
Turck MMcache: http://sourceforge.net/projects/turck-mmcache/ APC: http://pecl.php.net/apc Zend: http://www.zend.com lingerd: http://www.iagora.com/about/software/lingerd/ thttpd: http://www.acme.com/software/thttpd/

Contact Me
Ilia Alshanetsky ilia@php.net

http://talks.php.net/show/perf_tunning/51 [5/29/2005 3:50:33 PM]