Eliminando PHP short tags com regex

Escrevi uma regex para substituir short tags do PHP, a única coisa diferente da maioria que eu encontrei foi que me preocupei em manter as quebras de linhas – e não quebrar nenhuma parte do código comendo caracter (encontrei várias sugestões com regex que acabam “comendo” caracter dependendo do caso).

A expressão regular (regex):

<\?([^p|=])

O replace:

<?php $1

Explicando a REGEX:

Ela irá buscar por qualquer <? que não seja seguido imediatemente por um “p”, garantindo que <?php não case com a regex, ou seguido por um “=” – garantindo que <?= não case com a regex.

Os parêntesis da REGEX criam um grupo de captura que é utilizado no replace, isto serve para casos específicos como

<?if(

O i seria “engolido” neste caso. O grupo de captura também captura quebras de linha, isso garante que:

<?
if($x = $y)

Se transforme em:

<?php
if($x = $y)

E não em:

<?php if($x = $y)

Mantendo a mesma legibilidade e formatação do código original após o replace.

Não encontrei nenhuma situação em que esta regex causou problema, se ela não funcionar em algum caso comente aí.

Datas recursivas com PHP

Em um dos projetos que estou trabalhando eu precisei trabalhar com datas recursivas a partir de uma data inicial e de uma periodicidade. 

Datas no PHP

Não vou abordar a fundo como trabalhar com datas no PHP, apenas como adicionar determinado número de dias em uma data. Se você não tem ideia de como trabalhar com datas no PHP, recomendo começar pelo manual do PHP date() date(). 

Mas o conceito de recursividade é simples e vou explicar abaixo o funcionamento de cada passo para gerar datas repetidas com PHP.

Formatando a data de hoje

Primeiro, o básico de formatação de datas com PHP. Estou trabalhando com MySQL (date), portanto trabalho com a seguinte formatação.

date('Y-m-d');

O código acima vai retornar a data de hoje no formato ano-mes-dia.

Adicionar dias em uma data

Para dar início a recursividade a lógica é: tenho uma data e preciso saber qual será a data daqui X dias, e assim sucessivamente. Para adicionar dias a uma data usamos a função strtotime (veja o manual) do PHP junto com date. 

No exemplo abaixo o resultado deve ser a data formatada para exatamente daqui a 7 dias.

date('Y-m-d', strtotime(date('Y-m-d') . '+7 days'));

Recursividade de datas

Com estes 2 conceitos básicos sobre datas no PHP e um pouco de criatividade você consegue gerar datas recursivas no PHP

No exemplo abaixo, vou pegar as próximas 10 datas a partir de hoje, com uma periodicidade de 15 dias e colocar no array $myDates;

$lastDate = date('Y-m-d');
$myDates = array();
for ($x=0; $x<=10; $x++){
  $myDates[] = $lastDate;
  $lastDate = date('Y-m-d', strtotime($lastDate . ' +15 days'));
}

Recursividade de datas por período

Indo um pouco mais longe, você pode fazer seleções de datas dentro de janela de tempo usando quase a mesma lógica – mas deve tomar cuidado para não gerar loop infinito no seu código.

No exemplo abaixo, quero retornar todas as datas a partir de hoje, contando de 15 em 15 dias, até a data limite de 4 de Dezembro.

$lastDate = date('Y-m-d');
$endDate = '2014-12-04';
$myDates = array();
$finished = false;
while(!$finished){
  $lastDate = date('Y-m-d', strtotime($lastDate . ' +15 days'));
  if(strtotime($lastDate) > strtotime($endDate)){ $finished = true; break; }
  $myDates[] = $lastDate;
}

Usando a mesma verificação do $endDate você pode configurar uma data inicial e uma final, selecionando apenas as datas dentro deste período.

Talvez existe algum método mais eficiente de fazer isso. Quando pesquisei sobre o assunto encontrei a biblioteca When, mas ela não era exatamente o que eu queria. 

Se você precisa saber quando serão as próximas Quarta-Feiras que irão cair em um dia 2 de Fevereiro, é a biblioteca para você, vale conferir. Se você optar pela When tome cuidado com os loops infinitos que ela pode gerar.

CodeIgniter Datamapper – Selecionando objetos que não tenham determinados relacionamentos

Faz tempo que trabalho com Code Igniter e gosto muito do Datamapper (leia mais sobre este ORM aqui). Hoje surgiu uma necessidade nova em um projeto e achei interessante o suficiente para compartilhar aqui. Em uma relação many to manycomo selecionar objetos que não tenham um relacionamento específico?

Por exemplo, tenho os models product e category, com relacionamento de muitos para muitos nos dois casos (um produto pode ter várias categorias e uma categoria pode ter vários produtos).

Como selecionar produtos que não estejam na categoria canecas, por exemplo?

A resposta curta é: subqueries.

// query para pegar todos os produtos que tem categoria "canecas"
$sub_products = new Product();
$sub_products->select('id')->where_related_category('name', 'canecas');
// Agora usando subqueries, pega todos que não estão na categoria
$products = new Product();
$products->where_not_in_subquery('id', $sub_products)->get();

E se você precisa selecionar por exemplo todos os produtos que não estão relacionados com nenhuma categoria é só fazer um select que atenda na sua subquery, como por exemplo:

$sub_products->select('id')->where_related_category('id > 0');

Tem uma solução diferente? Deixa aí nos comentários!

Como limpar o cache do WordPress por linha de comando

Estou trabalhando em alguns projeto utilizando o WordPress como CMS e em situações específicas eu precisava limpar o cache de todo o site. Não sou fã da plataforma, acho que a performance deixa muito a desejar, mas não posso negar que ela é cheia de facilidades.

Sei que posso fazer apagar o cache por dentro do wp-admin, mas no ambiente de desenvolvimento ou se meu “trigger” para a limpeza de cache é externo, um caminho muito fácil é apagar fisicamente todos os arquivos de cache do WordPress.

Os arquivos de cache ficam em wp-content/cache e podem ter extensões .html, .gz e também .meta. Então com um simples find na linha de comando (unix) você consegue limpar o cache do WordPress com a linha abaixo:

find /var/www/wordpress.gssolutions.com.br/public/wp-content/cache/ \( -name '*.html' -or -name '*.html.gz' -or -name '*.meta' \) -delete

Lembre-se de substituir o caminho (/var/www/wordpress.gssolutions.com.br/public) pelo caminho da instalação do WP no seu servidor.

Tem uma solução melhor para lidar com estas situações? Deixe nos comentários 🙂

Como encontrar o PHP.ini?

Já tive problemas para encontrar o PHP.ini no MacOS, eu alterava as configurações do meu arquivo php.ini, reiniciava o meu apache e as mudanças não eram aplicadas.

Já imaginava que era isso, então descobri que eu estava alterando um php.ini que não estava sendo carregado pelo PHP na minha máquina.

Como descobrir onde está o PHP.ini?

Você pode criar uma página que exiba toda a configuração do PHP e exiba em seu navegador, para isso crie um arquivo com o seguinte:

<?
phpinfo();
?>

Coloque o arquivo em uma pasta acessível pelo seu Apache e abra ela no navegador, esta página exibe todas as configurações do seu PHP.

Procure por “configuration file” e lá estará o caminho (path) do arquivo de configuração carregado pelo PHP.

Descobrindo o php.ini no terminal

Se você tem acesso a um terminal pode exibir todas as informações do php.ini direto no terminal, para isso digite:

php -i

E para facilitar a identificação do caminho completo do seu arquivo de configuração do PHP (php.ini) execute o seguinte comando no terminal:

php -i | grep 'Configuration File'<br>

Espero ter te ajudado a encontrar o caminho do php.ini.


Graças ao google os artigos mais acessados do O Desenvolvedor são os que responsem dúvidas simples com respostas rápidas, quer saber mais sobre PHP? Leia também: