OTIMIZAÇÃO EESCALABILIDADE
Para quem não me conheceGraduando em ciência da computação pela UFES;Trabalho com internet há 9 anos;Gerente de Tecnologia do iMasters desde 2003;Obtive o ZendCertifiedEngineer para PHP5 em 2008;
Otimização é..obter o máximo de resultados com a mesma quantidade de recursos.
Escalabilidade é..habilidade de manipular uma porção crescente de trabalho de forma uniforme, ou estar preparado para crescer.
Demanda de processamentoVolume de dados
Casos famososTwitter – instabilidade devido a falha na estratégia de escalabilidadeDigg – teve de mudar toda a arquitetura da aplicação para manter-se onlineWorld ofWarcraft – durante o lançamento, foi sobrecarregado e ficou fora do arYoutube, LiveJournal, Facebook....
Como otimizar e ser escalável?
Não existe receita de bolo.
Código-fonteDicasProfilingInfra-estruturaUsando cacheopcodememcacheBanco de dadosOtimização de consultasDistribuindo banco de dadosDistribuindo tarefasArquiteturas escaláveisComputação em nuvem
Código-fonte
Dicasechoé mais rápido que print();utilize aspas simples ao invés de aspas duplas quando possível;evite métodos mágicos como __get, __set, __call e etc..prefira require() ao require_once() quando possível;utilize caminhos absolutos sempre que possível;$array['foo'] é até 7x mais rápido do que que$array[foo];evite o operador @ para ocultar erros;...
1%
DicasEvite funções pesadas nas condições dos loopsfor($i=0; $i < count($obj->metodoLento()); $i++){   // faça alguma coisa}
DicasEvite funções pesadas nas condições dos loops$total = count($obj->metodoLento());for($i=0; $i < $total; $i++){   // faça alguma coisa}
DicasLembre-se de executar exit() depois dos redirecionamentos if($redirect){   header("Location: index.php");}// algum código aqui
DicasLembre-se de executar exit() depois dos redirecionamentos if($redirect){   header("Location: index.php");exit();}// algum código aqui
DicasEvite SQLs dentro de loopsforeach($usuarios as $u){mysql_query("      INSERT INTO usuario (nome, email)      VALUES('".$u->nome."','".$u->email."')   ", $conn);}
DicasEvite SQLs dentro de loops $sql = "INSERT INTO usuario (nome, email) VALUES";$values = array()foreach($usuarios as $u){    $values[] = "('".$u->nome."','".$u->email."')";}mysql_query($sql.implode("," , $values), $conn);
DicasEvite SQLs dentro de loops INSERT INTO usuario (nome, email) VALUES   ('Leo Hackin','leo@hackin.com'),   ('Almir Mendes','almir@mendes.com'),   ('Reinaldo Junior','reinaldo@junior.com')
DicasUtilize páginas estáticasRequisições a páginas estáticas não precisam carregar o engine PHP, economizando memória e diminuindo o tempo de resposta.Preste atenção aos índices do banco de dadosA ausência de índices nas colunas que aparecem em cláusulas WHERE ou JOIN pode 'destruir' a performance da sua aplicação.
DicasUtilize curto-circuito nas consultas SQL
ProfilingÉ a investigação do comportamento do script, através dos dados recolhidos durante a sua execução, com o objetivo de determinar quais partes podem ser otimizadas melhorando a velocidade e reduzindo o consumo de memória
ProfilingEncontrar os gargalosComo analisar seu código?XDebugXHProf
Profiling - XDebugInstalação$peclinstallxdebugConfiguração php.inizend_extension=/path/to/extensions/xdebug.soxdebug.profiler_enable = 1xdebug.profiler_output_dir = /var/log/xdebug/xdebug.trace_format = 1Ferramentas para analisar os dadosKCacheGrind (Linux)WinCacheGrind (Windows)
Infra-estrutura
CachesBanco de dadosComputação em nuvem
OpcodecachePHP compila o scriptO opcode é executadoHTML enviado ao navegador
OpcodecacheCacheOpcodePHP compila o scriptO opcode é executadoHTML enviado ao navegador
OpcodecacheOpções disponíveisAPCeAcceleratorZendOptimizerionCubeEncoder...
ClienteApache + MySQL
ClienteApacheMySQL
Cliente?ApacheApacheApacheMySQL
ClienteApacheApacheApacheMySQLSessionserver
MemcacheO que é?Como funciona?Como utilizar em sua aplicação?
Memcache - Session$host = “memcache.exemple.com”;$port = 11211;$session_path = "tcp://$host:$port";ini_set('session.save_handler', 'memcache');ini_set('session.save_path', $session_path);
Memcache - Session$sess_serv = array(array('host' => 'memcache1.exemple.com',         'port' => 11211),array('host' => 'memcache2.exemple.com',         'port' => 11211),);$path = array();foreach($sess_serv as $s)	$path[] = 'tcp://'.$s['host'].':'.$s['port']ini_set('session.save_handler', 'memcache');ini_set('session.save_path', implode(',', $path));
Memcache - Dados$memcache = new Memcache;$memcache->connect('localhost', 11211);$object = new stdClass;$object->str_attr = 'test';$object->int_attr = 123;$memcache->set('key', $object, false, 10);$result = $memcache->get('key');
Memcache - SQLfunctionquery_with_cache($sql, $timeout = 1800){    global $memcache;    $key = md5($sql);if (($result = $memcache->get($key)) === false)    {       $result = query_and_fetch($sql);       $memcache->set($key, $result , false, $timeout);    }return $result;}
Banco de dadosMaster-slaveUm (e apenas um) masterUm ou mais slavesTodas as escritas são enviadas ao masterLeituras são distribuídas entre todos os nósFalhasÚnico ponto de falhaGargalo
Banco de dadosServidoresde AplicaçãoMasterSlaveSlaveSlaveEscritaLeitura
Banco de dadosMaster-masterUm ou mais mastersEscritas e leituras vão para todos os mastersEscritas são replicadas entre siFalhasAlta complexidadeIntroduz altas latências de comunicação
Banco de dadosServidores de AplicaçãoMasterMasterMasterEscritaLeitura
Banco de dadosParticionamento verticalColocar as tabelas em servidores diferentes agrupadas por área funcionalEscalona seus dados por funcionalidadeJoins são realizados na aplicaçãoFalhasPerde os relacionamentos reais do banco de dadosEscalabilidade limitada
Banco de dadosServidores de AplicaçãoClientsCommentsProducts
Banco de dadosParticionamento horizontalSepare os dados por chaves e coloque em servidores diferentes (sharding)Escalona seus dados por chaveJoins são realizados na aplicaçãoNecessita de um “roteamento” das consultas na aplicaçãoFalhaPerde os relacionamentos reais do banco de dados
Banco de dadosServidores de AplicaçãoClients  (i – q)Clients (r – z)Clients (a – h)
CloudHostingO que é?FlexibilidadeBaixo custo?

Otimização e Escalabilidade