Instalando mCrypt no PHP 7.2 [Ubuntu Server]

A extensão mcrypt é uma interface para a biblioteca de criptografia mcrypt. Esta extensão é útil para permitir que o código PHP usando o mcrypt seja executado no PHP 7.2+.

O principal problema com a extensão mcrypt é que ela é baseada no libmcrypt que não foi desenvolvido desde o seu upstream em 2007. Assim, já faz mais e 10 anos, mesmo que a biblioteca ainda seja usada. No entanto, sem o desenvolvimento adequado e biblioteca tornou-se mal vista por muitos administradores de sistema.

Devido ao fim do desenvolvimento da extensão mcrypt, a extensão também foi removida do PHP 7.2 e movida para um repositório não oficial do PECL. No entanto, você ainda pode encontrar a extensão mcrypt no PHP 5.4 até o PHP 7.1. A chegada do PHP 7.2 foi anunciada, mas não conterá a extensão mcrypt. Para o PHP 7.2+, o PHP usa libsodium como uma biblioteca de criptografia.

Para instalar esta extensão no PHP 7.2, execute os seguintes comandos como o usuário root do seu servidor:

Verifique a versão php e pecl

php -v
pecl version

Se o seu php não for 7.2, use o comando /usr/bin/php7.2 em vez de php.

Instalando a extensão mcrypt

sudo apt-get -y install gcc make autoconf libc-dev pkg-config
sudo apt-get -y install libmcrypt-dev
sudo pecl install mcrypt-1.0.1

Quando ver essa pergunta:

libmcrypt prefix? [autodetect] :

Apenas pressione [enter]

Após o sucesso da instalação do mcrypt pelo pecl, você deve adicionar a extensão mcrypt.so ao php.ini.

O fim da instalação vai mostrar algo como isso:

[code=”bash]…
Build process completed successfully
Installing ‘/usr/lib/php/20170718/mcrypt.so’ —-> esse é o caminho da extensão mcrypt
install ok: channel://pecl.php.net/mcrypt-1.0.1
configuration option “php_ini” is not set to php.ini location
You should add “extension=mcrypt.so” to php.ini[/code]

Copie o caminho da extensão e adicione à configuração cli e apache2 php.ini com o comando abaixo. Se o caminho for diferente no seu sistema você deve corrigir o código abaixo antes de executar.

[code=”bash]sudo bash -c “echo extension=/usr/lib/php/20170718/mcrypt.so > /etc/php/7.2/cli/conf.d/mcrypt.ini”
sudo bash -c “echo extension=/usr/lib/php/20170718/mcrypt.so > /etc/php/7.2/apache2/conf.d/mcrypt.ini”
[/code]

Verifique se a extensão foi instalada

Rode o comando:

php -i | grep "mcrypt"

A saída deve ser assim:

[code=”bash]/etc/php/7.2/cli/conf.d/mcrypt.ini
Registered Stream Filters => zlib.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk, convert.iconv.*, mcrypt.*, mdecrypt.*
mcrypt
mcrypt support => enabled
mcrypt_filter support => enabled
mcrypt.algorithms_dir => no value => no value
mcrypt.modes_dir => no value => no value[/code]

Solução de problemas

Apareceu o erro abaixo:

[code=”bash]ERROR: ‘phpize’ failed [/code]

Você deve instalar o php7.2-dev

[code=”bash]apt-get install php7.2-dev[/code]

Instalando o PHP 5.6 no Ubuntu 16.04 (Xenial)

Lembrando que é necessário estar como super usuário para conseguir realizar as ações abaixo.

sudo su

Depois adicionar a dependência do PHP 5.6 e atualizar a lista de pacotes:

add-apt-repository ppa:ondrej/php
apt-get -y update

Então instalamos o Apache e MariaDB (esqueça o MySQL)

apt-get install -y apache2
apt-get install -y mariadb-server mariadb-client

Nesse ponto precisamos startar o MySQL

service mysql start
mysql_secure_installation

Então instalamos o PHP 5.6 e alguns pacotes essenciais:

apt-get install -y php5.6
apt-get install -y php5.6-mcrypt php5.6-mbstring php5.6-cli php5.6-mysql php5.6-gd php5.6-curl php5.6-intl php5.6-xsl php5.6-zip php5.6-soap
apt-get install -y curl libcurl3 libcurl3-dev

Vamos instalar também o PHPMyAdmin para facilitar nossa vida.

 apt-get install -y phpmyadmin 

Após isso realizamos algumas configurações básicas como habilitar o rewrite necessário para a URL amigável e o mCrypt, uma biblioteca que adiciona segurança (utilizado pelo Magento).

a2enmod rewrite
phpenmod mcrypt

E por fim reiniciamos o apache:

service apache2 restart

Fim.

Postando em uma Página do Facebook com PHP (CURL)

Obs: Tem um vídeo no final do post onde ensino tudo isso.

Resolvi criar esse tutorial para ajudar pessoas que precisam publicar um texto ou link em uma página do Facebook.

Exemplo de utilização: você tem um site e quer que logo após postar uma notícia que ela seja seja compartilhada no Facebook em forma de link para trazer leitores pro seu site.

Minha motivação para esse tutorial foi que depois de perder horas pesquisando na internet e na documentação do Facebook, descobri que é simples fazer isso sem o SDK deles.

Primeiro, temos que pegar o token de acesso para o local em que desejamos postar, seja na timeline de uma pessoa ou de uma página.

Nesse exemplo vamos publicar em uma página, mas o procedimento para publicar em uma timeline de pessoa é ainda mais simples, abordarei isso rapidamente no vídeo do final.

Acessamos o seguinte link para pegar o token:

https://developers.facebook.com/tools/explorer/

Primeiro selecionamos o app que será utilizado.

Em seguida clicamos em “Get token” e depois em “Get user access token”, e na janela que se abre marcamos uma dessas opções: manage_pages e publish_stream.

Após marcar as opções clicamos em “Get Access Token”.

Nas telas seguintes autorize o que o Facebook perguntar.

Segundo passo é pegar o ID da página desejada.

Clique novamente no botão “Get Token” e note que agora ele mostra todas as páginas que você tem acesso, selecione a desejada e clique no botão azul Submit.

Isso exibirá o ID da página, copie ele e também o “Access Token” que fica no input acima (o access token tem validade curta, no vídeo ensino como pegar um de maior duração).

Com essas duas informações vamos ao código necessário:

Obs.: caso não tenha o CURL instalado, clique aqui.


<?php
$page_access_token = 'XXXXXXX';
$page_id = 'YYYYYYYY';

// E as informações do que será postado.
$data['picture'] = "http://www.exemplo.com/imagem.jpg";
$data['link'] = "http://www.seulink.com.br/";
$data['message'] = "Mensagem (opcional)";
$data['caption'] = "Legenda (opcional)";
$data['description'] = "Descrição do link (opcional)";

Na verdade todos os campos acima são opcionais desde que ou o link ou o message estejam presentes.

Para mais informações aqui está a documentação: https://developers.facebook.com/docs/reference/api/post/

Continuando…


$data['access_token'] = $page_access_token;
$post_url = 'https://graph.facebook.com/'.$page_id.'/feed';

// E pra finalizar fazemos o post para o Facebook:

$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $post_url);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$return = curl_exec($ch);
curl_close($ch);
?>

O retorno o ID do post que poderia ser utilizado para apaga-lo ou edita-lo ou um erro.

Espero que isso resolva o problema de muita gente, pois a documentação do Facebook é péssima quando você quer uma coisa mais prática, eles tentam sempre te empurrar o SDK, o que não é necessário para coisas simples como essa.

Links úteis:

 

Melhorando o desempenho com o uso de Cache

Antigamente os sites eram mais estáticos, poucos deles apresentavam conteúdo dinâmico vindo de um banco de dados.

Mas hoje, é dificil ver um site estático e com isso a preocupação com o desempenho que antes era um luxo hoje é um requisito muito importante.

Pensando nisso, foram criados vários scripts de cache e o que vou apresentar hoje é o Cache Lite (PHP).

Download do Cache Lite

 <?php

// Inclui a classe Cache Lite
require_once("Lite.php");

// Seta um nome para o cache
$id = "nosso_cache";

// Seta as configurações
$options = array(
cacheDir" => "cache/",
"lifeTime" => 50
);

// Instancia o objeto Cache Lite
$objCache = new Cache_Lite($options);

// Teste se já existe um Cache válido
if ($quote = $objCache->get($id))
{
// Se existe ele exibe o conteudo que estava no cache
echo $quote;

// Adiciona no fim do conteúdo um indicador que veio do cache (só para exemplo)
echo " [cached]";
}
else
{
// Se ainda não existe um cache para esse conteudo, devemos criar o conteúdo, exibi-lo e depois armazena-lo no cache para que a próxima consulta não seja criada e sim retornada do cache

//Criamos o resultado
$quote = "Aprendendo como utilizar o cache";

//Exibimos o resultado
echo $quote;

//Armazenamos no cache
$objCache->save($quote, $id);
}

?> 

O resultado se o cache não existir seria:

Aprendendo como utilizar o cache

E se ele existir seria

Aprendendo como utilizar o cache [cached]

Dessa forma, ele só criará o resultado final se ainda não existir em cache e também se não estiver com a validade vencida. Leia sobre o lifetime na legenda no final do artigo.

Mas esse exemplo foi de uma simples frase, e como seria para um conteúdo vindo do banco de dados?

Simples:

<?php

// Inclui a classe Cache Lite
require_once("Lite.php");

// Seta um nome para o cache
$id = "nosso_cache";

// Seta as configurações
$options = array(
cacheDir" => "cache/",
"lifeTime" => 50
);

// Instancia o objeto Cache Lite
$objCache = new Cache_Lite($options);

// Teste se já existe um Cache válido
if ($quote = $objCache->get($id))
{
// Se existe ele exibe o conteudo que estava no cache
echo $quote;

// Adiciona no fim do conteúdo um indicador que veio do cache (só para exemplo)
echo " [cached]";
}
else
{
//esta função vai armazenar o resultado que vai pra tela do usuário
ob_start();

?>
<html>
<head></head>
<body>
Aprendendo como utilizar o <i>cache</i>
</body>
</html>
<?php

// terminou de gerar a página

// obtem o conteúdo que foi armazenado
$conteudo = ob_get_contents();

// salva o conteudo
$objCache->save($conteudo, $id);

// exibe o conteudo na tela do usuário
ob_end_flush();
}

?>

Viu  como é simples?

Legenda:

  • cacheDir :: pasta onde serão armazenados os arquivos gerados do cache
  • lifetime :: tempo de vida do arquivo de cache em segundos. É necessário para que quando você pergunte se existe um cache válido ele retorne falso quando não existir o arquivo e também quando existir, porém com a validade vencida
  • $id :: utilizei essa variável para armazenar o nome do arquivo do cache. É interessante utilizar essa função em conjunto com a md5() para que o nome do arquivo não contenha caracteres inválidos como a interrogação ? ou barras / que são normais em urls.

Algum erro que eu tenha cometido ou uma sugestão de melhoria avise pelo comentário ok?

Abraços!