SlideShare ist ein Scribd-Unternehmen logo
1 von 77
PHP & Performance
By: Ilia Alshanetsky
1
2
• This cycle happens
for every include
le, not just for the
"main" script.
• Compilation can
easily consume
more time than
execution.
PHP Script
Zend Compile
Zend Execute
@
include/require
method
function
call
2
Compiler/Opcode Caches
• Each PHP script is compiled only once for
each revision.
• Reduced File IO, opcodes are being read
from memory instead of being parsed from
disk.
• Opcodes can optimized for faster execution.
3
Quick Comparison
0
50
100
150
200
FUDforum
Smarty
phpMyAdmin
Stock PHP 4.4.0
APC
PHP Accelerator
eAccelerator
Zend Platform
4
5
• For absolute maximum performance, ensure that
all of the software is compiled to take advantage
of the available hardware.
• Enable all compiler optimizations with -O3
• Tune the code to your CPU via -march –mcpu
• CPU specific features -msse –mmmx
-mfpmath=sse
• Drop debug data -fomit-frame-pointer
export CFLAGS="-O3 -msse -mmmx -march=pentium3 
-mcpu=pentium3 -funroll-loops -mfpmath=sse 
-fomit-frame-pointer"
Compiler Optimizations
5
Web Server: File IO
✓ 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.
✓ If logs are
unnecessary disable
them.
✓ If logging is a must,
log everything to 1 file
and break it up during
the analysis stage.
6
7
• Syscall is function executed by the Kernel.
The goal is to minimize the number of these
calls needed to perform a request.
• Do not enable ExtendedStatus.
• For Deny/Allow rules use IPs rather then
domains.
• Do not enable HostnameLookups.
• Keep ServerSignature off
Web Server: Syscalls
7
8
• In theory KeepAlive is supposed to make
things faster, however if not used carefully
it can cripple the server.
• In Apache set KeepAlive timeout,
KeepAliveTimeout as low as possible.
Suggested value: 10 seconds.
• If the server is only serving dynamic
requests, disable KeepAlive all together.
Web Server: KeepAlive
8
9
• The goal is to pass off as much work to the kernel
as efciently as possible.
• Optimizes PHP to OS Communication
• Reduces Number Of System Calls
Matching Your IO Sizes
PHP Apache OS Client
9
10
• Efficient
• Flexible
• In your script, with ob_start()
• Everywhere, with output_buffering = On
• Improves browser’s rendering speed
PHP: Output Control
PHP Apache
10
Apache: Output Control
• The idea is to hand off entire page to the
kernel without blocking.
• Set SendBufferSize = PageSize
Apache OS
11
OS: Output Control
OS (Linux)
/proc/sys/net/ipv4/tcp_wmem
4096 16384 maxcontentsize
min default max
/proc/sys/net/ipv4/tcp_mem
(maxcontentsize * maxclients) / pagesize
✴ Be careful on low memory systems!
OS Client
12
13
• While Apache is great for dynamic requests,
static requests can be served WAY FASTER
by other web servers.
๏ lighttpd
๏ Boa
๏ Tux
๏ thttpd
• For static requests these servers are easily
300-400% faster then Apache 1 or 2.
Static Content Serving
13
Less Output == Faster
• Saves server bandwidth (saves $$ too).
• Reduces server resource usage (CPU/
Memory/Disk)
• Pages load faster for clients.
• Reduces network IO high traffic sites,
where it is the primary bottleneck in
most cases.
14
15
• Most browsers support content compression.
• Compressed pages are on average are 6-8 times smaller.
๏ Apache 1 (mod_gzip / mod_deflate)
๏ Apache 2 (mod_deflate)
๏ PHP
‣ From PHP configuration zlib.output_compression=1
‣ From inside the script ob_start(“ob_gzhandler”)
✴ Compression will utilize 3%-5% of CPU.
Content Compression
15
Content Reduction
• Use a post-
processor like
Tidy to
remove
formatting,
comments and
CCSify the
code.
<?php
$o = array("clean" => true,
"drop-proprietary-attributes" => true,
"drop-font-tags" => true,
"drop-empty-paras" => true,
"hide-comments" => true,
"join-classes" => true,
"join-styles" => true
);
$tidy = tidy_parse_file("php.html", $o);
tidy_clean_repair($tidy);
echo $tidy;
?>
16
17
➡ register_globals = Off **
➡ magic_quotes_gpc = Off
➡ expose_php = Off
➡ register_argc_argv = Off
➡ always_populate_raw_post_data = Off **
➡ session.use_trans_sid = Off **
➡ session.auto_start = Off **
➡ session.gc_divisor = 1000 or 10000
Tuning PHP Conguration
17
18
• Identify Bottlenecks
• Track Resource Usage
• Generate Call Trees
• Create Progress Tracking Data
Proling & Benchmarking
18
19
• Apache Bench
‣ ab utility bundled with Apache
• Siege
‣ http://www.joedog.org/JoeDog/Siege
• http_load (Excellent for latency tests)
‣ http://www.acme.com/software/http_load/
Testing Web Servers
19
Web Server Testing
Concurrency Level: 10
Time taken for tests: 0.265 seconds
Complete requests: 100
Failed requests: 0
Broken pipe errors: 0
Total transferred: 5077082 bytes
HTML transferred: 5061168 bytes
Requests per second: 377.36 [#/sec] (mean)
Time per request: 26.50 [ms] (mean)
Time per request: 2.65 [ms] (mean)
Transfer rate: 19158.80 [Kbytes/sec]
20
Latency Test
1000 fetches, 5 max parallel,
2.9648e+07 bytes,
in 0.813035 seconds
29648 mean bytes/connection
1229.96 fetches/sec,
3.64658e+07 bytes/sec
msecs/connect:
0.463202 mean, 12.082 max, 0.045 min
msecs/first-response:
3.12969 mean, 50.783 max, 0.811 min
HTTP response codes:
code 200 -- 1000
1 msec = 0.0001 seconds
21
22
• APD (Pure profiler)
‣ http://pecl.php.net/apd
• XDebug (Profiler & Debugger)
‣ http://xdebug.org/
• DBG (Profiler & Debugger)
‣ http://dd.cron.ru/dbg/
Proling PHP Code
22
Proling with APD
• Installation Steps
• pecl install apd
• Modify php.ini
zend_extension=apd.so
Zend Execute
APD Start
APD Finish
Process repeated for
every function/method call
23
24
• Profiling of a script starts from the point when the
apd_set_pprof_trace() function is called.
• All code executed prior, will not be profiled.
$parts = preg_split("!s!", "a b c");
function test(&$var) {
$var = base64_encode(trim($var));
}
apd_set_pprof_trace();
array_walk($parts, 'test');
✴ Use the auto_prepend_file php.ini setting to activate
profiling for an entire application.
Generating A Trace
24
Interpreting the Results
Real User System secs cumm.
%Time (excl/cumm) (excl/cumm) (excl/cumm) Calls call s/call Name
-----------------------------------------------------------------------------------------
82.4 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0007 0.0007 apd_set_pprof_trace
10.2 0.00 0.00 0.00 0.00 0.00 0.00 3 0.0000 0.0000 trim
4.3 0.00 0.00 0.00 0.00 0.00 0.00 3 0.0000 0.0000 base64_encode
1.9 0.00 0.00 0.00 0.00 0.00 0.00 3 0.0000 0.0000 test
0.6 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0000 0.0001 array_walk
0.6 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0000 0.0008 main
25
26
• Hard-drive is in most cases the slowest
part of the system, yet all the data
eventually comes from it.
• By adjust the drive configuration
parameters you can help your OS get
the most out of it.
Drive Tuning
26
27
• Use the hdparm utility to adjust
settings.
• -c1 - set IDE 32-bit I/O setting
• -d1 - enable DMA
• -u1 - enable IRQ unmasking
• -m16 - turn on multicount
• -X 34|66|100|133 - transfer mode
Drive Tuning Parameters
27
Validating Changes
Benchmark the affect of the changes using:
hdparm -tT /dev/[drive]
28
29
• One way to accelerate File IO operations is by
moving the les and directories to a RAM disk.
• On Linux this is extremely simple to do using via
tmpfs.
# Speed Up /tmp Directory
mount --bind -ttmpfs /tmp /tmp
# Accelerate Scripts Directory
mount --bind -ttmpfs /home/webroot /home/webroot
RAM Disk
29
30
• PHP’s session extension by default stores each
session inside a separate le.
• Many files in one directory reduce access speed.
➡ Assign each user their own session directory
➡ Split sessions into multiple directories
session.save_path = "N;/path"
Session Storage
30
Session Storage Alternatives
• File system is slow, lets use memory
• mm - native shared memory storage
• apc - use APC’s store/fetch/delete
• memcache - memory storage daemon
31
Now let’s tune PHP code
32
OOP Tips
• Always declare your static methods!
• Cleaner & Faster code
<?php
class bench {
    public function a() { return 1; }
    public static function b() { return 1; }
}
$s = microtime(1);
for ($i = 0; $i < 100000; $i++) bench::a();
$e = microtime(1);
echo "Dynamic Static Method: ".($e - $s)."n";
$s = microtime(1);
for ($i = 0; $i < 100000; $i++) bench::b();
$e = microtime(1);
echo "Declared Static Method: ".($e - $s)."n";
33
Speed Comparison
0
0.05
0.10
0.15
0.20
Declared Non-Declared
34
Use Class Constants
• Parsed at compile time, no execution
overhead.
• Faster lookups due to a smaller hash.
• “Namespacing” & shorter hash names.
• Cleaner code speeds up debugging ;-)
35
Avoid Magic
• Magic methods such as __get()/__set()
• Magic loading functions such as
__autoload()
• Dynamic methods via __call()
36
require_once() is once too many
lstat64("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=7368, ...}) = 0
lstat64("/tmp/a.php", {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
open("/tmp/a.php", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
fstat64(3, {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
lstat64("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=7368, ...}) = 0
lstat64("/tmp/a.php", {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
open("/tmp/a.php", O_RDONLY) = 3
fstat64(3, {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
fstat64(3, {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
<?php
require_once "./a.php";
require_once "./a.php";
37
• If you absolutely cannot avoid
require_once and include_once use full
paths.
• In PHP 5.2>= this will allow PHP to
avoid opening the le twice.
38
๏ php_version()
✓ PHP_VERSION constant
๏ php_uname(‘s’)
✓ PHP_OS constant
๏ php_sapi_name()
✓ PHP_SAPI constant
Avoid Pointless Function Calls
39
Quick Comparison
0
0.625
1.250
1.875
2.500
PHP_OS php_uname() php_uname(’s’)
0.04
2.08
1.88
40
Fastest Win32 Detection in the West
• Does not use functions
• Does not care about
WinXP, WinNT, Windows,
Windows98, NT 5.0, etc...
• Always available
$isWindows = 
DIRECTORY_SEPARATOR == '';
41
What time is it?
Rather then calling time(),
time() and time() again, use
$_SERVER[‘REQUEST_TIME’]
Provides a timestamp, with a
second precision, without any
function calls.
42
PCRE Slowdowns
$text = preg_replace( '/=?([^?]+)?/',
'=?iso-8859-1?', $origtext );
$text = preg_replace( 
'"/(n|t|rn|s)+/"', ' ', $origtext );
43
Use non-capturing patterns
• Placing ?: at the start of a sub-pattern makes it
non-capturing.
• This means PHP/PCRE does not need to
allocate memory to store the matched content
block.
$text = preg_replace( '/=?(?:[^?]+)?/',
'=?iso-8859-1?', $origtext );
$text = preg_replace( 
'"/(?:n|t|rn|s)+/"', ' ', $origtext );
44
End Result
0
8.75
17.50
26.25
35.00
30.92
26.38
Seconds
A 15% performance improvement, with
a 2 character change.
Capuring
Non-Capturing
45
If Possible Avoid Regex
<?php
// Slow
if (preg_match("!^foo_!i", "FoO_")) { }
// Much faster
if (!strncasecmp("foo_", "FoO_", 4)) { }
// Slow
if (preg_match("![a8f9]!", "sometext")) { }
// Faster
if (strpbrk("a8f9", "sometext")) { }
// Slow
if (preg_match("!string!i", "text")) {}
// Faster
if (stripos("text", "string") !== false) {} 
46
More Regex Avoidance
$text = preg_replace( "/n/", "n", $text);
In this case it would be simpler and to
mention faster to use a regular str_replace()
$text = str_replace( "/n/", "n", $text);
47
Speed Comparison
0
11.25
22.50
33.75
45.00
1 to 1 1 to 2 1 to 3 2 to 2
preg_replace str_replace strtr
48
Use strtr() Properly!
Any ideas on how we can make this code
10 times faster?
$rep = array( '-' => '*', '.' => '*' );
if ( sizeof( $globArr ) > 1 ) {
$glob = "-" . strtr( $globArr[1], $rep );
} else {
$glob = strtr( $globArr[0], $rep );
}
49
Use Strings!
Elimination of array operations speeds up
the code and simplies the internal work
in strtr() function.
if ( sizeof( $globArr ) > 1 ) {
$glob = "-" . strtr( $globArr[1], '-.', '**' );
} else {
$glob = strtr( $globArr[0], '-.', '**' );
}
0 15 30 45 60
4.29
55.70
Seconds
strtr(string)
strtr(array)
50
Don’t Replace When you
• Any replacement operation requires
memory, if only to store the “modified”
result.
• A quick strpos() to determine if any
replacement is actually needed can save
memory and improve performance!
51
Test Scenario
$s = microtime(1);
for ($i = 0; $i < 10000; $i++)
    str_replace('Ilia', 'Derick', $str);
$e = microtime(1);
echo "non-check (match): ".($e - $s)."n";
$s = microtime(1);
for ($i = 0; $i < 10000; $i++)
    if (strpos($str, 'Ilia') !== false)
        str_replace('Ilia', 'Derick', $str);
$e = microtime(1);
echo "check (match): ".($e - $s)."n";
$str is a PHP 5.2 news les, roughly 95kb in size.
no-match
match
01.753.505.257.00
6.76
1.88
6.75
4.34
regular w/check
52
@ operator is evil!
• The error blocking operator, is the most
expensive character in PHP’s alphabet.
• This seemingly innocuous operator
actually performs fairly intensive
operations in the background.
@action();
$old = ini_set(“error_reporting”, 0);
action();
ini_set(“error_reporting”, $old);
53
Better String Comparison
<?php
// The Good
if (!strncmp(PHP_OS, 'WIN', 3)) {
if (!strncasecmp(PHP_OS, 'WIN', 3)) {
// The Bad
if (substr(PHP_OS, 0, 3) == 'WIN') {
if (strtolower(substr(PHP_OS, 0, 3))) == 'win') {
// And The Ugly
if (preg_match('!^WIN!', PHP_OS)) {
if (preg_match('!^WIN!i', PHP_OS)) {
54
Quick Benchmark
0
5
10
15
20
8.67 9.59
13.07
10.42
8.73
13.29
13.06
15.71
strcmp()
substr()
PCRE
EREG
Case Sensetive Non-Case Sensetive
55
Comparing From An Offset
• As of PHP 5, you don’t need to substr()
string segments from non-start position to
compare them thanks to substr_compare().
if (substr($class, -15) != 'text')
/* == */
if (substr_compare($class, 'text', -15))
56
Don’t Mis-use Constants
One of my biggest pet-peeves in PHP is
this kind of nonsense:
$foo = array("bar"=>0);
$foo[bar] = 1;
57
Why is this bad?
๏ 1 strtolower
๏ 2 hash lookups
๏ E_NOTICE error message generated
๏ temporary string being created on the
fly.
58
Performance Check
$foo[bar] = 1; /* vs */ $foo['bar'] = 1;
0
6.25
12.50
18.75
25.00
15.52
16.70
21.35
2.50
2.70
3.07
3 chars
6 chars
17 charsconstant
string
700% difference on average!!!
59
Fix “harmless” error messages
‣ Each error results in:
๏ Generation of a complex error string
๏ Output to stdout/stderr
๏ Potential write to a file or syslog
๏ In pre-5.2 releases may leak memory
in some rare instances.
60
Simplify for() loop
Avoid function calls within for() loop
control blocks.
<?php
for ( $i = 1; $i < sizeof($array); $i++ ) {}
for ( $i = 0; $i < count($array); $i++ ) {}
for ( $i = 0; $i < strlen($string); $i++ ) {}
Otherwise function is called for every loop
iteration.
61
Speed Check
for ($j = 0; $j < strlen('foo'); $j++) {}
/* vs */
$c = strlen('foo'); for ($j = 0; $j < $c; $j++) {}
for ($j = 0; $j < count($_SERVER); $j++) {}
/* vs */
$c = count($_SERVER); for ($j = 0; $j < $c; $j++){}
0 0.4 0.8 1.2 1.6 2.0
0.21
1.53
0.11
0.42
count()
strlen()
Before
After
62
Don’t Re-invent the Wheel
• It is surprising how frequently people try
to re-invent the wheel.
• Now a days PHP has
✓ 2,700 functions
✓ 80 core extensions
✓ 154 PECL extensions
• Chances are what you need already exists!
63
Use Full File Paths
• While it is convenient(??) to do require
“foo.php” and have it work, internally
it leads to signicant overhead.
• Whenever possible you should use full
paths, that require no resolution in PHP.
64
The internals of le ops.
stat64("./b.php", {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
getcwd("/tmp", 4096) = 5
lstat64("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=18008, ...}) = 0
lstat64("/tmp/b.php", {st_mode=S_IFREG|0644, st_size=6, ...}) = 0
open("/tmp/b.php", O_RDONLY)
The issue can be further exasperated by
the use of include_path.
65
66
References can be used to simply & accelerate access
to multi-dimensional arrays.
Reference Tricks
$a['b']['c'] = array();
// slow 2 extra hash lookups per access
for($i = 0; $i < 5; $i++)
$a['b']['c'][$i] = $i;
// much faster reference based approach
$ref =& $a['b']['c'];
for($i = 0; $i < 5; $i++)
$ref[$i] = $i;
66
Optimization Myths
✦ Removing comments makes code faster
✦ Using “ is faster then ‘
✦ Passing things by-reference makes code
faster
✦ Objects make code faster
✦ Ternary ? : is faster then if () { } else {}
67
68
Caching is the recognition and exploitation of
the fact that most "dynamic" data does not
change every time you request it.
68
69
Most applications will end up using databases
for information storage. Improper use of this
resource can lead to significant and
continually increasing performance loss.
69
70
Most databases offers tools for analyzing
query execution.
EXPLAIN select * from 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 |
+----------+------+---------------+------+---------+------+-------+------------+
EXPLAIN select * from users where login LIKE 'ilia%';
+----------+-------+---------------+-------+---------+------+------+------------+
| table | type | possible_keys | key | key_len | ref | rows | Extra |
+----------+-------+---------------+-------+---------+------+------+------------+
| mm_users | range | login | login | 50 | NULL | 2 | where used |
+----------+-------+---------------+-------+---------+------+------+------------+
Check Your Queries
70
71
Rather then creating a column for every Boolean
option, you can pack 32 of them into a single integer
eld.
CREATE TABLE users (
is_active INT,
is_banned INT,
is_admin INT,
...
);
CREATE TABLE users (
user_opt INT,
...
);
user_opt & 1 // active
user_opt & 2 // banned
user_opt & 4 // admin
Bitwise Option Packing
71
72
• The simpler the code, the faster it runs,
it really is that simple.
• Syntactic sugar.
• Unnecessary wrappers.
• Wrapping one liners in functions.
• OO for the sake of OO.
KISS = Performance
72
Thank You For Listening!
• These slides
• http://www.ilia.ws/
• APC
• http://pecl.php.net/apc
• XDebug
• http://www.xdebug.org/
73
Optimizer (Why?)
• The opcodes generated by Zend
Engine are often inefcient.
• Some operations can be avoided
• A lot of temporary vars are not
necessary.
• Every compiler needs an
optimizer ;-)
i
74
Optimizer (How?)
PHP Script
Zend Compile
Zend Execute
@
OptimizerKinda Slow
75
What Can It Do?
• opt. heredoc
• print to echo
• GLOBALS[foo] to
foo
• inline known
constants
• eliminate NOP
• resolve partial file
paths.
• optionally inline
dene() calls
• 60+ function calls
with static values
resolved.
• Much more...
76
Any other ideas?
77

Weitere ähnliche Inhalte

Was ist angesagt?

Application Logging in the 21st century - 2014.key
Application Logging in the 21st century - 2014.keyApplication Logging in the 21st century - 2014.key
Application Logging in the 21st century - 2014.keyTim Bunce
 
Site Performance - From Pinto to Ferrari
Site Performance - From Pinto to FerrariSite Performance - From Pinto to Ferrari
Site Performance - From Pinto to FerrariJoseph Scott
 
PHP 7 new engine
PHP 7 new enginePHP 7 new engine
PHP 7 new enginejulien pauli
 
Tips for a Faster Website
Tips for a Faster WebsiteTips for a Faster Website
Tips for a Faster WebsiteRayed Alrashed
 
Perl at SkyCon'12
Perl at SkyCon'12Perl at SkyCon'12
Perl at SkyCon'12Tim Bunce
 
Perl Memory Use 201209
Perl Memory Use 201209Perl Memory Use 201209
Perl Memory Use 201209Tim Bunce
 
Php extensions workshop
Php extensions workshopPhp extensions workshop
Php extensions workshopjulien pauli
 
The Php Life Cycle
The Php Life CycleThe Php Life Cycle
The Php Life CycleXinchen Hui
 
Ansible is the simplest way to automate. MoldCamp, 2015
Ansible is the simplest way to automate. MoldCamp, 2015Ansible is the simplest way to automate. MoldCamp, 2015
Ansible is the simplest way to automate. MoldCamp, 2015Alex S
 
Caching and tuning fun for high scalability @ FrOSCon 2011
Caching and tuning fun for high scalability @ FrOSCon 2011Caching and tuning fun for high scalability @ FrOSCon 2011
Caching and tuning fun for high scalability @ FrOSCon 2011Wim Godden
 
IT Automation with Ansible
IT Automation with AnsibleIT Automation with Ansible
IT Automation with AnsibleRayed Alrashed
 
How to deploy node to production
How to deploy node to productionHow to deploy node to production
How to deploy node to productionSean Hess
 
Speed up web APIs with Expressive and Swoole (PHP Day 2018)
Speed up web APIs with Expressive and Swoole (PHP Day 2018) Speed up web APIs with Expressive and Swoole (PHP Day 2018)
Speed up web APIs with Expressive and Swoole (PHP Day 2018) Zend by Rogue Wave Software
 
Hadoop meet Rex(How to construct hadoop cluster with rex)
Hadoop meet Rex(How to construct hadoop cluster with rex)Hadoop meet Rex(How to construct hadoop cluster with rex)
Hadoop meet Rex(How to construct hadoop cluster with rex)Jun Hong Kim
 
The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6Wim Godden
 
What you need to remember when you upload to CPAN
What you need to remember when you upload to CPANWhat you need to remember when you upload to CPAN
What you need to remember when you upload to CPANcharsbar
 
Ansible presentation
Ansible presentationAnsible presentation
Ansible presentationKumar Y
 
Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Devel::NYTProf 2009-07 (OUTDATED, see 201008)Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Devel::NYTProf 2009-07 (OUTDATED, see 201008)Tim Bunce
 
Ansible - Introduction
Ansible - IntroductionAnsible - Introduction
Ansible - IntroductionStephane Manciot
 

Was ist angesagt? (20)

Application Logging in the 21st century - 2014.key
Application Logging in the 21st century - 2014.keyApplication Logging in the 21st century - 2014.key
Application Logging in the 21st century - 2014.key
 
Site Performance - From Pinto to Ferrari
Site Performance - From Pinto to FerrariSite Performance - From Pinto to Ferrari
Site Performance - From Pinto to Ferrari
 
PHP 7 new engine
PHP 7 new enginePHP 7 new engine
PHP 7 new engine
 
Tips for a Faster Website
Tips for a Faster WebsiteTips for a Faster Website
Tips for a Faster Website
 
Perl at SkyCon'12
Perl at SkyCon'12Perl at SkyCon'12
Perl at SkyCon'12
 
Perl Memory Use 201209
Perl Memory Use 201209Perl Memory Use 201209
Perl Memory Use 201209
 
Php extensions workshop
Php extensions workshopPhp extensions workshop
Php extensions workshop
 
The Php Life Cycle
The Php Life CycleThe Php Life Cycle
The Php Life Cycle
 
Ansible is the simplest way to automate. MoldCamp, 2015
Ansible is the simplest way to automate. MoldCamp, 2015Ansible is the simplest way to automate. MoldCamp, 2015
Ansible is the simplest way to automate. MoldCamp, 2015
 
Caching and tuning fun for high scalability @ FrOSCon 2011
Caching and tuning fun for high scalability @ FrOSCon 2011Caching and tuning fun for high scalability @ FrOSCon 2011
Caching and tuning fun for high scalability @ FrOSCon 2011
 
IT Automation with Ansible
IT Automation with AnsibleIT Automation with Ansible
IT Automation with Ansible
 
How to deploy node to production
How to deploy node to productionHow to deploy node to production
How to deploy node to production
 
Speed up web APIs with Expressive and Swoole (PHP Day 2018)
Speed up web APIs with Expressive and Swoole (PHP Day 2018) Speed up web APIs with Expressive and Swoole (PHP Day 2018)
Speed up web APIs with Expressive and Swoole (PHP Day 2018)
 
Ansible - Crash course
Ansible - Crash courseAnsible - Crash course
Ansible - Crash course
 
Hadoop meet Rex(How to construct hadoop cluster with rex)
Hadoop meet Rex(How to construct hadoop cluster with rex)Hadoop meet Rex(How to construct hadoop cluster with rex)
Hadoop meet Rex(How to construct hadoop cluster with rex)
 
The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6The why and how of moving to PHP 5.5/5.6
The why and how of moving to PHP 5.5/5.6
 
What you need to remember when you upload to CPAN
What you need to remember when you upload to CPANWhat you need to remember when you upload to CPAN
What you need to remember when you upload to CPAN
 
Ansible presentation
Ansible presentationAnsible presentation
Ansible presentation
 
Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Devel::NYTProf 2009-07 (OUTDATED, see 201008)Devel::NYTProf 2009-07 (OUTDATED, see 201008)
Devel::NYTProf 2009-07 (OUTDATED, see 201008)
 
Ansible - Introduction
Ansible - IntroductionAnsible - Introduction
Ansible - Introduction
 

Andere mochten auch

Temperature Cycling Tests
Temperature Cycling TestsTemperature Cycling Tests
Temperature Cycling TestsAnjar Bumi
 
الموهوبون..
الموهوبون..الموهوبون..
الموهوبون..anjo13
 
Tom jones
Tom jonesTom jones
Tom jonesamworsley
 
It innovations, impressions & implications-23-jan-2013 at mpste-mumbai
It innovations, impressions & implications-23-jan-2013 at mpste-mumbaiIt innovations, impressions & implications-23-jan-2013 at mpste-mumbai
It innovations, impressions & implications-23-jan-2013 at mpste-mumbaiSanjeev Deshmukh
 
Experience of-teaching -quality-mgmt-2010
Experience of-teaching -quality-mgmt-2010Experience of-teaching -quality-mgmt-2010
Experience of-teaching -quality-mgmt-2010Sanjeev Deshmukh
 
Qatar Outlook 2014 AAQ
Qatar Outlook 2014 AAQQatar Outlook 2014 AAQ
Qatar Outlook 2014 AAQAdel Abouhana
 
Nervous systemanatomy 60
Nervous systemanatomy 60Nervous systemanatomy 60
Nervous systemanatomy 60gallevy16
 
Gestor proyecto educativo_tic GRUPO COLROSARIO MALAGA
Gestor proyecto educativo_tic GRUPO  COLROSARIO MALAGAGestor proyecto educativo_tic GRUPO  COLROSARIO MALAGA
Gestor proyecto educativo_tic GRUPO COLROSARIO MALAGASaida Fiallo
 

Andere mochten auch (11)

Temperature Cycling Tests
Temperature Cycling TestsTemperature Cycling Tests
Temperature Cycling Tests
 
Imagineering Urban Spaces in Waterfronts. Research Showcase
Imagineering Urban Spaces in Waterfronts. Research ShowcaseImagineering Urban Spaces in Waterfronts. Research Showcase
Imagineering Urban Spaces in Waterfronts. Research Showcase
 
Excavator brochure
Excavator brochureExcavator brochure
Excavator brochure
 
الموهوبون..
الموهوبون..الموهوبون..
الموهوبون..
 
Tom jones
Tom jonesTom jones
Tom jones
 
It innovations, impressions & implications-23-jan-2013 at mpste-mumbai
It innovations, impressions & implications-23-jan-2013 at mpste-mumbaiIt innovations, impressions & implications-23-jan-2013 at mpste-mumbai
It innovations, impressions & implications-23-jan-2013 at mpste-mumbai
 
Experience of-teaching -quality-mgmt-2010
Experience of-teaching -quality-mgmt-2010Experience of-teaching -quality-mgmt-2010
Experience of-teaching -quality-mgmt-2010
 
Btsa (1)
Btsa (1)Btsa (1)
Btsa (1)
 
Qatar Outlook 2014 AAQ
Qatar Outlook 2014 AAQQatar Outlook 2014 AAQ
Qatar Outlook 2014 AAQ
 
Nervous systemanatomy 60
Nervous systemanatomy 60Nervous systemanatomy 60
Nervous systemanatomy 60
 
Gestor proyecto educativo_tic GRUPO COLROSARIO MALAGA
Gestor proyecto educativo_tic GRUPO  COLROSARIO MALAGAGestor proyecto educativo_tic GRUPO  COLROSARIO MALAGA
Gestor proyecto educativo_tic GRUPO COLROSARIO MALAGA
 

Ähnlich wie PHP & Performance

Caching with Memcached and APC
Caching with Memcached and APCCaching with Memcached and APC
Caching with Memcached and APCBen Ramsey
 
Caching and tuning fun for high scalability
Caching and tuning fun for high scalabilityCaching and tuning fun for high scalability
Caching and tuning fun for high scalabilityWim Godden
 
Caching and tuning fun for high scalability
Caching and tuning fun for high scalabilityCaching and tuning fun for high scalability
Caching and tuning fun for high scalabilityWim Godden
 
Php through the eyes of a hoster phpbnl11
Php through the eyes of a hoster phpbnl11Php through the eyes of a hoster phpbnl11
Php through the eyes of a hoster phpbnl11Combell NV
 
Bottom to Top Stack Optimization with LAMP
Bottom to Top Stack Optimization with LAMPBottom to Top Stack Optimization with LAMP
Bottom to Top Stack Optimization with LAMPkatzgrau
 
Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011CodeIgniter Conference
 
Securing Your Webserver By Pradeep Sharma
Securing Your Webserver By Pradeep SharmaSecuring Your Webserver By Pradeep Sharma
Securing Your Webserver By Pradeep SharmaOSSCube
 
PHP Performance with APC + Memcached
PHP Performance with APC + MemcachedPHP Performance with APC + Memcached
PHP Performance with APC + MemcachedFord AntiTrust
 
Apc presentation
Apc presentationApc presentation
Apc presentationguestef8544
 
Php through the eyes of a hoster confoo
Php through the eyes of a hoster confooPhp through the eyes of a hoster confoo
Php through the eyes of a hoster confooCombell NV
 
Heavy Web Optimization: Backend
Heavy Web Optimization: BackendHeavy Web Optimization: Backend
Heavy Web Optimization: BackendVþ Duy TuẼn
 
Php through the eyes of a hoster
Php through the eyes of a hosterPhp through the eyes of a hoster
Php through the eyes of a hosterCombell NV
 
Performance tuning with zend framework
Performance tuning with zend frameworkPerformance tuning with zend framework
Performance tuning with zend frameworkAlan Seiden
 
Zendcon scaling magento
Zendcon scaling magentoZendcon scaling magento
Zendcon scaling magentoMathew Beane
 
Caching and tuning fun for high scalability @ FOSDEM 2012
Caching and tuning fun for high scalability @ FOSDEM 2012Caching and tuning fun for high scalability @ FOSDEM 2012
Caching and tuning fun for high scalability @ FOSDEM 2012Wim Godden
 
Northeast PHP - High Performance PHP
Northeast PHP - High Performance PHPNortheast PHP - High Performance PHP
Northeast PHP - High Performance PHPJonathan Klein
 
Varnish http accelerator
Varnish http acceleratorVarnish http accelerator
Varnish http acceleratorno no
 
Tips
TipsTips
Tipsmclee
 
Caching and tuning fun for high scalability
Caching and tuning fun for high scalabilityCaching and tuning fun for high scalability
Caching and tuning fun for high scalabilityWim Godden
 
PHP 7 OPCache extension review
PHP 7 OPCache extension reviewPHP 7 OPCache extension review
PHP 7 OPCache extension reviewjulien pauli
 

Ähnlich wie PHP & Performance (20)

Caching with Memcached and APC
Caching with Memcached and APCCaching with Memcached and APC
Caching with Memcached and APC
 
Caching and tuning fun for high scalability
Caching and tuning fun for high scalabilityCaching and tuning fun for high scalability
Caching and tuning fun for high scalability
 
Caching and tuning fun for high scalability
Caching and tuning fun for high scalabilityCaching and tuning fun for high scalability
Caching and tuning fun for high scalability
 
Php through the eyes of a hoster phpbnl11
Php through the eyes of a hoster phpbnl11Php through the eyes of a hoster phpbnl11
Php through the eyes of a hoster phpbnl11
 
Bottom to Top Stack Optimization with LAMP
Bottom to Top Stack Optimization with LAMPBottom to Top Stack Optimization with LAMP
Bottom to Top Stack Optimization with LAMP
 
Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011Bottom to Top Stack Optimization - CICON2011
Bottom to Top Stack Optimization - CICON2011
 
Securing Your Webserver By Pradeep Sharma
Securing Your Webserver By Pradeep SharmaSecuring Your Webserver By Pradeep Sharma
Securing Your Webserver By Pradeep Sharma
 
PHP Performance with APC + Memcached
PHP Performance with APC + MemcachedPHP Performance with APC + Memcached
PHP Performance with APC + Memcached
 
Apc presentation
Apc presentationApc presentation
Apc presentation
 
Php through the eyes of a hoster confoo
Php through the eyes of a hoster confooPhp through the eyes of a hoster confoo
Php through the eyes of a hoster confoo
 
Heavy Web Optimization: Backend
Heavy Web Optimization: BackendHeavy Web Optimization: Backend
Heavy Web Optimization: Backend
 
Php through the eyes of a hoster
Php through the eyes of a hosterPhp through the eyes of a hoster
Php through the eyes of a hoster
 
Performance tuning with zend framework
Performance tuning with zend frameworkPerformance tuning with zend framework
Performance tuning with zend framework
 
Zendcon scaling magento
Zendcon scaling magentoZendcon scaling magento
Zendcon scaling magento
 
Caching and tuning fun for high scalability @ FOSDEM 2012
Caching and tuning fun for high scalability @ FOSDEM 2012Caching and tuning fun for high scalability @ FOSDEM 2012
Caching and tuning fun for high scalability @ FOSDEM 2012
 
Northeast PHP - High Performance PHP
Northeast PHP - High Performance PHPNortheast PHP - High Performance PHP
Northeast PHP - High Performance PHP
 
Varnish http accelerator
Varnish http acceleratorVarnish http accelerator
Varnish http accelerator
 
Tips
TipsTips
Tips
 
Caching and tuning fun for high scalability
Caching and tuning fun for high scalabilityCaching and tuning fun for high scalability
Caching and tuning fun for high scalability
 
PHP 7 OPCache extension review
PHP 7 OPCache extension reviewPHP 7 OPCache extension review
PHP 7 OPCache extension review
 

Mehr von 毅 吕

打造研发工程师的核心竞争力
打造研发工程师的核心竞争力打造研发工程师的核心竞争力
打造研发工程师的核心竞争力毅 吕
 
the evolution of data infrastructure at lianjia
the evolution of data infrastructure at lianjiathe evolution of data infrastructure at lianjia
the evolution of data infrastructure at lianjia毅 吕
 
SAE平台的灵活应用(吕毅、魏世江)
SAE平台的灵活应用(吕毅、魏世江)SAE平台的灵活应用(吕毅、魏世江)
SAE平台的灵活应用(吕毅、魏世江)毅 吕
 
Lianjia data infrastructure, Yi Lyu
Lianjia data infrastructure, Yi LyuLianjia data infrastructure, Yi Lyu
Lianjia data infrastructure, Yi Lyu毅 吕
 
链家网大数据平台枢纽——工具链,吕毅
链家网大数据平台枢纽——工具链,吕毅链家网大数据平台枢纽——工具链,吕毅
链家网大数据平台枢纽——工具链,吕毅毅 吕
 
链家网存储架构变迁,吕毅
链家网存储架构变迁,吕毅链家网存储架构变迁,吕毅
链家网存储架构变迁,吕毅毅 吕
 
Analysis big data by use php with storm
Analysis big data by use php with stormAnalysis big data by use php with storm
Analysis big data by use php with storm毅 吕
 

Mehr von 毅 吕 (7)

打造研发工程师的核心竞争力
打造研发工程师的核心竞争力打造研发工程师的核心竞争力
打造研发工程师的核心竞争力
 
the evolution of data infrastructure at lianjia
the evolution of data infrastructure at lianjiathe evolution of data infrastructure at lianjia
the evolution of data infrastructure at lianjia
 
SAE平台的灵活应用(吕毅、魏世江)
SAE平台的灵活应用(吕毅、魏世江)SAE平台的灵活应用(吕毅、魏世江)
SAE平台的灵活应用(吕毅、魏世江)
 
Lianjia data infrastructure, Yi Lyu
Lianjia data infrastructure, Yi LyuLianjia data infrastructure, Yi Lyu
Lianjia data infrastructure, Yi Lyu
 
链家网大数据平台枢纽——工具链,吕毅
链家网大数据平台枢纽——工具链,吕毅链家网大数据平台枢纽——工具链,吕毅
链家网大数据平台枢纽——工具链,吕毅
 
链家网存储架构变迁,吕毅
链家网存储架构变迁,吕毅链家网存储架构变迁,吕毅
链家网存储架构变迁,吕毅
 
Analysis big data by use php with storm
Analysis big data by use php with stormAnalysis big data by use php with storm
Analysis big data by use php with storm
 

KĂźrzlich hochgeladen

A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusZilliz
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Miguel AraĂşjo
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...apidays
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MIND CTI
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native ApplicationsWSO2
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024The Digital Insurer
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)wesley chun
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024The Digital Insurer
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Drew Madelung
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot ModelNavi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot ModelDeepika Singh
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...apidays
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAndrey Devyatkin
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfOverkill Security
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FMESafe Software
 

KĂźrzlich hochgeladen (20)

A Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source MilvusA Beginners Guide to Building a RAG App Using Open Source Milvus
A Beginners Guide to Building a RAG App Using Open Source Milvus
 
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
Mastering MySQL Database Architecture: Deep Dive into MySQL Shell and MySQL R...
 
Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...Apidays New York 2024 - The value of a flexible API Management solution for O...
Apidays New York 2024 - The value of a flexible API Management solution for O...
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024MINDCTI Revenue Release Quarter One 2024
MINDCTI Revenue Release Quarter One 2024
 
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law DevelopmentsTrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
TrustArc Webinar - Stay Ahead of US State Data Privacy Law Developments
 
Architecting Cloud Native Applications
Architecting Cloud Native ApplicationsArchitecting Cloud Native Applications
Architecting Cloud Native Applications
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024Axa Assurance Maroc - Insurer Innovation Award 2024
Axa Assurance Maroc - Insurer Innovation Award 2024
 
Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)Powerful Google developer tools for immediate impact! (2023-24 C)
Powerful Google developer tools for immediate impact! (2023-24 C)
 
Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024Manulife - Insurer Transformation Award 2024
Manulife - Insurer Transformation Award 2024
 
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
Strategies for Unlocking Knowledge Management in Microsoft 365 in the Copilot...
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot ModelNavi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
Navi Mumbai Call Girls 🥰 8617370543 Service Offer VIP Hot Model
 
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
Apidays Singapore 2024 - Scalable LLM APIs for AI and Generative AI Applicati...
 
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data DiscoveryTrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
TrustArc Webinar - Unlock the Power of AI-Driven Data Discovery
 
AWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of TerraformAWS Community Day CPH - Three problems of Terraform
AWS Community Day CPH - Three problems of Terraform
 
Ransomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdfRansomware_Q4_2023. The report. [EN].pdf
Ransomware_Q4_2023. The report. [EN].pdf
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers:  A Deep Dive into Serverless Spatial Data and FMECloud Frontiers:  A Deep Dive into Serverless Spatial Data and FME
Cloud Frontiers: A Deep Dive into Serverless Spatial Data and FME
 

PHP & Performance

  • 1. PHP & Performance By: Ilia Alshanetsky 1
  • 2. 2 • This cycle happens for every include le, not just for the "main" script. • Compilation can easily consume more time than execution. PHP Script Zend Compile Zend Execute @ include/require method function call 2
  • 3. Compiler/Opcode Caches • Each PHP script is compiled only once for each revision. • Reduced File IO, opcodes are being read from memory instead of being parsed from disk. • Opcodes can optimized for faster execution. 3
  • 4. Quick Comparison 0 50 100 150 200 FUDforum Smarty phpMyAdmin Stock PHP 4.4.0 APC PHP Accelerator eAccelerator Zend Platform 4
  • 5. 5 • For absolute maximum performance, ensure that all of the software is compiled to take advantage of the available hardware. • Enable all compiler optimizations with -O3 • Tune the code to your CPU via -march –mcpu • CPU specic features -msse –mmmx -mfpmath=sse • Drop debug data -fomit-frame-pointer export CFLAGS="-O3 -msse -mmmx -march=pentium3 -mcpu=pentium3 -funroll-loops -mfpmath=sse -fomit-frame-pointer" Compiler Optimizations 5
  • 6. Web Server: File IO ✓ 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. ✓ If logs are unnecessary disable them. ✓ If logging is a must, log everything to 1 file and break it up during the analysis stage. 6
  • 7. 7 • Syscall is function executed by the Kernel. The goal is to minimize the number of these calls needed to perform a request. • Do not enable ExtendedStatus. • For Deny/Allow rules use IPs rather then domains. • Do not enable HostnameLookups. • Keep ServerSignature off Web Server: Syscalls 7
  • 8. 8 • In theory KeepAlive is supposed to make things faster, however if not used carefully it can cripple the server. • In Apache set KeepAlive timeout, KeepAliveTimeout as low as possible. Suggested value: 10 seconds. • If the server is only serving dynamic requests, disable KeepAlive all together. Web Server: KeepAlive 8
  • 9. 9 • The goal is to pass off as much work to the kernel as efciently as possible. • Optimizes PHP to OS Communication • Reduces Number Of System Calls Matching Your IO Sizes PHP Apache OS Client 9
  • 10. 10 • Efcient • Flexible • In your script, with ob_start() • Everywhere, with output_buffering = On • Improves browser’s rendering speed PHP: Output Control PHP Apache 10
  • 11. Apache: Output Control • The idea is to hand off entire page to the kernel without blocking. • Set SendBufferSize = PageSize Apache OS 11
  • 12. OS: Output Control OS (Linux) /proc/sys/net/ipv4/tcp_wmem 4096 16384 maxcontentsize min default max /proc/sys/net/ipv4/tcp_mem (maxcontentsize * maxclients) / pagesize ✴ Be careful on low memory systems! OS Client 12
  • 13. 13 • While Apache is great for dynamic requests, static requests can be served WAY FASTER by other web servers. ๏ lighttpd ๏ Boa ๏ Tux ๏ thttpd • For static requests these servers are easily 300-400% faster then Apache 1 or 2. Static Content Serving 13
  • 14. Less Output == Faster • Saves server bandwidth (saves $$ too). • Reduces server resource usage (CPU/ Memory/Disk) • Pages load faster for clients. • Reduces network IO high trafc sites, where it is the primary bottleneck in most cases. 14
  • 15. 15 • Most browsers support content compression. • Compressed pages are on average are 6-8 times smaller. ๏ Apache 1 (mod_gzip / mod_deflate) ๏ Apache 2 (mod_deflate) ๏ PHP ‣ From PHP conguration zlib.output_compression=1 ‣ From inside the script ob_start(“ob_gzhandler”) ✴ Compression will utilize 3%-5% of CPU. Content Compression 15
  • 16. Content Reduction • Use a post- processor like Tidy to remove formatting, comments and CCSify the code. <?php $o = array("clean" => true, "drop-proprietary-attributes" => true, "drop-font-tags" => true, "drop-empty-paras" => true, "hide-comments" => true, "join-classes" => true, "join-styles" => true ); $tidy = tidy_parse_file("php.html", $o); tidy_clean_repair($tidy); echo $tidy; ?> 16
  • 17. 17 ➡ register_globals = Off ** ➡ magic_quotes_gpc = Off ➡ expose_php = Off ➡ register_argc_argv = Off ➡ always_populate_raw_post_data = Off ** ➡ session.use_trans_sid = Off ** ➡ session.auto_start = Off ** ➡ session.gc_divisor = 1000 or 10000 Tuning PHP Conguration 17
  • 18. 18 • Identify Bottlenecks • Track Resource Usage • Generate Call Trees • Create Progress Tracking Data Proling & Benchmarking 18
  • 19. 19 • Apache Bench ‣ ab utility bundled with Apache • Siege ‣ http://www.joedog.org/JoeDog/Siege • http_load (Excellent for latency tests) ‣ http://www.acme.com/software/http_load/ Testing Web Servers 19
  • 20. Web Server Testing Concurrency Level: 10 Time taken for tests: 0.265 seconds Complete requests: 100 Failed requests: 0 Broken pipe errors: 0 Total transferred: 5077082 bytes HTML transferred: 5061168 bytes Requests per second: 377.36 [#/sec] (mean) Time per request: 26.50 [ms] (mean) Time per request: 2.65 [ms] (mean) Transfer rate: 19158.80 [Kbytes/sec] 20
  • 21. Latency Test 1000 fetches, 5 max parallel, 2.9648e+07 bytes, in 0.813035 seconds 29648 mean bytes/connection 1229.96 fetches/sec, 3.64658e+07 bytes/sec msecs/connect: 0.463202 mean, 12.082 max, 0.045 min msecs/first-response: 3.12969 mean, 50.783 max, 0.811 min HTTP response codes: code 200 -- 1000 1 msec = 0.0001 seconds 21
  • 22. 22 • APD (Pure proler) ‣ http://pecl.php.net/apd • XDebug (Proler & Debugger) ‣ http://xdebug.org/ • DBG (Proler & Debugger) ‣ http://dd.cron.ru/dbg/ Proling PHP Code 22
  • 23. Proling with APD • Installation Steps • pecl install apd • Modify php.ini zend_extension=apd.so Zend Execute APD Start APD Finish Process repeated for every function/method call 23
  • 24. 24 • Proling of a script starts from the point when the apd_set_pprof_trace() function is called. • All code executed prior, will not be proled. $parts = preg_split("!s!", "a b c"); function test(&$var) { $var = base64_encode(trim($var)); } apd_set_pprof_trace(); array_walk($parts, 'test'); ✴ Use the auto_prepend_file php.ini setting to activate profiling for an entire application. Generating A Trace 24
  • 25. Interpreting the Results Real User System secs cumm. %Time (excl/cumm) (excl/cumm) (excl/cumm) Calls call s/call Name ----------------------------------------------------------------------------------------- 82.4 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0007 0.0007 apd_set_pprof_trace 10.2 0.00 0.00 0.00 0.00 0.00 0.00 3 0.0000 0.0000 trim 4.3 0.00 0.00 0.00 0.00 0.00 0.00 3 0.0000 0.0000 base64_encode 1.9 0.00 0.00 0.00 0.00 0.00 0.00 3 0.0000 0.0000 test 0.6 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0000 0.0001 array_walk 0.6 0.00 0.00 0.00 0.00 0.00 0.00 1 0.0000 0.0008 main 25
  • 26. 26 • Hard-drive is in most cases the slowest part of the system, yet all the data eventually comes from it. • By adjust the drive conguration parameters you can help your OS get the most out of it. Drive Tuning 26
  • 27. 27 • Use the hdparm utility to adjust settings. • -c1 - set IDE 32-bit I/O setting • -d1 - enable DMA • -u1 - enable IRQ unmasking • -m16 - turn on multicount • -X 34|66|100|133 - transfer mode Drive Tuning Parameters 27
  • 28. Validating Changes Benchmark the affect of the changes using: hdparm -tT /dev/[drive] 28
  • 29. 29 • One way to accelerate File IO operations is by moving the les and directories to a RAM disk. • On Linux this is extremely simple to do using via tmpfs. # Speed Up /tmp Directory mount --bind -ttmpfs /tmp /tmp # Accelerate Scripts Directory mount --bind -ttmpfs /home/webroot /home/webroot RAM Disk 29
  • 30. 30 • PHP’s session extension by default stores each session inside a separate le. • Many les in one directory reduce access speed. ➡ Assign each user their own session directory ➡ Split sessions into multiple directories session.save_path = "N;/path" Session Storage 30
  • 31. Session Storage Alternatives • File system is slow, lets use memory • mm - native shared memory storage • apc - use APC’s store/fetch/delete • memcache - memory storage daemon 31
  • 32. Now let’s tune PHP code 32
  • 33. OOP Tips • Always declare your static methods! • Cleaner & Faster code <?php class bench {     public function a() { return 1; }     public static function b() { return 1; } } $s = microtime(1); for ($i = 0; $i < 100000; $i++) bench::a(); $e = microtime(1); echo "Dynamic Static Method: ".($e - $s)."n"; $s = microtime(1); for ($i = 0; $i < 100000; $i++) bench::b(); $e = microtime(1); echo "Declared Static Method: ".($e - $s)."n"; 33
  • 35. Use Class Constants • Parsed at compile time, no execution overhead. • Faster lookups due to a smaller hash. • “Namespacing” & shorter hash names. • Cleaner code speeds up debugging ;-) 35
  • 36. Avoid Magic • Magic methods such as __get()/__set() • Magic loading functions such as __autoload() • Dynamic methods via __call() 36
  • 37. require_once() is once too many lstat64("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=7368, ...}) = 0 lstat64("/tmp/a.php", {st_mode=S_IFREG|0644, st_size=6, ...}) = 0 open("/tmp/a.php", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=6, ...}) = 0 fstat64(3, {st_mode=S_IFREG|0644, st_size=6, ...}) = 0 lstat64("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=7368, ...}) = 0 lstat64("/tmp/a.php", {st_mode=S_IFREG|0644, st_size=6, ...}) = 0 open("/tmp/a.php", O_RDONLY) = 3 fstat64(3, {st_mode=S_IFREG|0644, st_size=6, ...}) = 0 fstat64(3, {st_mode=S_IFREG|0644, st_size=6, ...}) = 0 <?php require_once "./a.php"; require_once "./a.php"; 37
  • 38. • If you absolutely cannot avoid require_once and include_once use full paths. • In PHP 5.2>= this will allow PHP to avoid opening the le twice. 38
  • 39. ๏ php_version() ✓ PHP_VERSION constant ๏ php_uname(‘s’) ✓ PHP_OS constant ๏ php_sapi_name() ✓ PHP_SAPI constant Avoid Pointless Function Calls 39
  • 40. Quick Comparison 0 0.625 1.250 1.875 2.500 PHP_OS php_uname() php_uname(’s’) 0.04 2.08 1.88 40
  • 41. Fastest Win32 Detection in the West • Does not use functions • Does not care about WinXP, WinNT, Windows, Windows98, NT 5.0, etc... • Always available $isWindows =  DIRECTORY_SEPARATOR == ''; 41
  • 42. What time is it? Rather then calling time(), time() and time() again, use $_SERVER[‘REQUEST_TIME’] Provides a timestamp, with a second precision, without any function calls. 42
  • 44. Use non-capturing patterns • Placing ?: at the start of a sub-pattern makes it non-capturing. • This means PHP/PCRE does not need to allocate memory to store the matched content block. $text = preg_replace( '/=?(?:[^?]+)?/', '=?iso-8859-1?', $origtext ); $text = preg_replace(  '"/(?:n|t|rn|s)+/"', ' ', $origtext ); 44
  • 45. End Result 0 8.75 17.50 26.25 35.00 30.92 26.38 Seconds A 15% performance improvement, with a 2 character change. Capuring Non-Capturing 45
  • 46. If Possible Avoid Regex <?php // Slow if (preg_match("!^foo_!i", "FoO_")) { } // Much faster if (!strncasecmp("foo_", "FoO_", 4)) { } // Slow if (preg_match("![a8f9]!", "sometext")) { } // Faster if (strpbrk("a8f9", "sometext")) { } // Slow if (preg_match("!string!i", "text")) {} // Faster if (stripos("text", "string") !== false) {}  46
  • 47. More Regex Avoidance $text = preg_replace( "/n/", "n", $text); In this case it would be simpler and to mention faster to use a regular str_replace() $text = str_replace( "/n/", "n", $text); 47
  • 48. Speed Comparison 0 11.25 22.50 33.75 45.00 1 to 1 1 to 2 1 to 3 2 to 2 preg_replace str_replace strtr 48
  • 49. Use strtr() Properly! Any ideas on how we can make this code 10 times faster? $rep = array( '-' => '*', '.' => '*' ); if ( sizeof( $globArr ) > 1 ) { $glob = "-" . strtr( $globArr[1], $rep ); } else { $glob = strtr( $globArr[0], $rep ); } 49
  • 50. Use Strings! Elimination of array operations speeds up the code and simplies the internal work in strtr() function. if ( sizeof( $globArr ) > 1 ) { $glob = "-" . strtr( $globArr[1], '-.', '**' ); } else { $glob = strtr( $globArr[0], '-.', '**' ); } 0 15 30 45 60 4.29 55.70 Seconds strtr(string) strtr(array) 50
  • 51. Don’t Replace When you • Any replacement operation requires memory, if only to store the “modied” result. • A quick strpos() to determine if any replacement is actually needed can save memory and improve performance! 51
  • 53. @ operator is evil! • The error blocking operator, is the most expensive character in PHP’s alphabet. • This seemingly innocuous operator actually performs fairly intensive operations in the background. @action(); $old = ini_set(“error_reporting”, 0); action(); ini_set(“error_reporting”, $old); 53
  • 56. Comparing From An Offset • As of PHP 5, you don’t need to substr() string segments from non-start position to compare them thanks to substr_compare(). if (substr($class, -15) != 'text') /* == */ if (substr_compare($class, 'text', -15)) 56
  • 57. Don’t Mis-use Constants One of my biggest pet-peeves in PHP is this kind of nonsense: $foo = array("bar"=>0); $foo[bar] = 1; 57
  • 58. Why is this bad? ๏ 1 strtolower ๏ 2 hash lookups ๏ E_NOTICE error message generated ๏ temporary string being created on the fly. 58
  • 60. Fix “harmless” error messages ‣ Each error results in: ๏ Generation of a complex error string ๏ Output to stdout/stderr ๏ Potential write to a le or syslog ๏ In pre-5.2 releases may leak memory in some rare instances. 60
  • 61. Simplify for() loop Avoid function calls within for() loop control blocks. <?php for ( $i = 1; $i < sizeof($array); $i++ ) {} for ( $i = 0; $i < count($array); $i++ ) {} for ( $i = 0; $i < strlen($string); $i++ ) {} Otherwise function is called for every loop iteration. 61
  • 63. Don’t Re-invent the Wheel • It is surprising how frequently people try to re-invent the wheel. • Now a days PHP has ✓ 2,700 functions ✓ 80 core extensions ✓ 154 PECL extensions • Chances are what you need already exists! 63
  • 64. Use Full File Paths • While it is convenient(??) to do require “foo.php” and have it work, internally it leads to signicant overhead. • Whenever possible you should use full paths, that require no resolution in PHP. 64
  • 65. The internals of le ops. stat64("./b.php", {st_mode=S_IFREG|0644, st_size=6, ...}) = 0 getcwd("/tmp", 4096) = 5 lstat64("/tmp", {st_mode=S_IFDIR|S_ISVTX|0777, st_size=18008, ...}) = 0 lstat64("/tmp/b.php", {st_mode=S_IFREG|0644, st_size=6, ...}) = 0 open("/tmp/b.php", O_RDONLY) The issue can be further exasperated by the use of include_path. 65
  • 66. 66 References can be used to simply & accelerate access to multi-dimensional arrays. Reference Tricks $a['b']['c'] = array(); // slow 2 extra hash lookups per access for($i = 0; $i < 5; $i++) $a['b']['c'][$i] = $i; // much faster reference based approach $ref =& $a['b']['c']; for($i = 0; $i < 5; $i++) $ref[$i] = $i; 66
  • 67. Optimization Myths ✦ Removing comments makes code faster ✦ Using “ is faster then ‘ ✦ Passing things by-reference makes code faster ✦ Objects make code faster ✦ Ternary ? : is faster then if () { } else {} 67
  • 68. 68 Caching is the recognition and exploitation of the fact that most "dynamic" data does not change every time you request it. 68
  • 69. 69 Most applications will end up using databases for information storage. Improper use of this resource can lead to significant and continually increasing performance loss. 69
  • 70. 70 Most databases offers tools for analyzing query execution. EXPLAIN select * from 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 | +----------+------+---------------+------+---------+------+-------+------------+ EXPLAIN select * from users where login LIKE 'ilia%'; +----------+-------+---------------+-------+---------+------+------+------------+ | table | type | possible_keys | key | key_len | ref | rows | Extra | +----------+-------+---------------+-------+---------+------+------+------------+ | mm_users | range | login | login | 50 | NULL | 2 | where used | +----------+-------+---------------+-------+---------+------+------+------------+ Check Your Queries 70
  • 71. 71 Rather then creating a column for every Boolean option, you can pack 32 of them into a single integer eld. CREATE TABLE users ( is_active INT, is_banned INT, is_admin INT, ... ); CREATE TABLE users ( user_opt INT, ... ); user_opt & 1 // active user_opt & 2 // banned user_opt & 4 // admin Bitwise Option Packing 71
  • 72. 72 • The simpler the code, the faster it runs, it really is that simple. • Syntactic sugar. • Unnecessary wrappers. • Wrapping one liners in functions. • OO for the sake of OO. KISS = Performance 72
  • 73. Thank You For Listening! • These slides • http://www.ilia.ws/ • APC • http://pecl.php.net/apc • XDebug • http://www.xdebug.org/ 73
  • 74. Optimizer (Why?) • The opcodes generated by Zend Engine are often inefcient. • Some operations can be avoided • A lot of temporary vars are not necessary. • Every compiler needs an optimizer ;-) i 74
  • 75. Optimizer (How?) PHP Script Zend Compile Zend Execute @ OptimizerKinda Slow 75
  • 76. What Can It Do? • opt. heredoc • print to echo • GLOBALS[foo] to foo • inline known constants • eliminate NOP • resolve partial le paths. • optionally inline dene() calls • 60+ function calls with static values resolved. • Much more... 76