{"id":2727,"date":"2014-03-31T17:17:23","date_gmt":"2014-03-31T17:17:23","guid":{"rendered":"http:\/\/www.deuzebranaweb.com.br\/?p=2727"},"modified":"2014-03-31T17:17:23","modified_gmt":"2014-03-31T17:17:23","slug":"usando-memcached-no-php","status":"publish","type":"post","link":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/2014\/03\/31\/usando-memcached-no-php\/","title":{"rendered":"Usando memcached no PHP"},"content":{"rendered":"<p>&nbsp;<\/p>\n<header>\n<h1>Usando memcached no PHP<\/h1>\n<p>Posted in\u00a0<a title=\"View all posts in PHP\" href=\"http:\/\/www.douglaspasqua.com\/category\/php\/\" rel=\"nofollow\">PHP<\/a>,\u00a0<a title=\"View all posts in Tuning\" href=\"http:\/\/www.douglaspasqua.com\/category\/tuning\/\" rel=\"nofollow\">Tuning<\/a>\u00a0By\u00a0<a title=\"Posts by Douglas V. Pasqua\" href=\"http:\/\/www.douglaspasqua.com\/author\/douglas-pasquagmail-com\/\" rel=\"nofollow\">Douglas V. Pasqua<\/a>\u00a0On August 22, 2011<\/p>\n<\/header>\n<p>&nbsp;<\/p>\n<div>\n<p><em>Memcached<\/em>\u00a0utilizando junto com php, permite voc\u00ea aumentar a perfomance de sua aplica\u00e7\u00e3o fazendo cache de dados na mem\u00f3ria. Usar o\u00a0<em>memcached<\/em>\u00a0para carregar dados, ao inv\u00e9s de carregar de um banco de dados ou do sistema de arquivos, pode ter um grande impacto na perfomance de sua aplica\u00e7\u00e3o php.<\/p>\n<p>A regra b\u00e1sica de utiliza\u00e7\u00e3o de cache \u00e9 simples: Conforme o client (usu\u00e1rio) acessa seu site onde os dados s\u00e3o provenientes de um banco de dados ou qualquer outra fonte de informa\u00e7\u00f5es, inicialmente esses dados s\u00e3o gravados em um cache, no nosso caso usando o\u00a0<em>memcached<\/em>. Nas pr\u00f3ximas requisi\u00e7\u00f5es, ao inv\u00e9s de buscar as informa\u00e7\u00f5es no banco de dados novamente, iremos primeiro chec\u00e1-las se existem no cache e caso existindo, s\u00e3o retornadas do cache e n\u00e3o do banco de dados. Em um outro momento, caso essas informa\u00e7\u00f5es sofrerem atualiza\u00e7\u00f5es na sua fonte de dados (database, etc..), iremos destruir o cache no\u00a0<em>memcached<\/em>\u00a0e reiniciar o ciclo novamente. Normalmente utilizamos um id \u00fanico para identificar uma por\u00e7\u00e3o de dados gravados ou lidos em um cache.<\/p>\n<p>Somente por curiosidade, o\u00a0<em>Zend Framework<\/em>\u00a0disponibiliza um m\u00f3dulo de Cache que pode ser utilizado juntamente com o\u00a0<em>memcached<\/em>. Iremos abordar esse m\u00f3dulo em um post futuro.<\/p>\n<p><strong>Instalando e habilitando memcached no PHP<\/strong><\/p>\n<div>\n<div id=\"highlighter_337983\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>1<\/div>\n<div>2<\/div>\n<\/td>\n<td>\n<div>\n<div><code>$ <\/code><code>sudo<\/code> <code>apt-get <\/code><code>install<\/code> <code>memcached<\/code><\/div>\n<div><code>$ <\/code><code>sudo<\/code> <code>apt-get <\/code><code>install<\/code> <code>php5-memcached<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>O php tamb\u00e9m disponibiliza a bilioteca memchache, atrav\u00e9s do pacote php5-memcache, por\u00e9m aconselho utilizar a biblioteca mancached como citado acima pois \u00e9 mais atual e implementa o protocolo do memcache de forma mais eficiente.<\/p>\n<p>Verificando se o servi\u00e7o do memcached esta no ar:<\/p>\n<div>\n<div id=\"highlighter_91797\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>1<\/div>\n<\/td>\n<td>\n<div>\n<div><code>$ <\/code><code>ps<\/code> <code>ax | <\/code><code>grep<\/code> <code>memcached<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Reiniciando Apache:<\/p>\n<div>\n<div id=\"highlighter_219712\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>1<\/div>\n<\/td>\n<td>\n<div>\n<div><code>$ <\/code><code>sudo<\/code> <code>service apache2 restart<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p><strong>Exemplos<\/strong><\/p>\n<p>Segue abaixo um exemplo simples da utiliza\u00e7\u00e3o do memcached com PHP. Os principais pontos aqui s\u00e3o os m\u00e9todos\u00a0<em>get<\/em>, que otem dados do cache usando uma chave para identifica\u00e7\u00e3o e o m\u00e9todo\u00a0<em>set<\/em>, utilizado para inserir dados no cache, tamb\u00e9m utilizando uma chave para identifica\u00e7\u00e3o.<\/p>\n<div>\n<div id=\"highlighter_810249\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>1<\/div>\n<div>2<\/div>\n<div>3<\/div>\n<div>4<\/div>\n<div>5<\/div>\n<div>6<\/div>\n<div>7<\/div>\n<div>8<\/div>\n<div>9<\/div>\n<div>10<\/div>\n<div>11<\/div>\n<div>12<\/div>\n<div>13<\/div>\n<div>14<\/div>\n<div>15<\/div>\n<div>16<\/div>\n<div>17<\/div>\n<div>18<\/div>\n<div>19<\/div>\n<div>20<\/div>\n<div>21<\/div>\n<\/td>\n<td>\n<div>\n<div><code>&lt;?php<\/code><\/div>\n<div><code>\/\/ conectando no memcached<\/code><\/div>\n<div><code>$m<\/code> <code>= <\/code><code>new<\/code> <code>Memcached();<\/code><\/div>\n<div><code>$m<\/code><code>-&gt;addServer(<\/code><code>'localhost'<\/code><code>, 11211);<\/code><\/div>\n<div><\/div>\n<div><code>\/\/ checando dados no cache e carregando em $rows<\/code><\/div>\n<div><code>if<\/code> <code>(!(<\/code><code>$rows<\/code> <code>= <\/code><code>$m<\/code><code>-&gt;get(<\/code><code>'lista_usuarios'<\/code><code>))) {<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0<\/code><code>if<\/code> <code>(<\/code><code>$m<\/code><code>-&gt;getResultCode() == Memcached::RES_NOTFOUND) {<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code>\/\/ dados n\u00e3o encontrados no cache. <\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code>\/\/ inserir no cache dados obtidos no banco<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code>\/\/ obter lista de usuarios do banco de dados<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code>\/\/ $rows = obter_lista_usuarios_db();<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code>$rows<\/code> <code>= <\/code><code>array<\/code><code>(<\/code><code>'joao'<\/code><code>, <\/code><code>'jose'<\/code><code>, <\/code><code>'maria'<\/code><code>);<\/code><\/div>\n<div><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code>\/\/ inserindo dados<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code>$m<\/code><code>-&gt;set(<\/code><code>'lista_usuarios'<\/code><code>, <\/code><code>$rows<\/code><code>);<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0<\/code><code>}<\/code><\/div>\n<div><code>}<\/code><\/div>\n<div><\/div>\n<div><code>\/\/ acessando dados<\/code><\/div>\n<div><code>var_dump(<\/code><code>$rows<\/code><code>);<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>PS: No m\u00e9todo\u00a0<em>set<\/em>\u00a0\u00e9 poss\u00edvel especificar o tempo de expira\u00e7\u00e3o em segundos em que ir\u00e1 durar o cache. Caso seja omitido, \u00e9 por tempo indeterminado. (nunca ir\u00e1 expirar).<\/p>\n<p>Caso os dados do banco de dados forem modificados ou de alguma forma for determinado que o cache precisa ser atualizado existe a possibilidade de for\u00e7ar a limpeza do cache atrav\u00e9s do m\u00e9todo\u00a0<em>delete<\/em>:<\/p>\n<div>\n<div id=\"highlighter_607819\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>1<\/div>\n<div>2<\/div>\n<div>3<\/div>\n<div>4<\/div>\n<div>5<\/div>\n<div>6<\/div>\n<div>7<\/div>\n<div>8<\/div>\n<div>9<\/div>\n<div>10<\/div>\n<div>11<\/div>\n<\/td>\n<td>\n<div>\n<div><code>&lt;?php<\/code><\/div>\n<div><code>$m<\/code> <code>= <\/code><code>new<\/code> <code>Memcached();<\/code><\/div>\n<div><code>$m<\/code><code>-&gt;addServer(<\/code><code>'localhost'<\/code><code>, 11211);<\/code><\/div>\n<div><\/div>\n<div><code>\/\/ verifica se houve modificacao na fonte de dados que esta em cache<\/code><\/div>\n<div><code>\/\/ $dados_modificados = houve_atualizacao_dados();<\/code><\/div>\n<div><\/div>\n<div><code>$dados_modificados<\/code> <code>= true; <\/code><code>\/\/ somente para este exemplo funcionar<\/code><\/div>\n<div><code>if<\/code><code>(<\/code><code>$dados_modificados<\/code><code>) {<\/code><\/div>\n<div><code>\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0<\/code><code>$m<\/code><code>-&gt;<\/code><code>delete<\/code><code>(<\/code><code>'lista_usuarios'<\/code><code>);<\/code><\/div>\n<div><code>}<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>Somente lembrando que se voc\u00ea reiniciar o servi\u00e7o do memcached, por padr\u00e3o, os dados em cache ser\u00e3o perdidos.<\/p>\n<p><strong>Usando o memcached para armazenar dados da sess\u00e3o<\/strong><\/p>\n<p>O memcached pode ser utilizado para outros prop\u00f3sitos no PHP, como por exemplo, no armazenamento de sess\u00f5es. \u00c9 \u00fatil no caso de estar utilizando load-balancing com o php. Ao inv\u00e9s de armazenar os dados de sess\u00e3o em disco, todos servidores php que est\u00e3o no balanceamento podem armazenar os dados de sess\u00e3o em lugar centralizado, no caso, um servidor memcached. Dessa forma, caso o usu\u00e1rio que logou em um servidor, ao ser redirecionado para outro servidor durante o acesso no site, ele n\u00e3o perder\u00e1 a sess\u00e3o iniciada anteriormente, devido ao mecanismo de sess\u00e3o estar centralizado no memcached.<\/p>\n<p>Para habilitar o armazenamento da sess\u00e3o no memcached, configure o php.ini dessa forma:<\/p>\n<div>\n<div id=\"highlighter_895251\">\n<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\">\n<tbody>\n<tr>\n<td>\n<div>1<\/div>\n<div>2<\/div>\n<\/td>\n<td>\n<div>\n<div><code>session.save_handler = memcache<\/code><\/div>\n<div><code>session.save_path = \"127.0.0.1:11211\"<\/code><\/div>\n<\/div>\n<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/div>\n<\/div>\n<p>\u00c9 isso ae, espero que tenham gostado. Sintam-se \u00e0 vontade para postar coment\u00e1rios. Abra\u00e7os!<\/p>\n<p>&nbsp;<\/p>\n<p>&nbsp;<\/p>\n<p>http:\/\/www.douglaspasqua.com\/2011\/08\/22\/usando-memcached-no-php\/<\/p>\n<p>http:\/\/msyk.es\/blog\/installing-memcache-for-php-5-on-linux-centos\/<\/p>\n<\/div>\n","protected":false},"excerpt":{"rendered":"<p>&nbsp; Usando memcached no PHP Posted in\u00a0PHP,\u00a0Tuning\u00a0By\u00a0Douglas V. Pasqua\u00a0On August 22, 2011 &nbsp; Memcached\u00a0utilizando junto com php, permite voc\u00ea aumentar a perfomance de sua aplica\u00e7\u00e3o fazendo cache de dados na mem\u00f3ria. Usar o\u00a0memcached\u00a0para carregar dados, ao inv\u00e9s de carregar de um banco de dados ou&#8230;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_angie_page":false,"page_builder":"","footnotes":""},"categories":[6],"tags":[],"class_list":["post-2727","post","type-post","status-publish","format-standard","hentry","category-php"],"amp_enabled":true,"_links":{"self":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts\/2727","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/comments?post=2727"}],"version-history":[{"count":0,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/posts\/2727\/revisions"}],"wp:attachment":[{"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/media?parent=2727"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/categories?post=2727"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/blog.deuzebranaweb.com.br\/index.php\/wp-json\/wp\/v2\/tags?post=2727"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}