Recentemente realizei a instalação de um sistema de ajuda/knowledge base rodando com base em Mediawiki e MySQL, porém após alguns dias quando já havia muito conteúdo e diversos usuários registrados fui notificado que a pesquisa (search) não estava sendo realizada corretamente e não retornava nenhum resultado ao serem pesquisadas as palavras php e asp (que abrangem boa parte do conteúdo até o momento).
Após algum tempo pesquisando verifiquei que o sistema de busca padrão do Mediawiki é o “fulltext search”, que por padrão ignora quaisquer palavras com menos de 4 caracteres nas pesquisas.
Para contornar esta situação era necessário setar o padrão mínimo de caracteres para 3 diretamente no banco de dados através do próprio my.cnf setando a variável “ft_min_word_len” para o valor desejado e reiniciando o serviço do MySQL:
[mysqld]
…
ft_min_word_len=3
E após a alteração do banco de dados é necessário recriar os índices de pesquisa do Mediawiki para utilizar o novo padrão, para realizar esta operação entre com a seguinte query em sua base de dados:
REPAIR TABLE searchindex QUICK;
Lembrando que a tabela searchindex pode ter o nome diferente dependendo do prefixo utilizado durante a instalação do mediawiki / criação da base de dados, por exemplo, se meu prefix é “wiki_” a minha tabela terá o nome “wiki_searchindex”.
Maiores informações de fulltext search na documentação oficial do MySQL…
Lembrando que existem diversas engines que aprimoram o sistema de busca do Mediawiki, como Lucene-search e Sphinx, se seu sistema de wiki for relativamente grande ou complexo recomendo dar uma olhada…
Yesterday I was compilling a new release of PHP packages for Red Hat Enterprise 5 (RPM) in the x86_64 architecture and I got a bug during the compilation proccess of the php-mssql module that requires the freetds-devel package to be built.
By default, the configure script doesn’t find the required freetds libraries on the system (even if they are correctly installed) because in the lastest versions of freetds we don’t have the tds.h and libtds.a files.
To bypass this check and continue building your packages normally you can use this simple and dirty workarround:
$ touch /usr/include/tds.h
$ touch /usr/lib/libtds.a
Or you can edit the configure script (make a patch and apply during the build process) to find the correct files and directories.
Official report: http://bugs.php.net/bug.php?id=44991
Tanks to Brian for the help!
Recentemente realizamos a instalação do módulo Suhosin em todos os servidores da nova arquitetura de hospedagem da Locaweb de forma opcional para os clientes, porém boa parte dos desenvolvedores não conhece o potencial e as funcionalidades deste módulo que pode ser ativado facilmente em sua hospedagem compartilhada ou em seus próprios servidores.
Suhosin é um módulo avançado de proteção para servidores de aplicação rodando PHP, é foi desenvolvido para proteger tanto os servidores como os próprios desenvolvedores de vulnerabilidades nas aplicações construídas e no próprio core do PHP.
O módulo é compatível com instalações do PHP em qualquer sistema compatível, não apresentando problemas com outros módulos presentes na instalação, incluindo Zend Optimizer e APC.
Um dos recursos mais interessantes deste módulo é a encriptação transparente de cookies e dados de sessão, evitando inumeros ataques de “session hijacking” O módulo também realiza inumeros tipos de filtragem de dados em tempo real, evitando ataques DOS e scripts maliciosos sendo executados no servidor.
Para aqueles que precisam desenvolver aplicações em PHP com mais segurança em um ambiente controlado e auditado, o módulo é muito útil!
Ah sim, para aqueles que possuem planos de hospedagem Linux na Locaweb e desejam realizar a ativação do módulo, é necessário apenas adicionar a seguinte linha em seu arquivo php-cgi.ini:
extension=suhosin.so
Muitas vezes o horário de verão brasileiro pode afetar o funcionamento de nossas aplicações escritas em PHP que utilizem funções de data, e para que não aconteça nenhum problema existem algumas alternativas que podem ser adotadas para automatizar o processo de transição de horário (BRT/BRST).
A mais comum delas (e menos eficiente na minha opinião) é setar o horário diretamente no seu php.ini através da linha:
date.timezone = "Etc/GMT+2"
Sendo que também é possível utilizar esta chamada diretamente no script de sua aplicação com:
date_default_timezone_set("Etc/GMT+2");
A forma mais eficiente que encontrei para realizar estas transições de horário de forma automática foi utilizando o módulo php-timezonedb que está disponível através do PECL.
Para realizar a instalação do timezonedb é necessário ter as bibliotecas do php (php-dev) disponíveis na máquina.
A forma mais prática de instalação é diretamente através do repositório PECL:
# pecl install timezonedb
E para carregar o módulo na inicialização do PHP, adicione ao php.ini (ou uma entrada no php.d):
extension=timezonedb.so
Para testar o módulo sem a necessidade de reiniciar o servidor web utilize o próprio php-cli:
# php-cli -r "print date('d/m/Y H:i:s e T');"
A saída (em horário de verão) será algo parecido com:
04/02/2008 19:23:32 America/Sao_Paulo BRST
E em horário normal:
04/02/2008 19:23:32 America/Sao_Paulo BRT
Para instalação em um número elevado de servidores é recomendável utilizar o proprio empacotamento de sua distribuicaopara automatizar o processo. Para aqueles que utilizam distribuicoes baseadas em RPM, deixei o pacote source disponivel para download… php-timezonedb.el4.src.rpm
Suhosin é um avançado sistema de proteção que foi desenvolvido com o objetivo de proteger servidores e usuários de falhas nas aplicações escritas em PHP e implementar correções à própria base da linguagem. É separado em duas partes independentes que podem ser utilizadas em conjunto ou individualmente, sendo que uma delas é um patch a ser aplicado no core do PHP que implementa proteção contra vulnerabilidades do sistema (Engine Protection) e a outra parte é uma extensão que coloca em funcionamento todas as outras proteções e implementações de segurança.
Para aplicar o patch Suhosin será necessário recompilar o PHP do servidor!
Para descrever os processos de instalação estarei me baseando em sistemas RedHat (RPM), porém os procedimentos principais são os mesmos em qualquer distribuição…
Aplicando Suhosin Patch
Primeiramente faça o download do pacote Suhosin, da signature key da release a partir do site oficial e os fontes do PHP que utilizaremos para embutir o patch, e não se esqueça de verificar o md5 em todos os arquivos após o download para garantir que os fontes estão intactos.
Baixando a signature key e importando para nosso GNU Privacy Guard keychain:
wget http://www.hardened-php.net/hardened-php-signature-key.asc
gpg –import < hardened-php-signature-key.asc
Como este tutorial está baseado em RedHat, baixe e instale o pacote source da sua versão do php (ie. rpm -ivh php-5.1.6-12.el5.src.rpm) e entre em seu diretório source do rpmbuild (ie. /usr/src/redhat/SOURCES), lembrando que em outras distribuições é necessário entrar no diretório onde o fonte do PHP se encontra.
Agora, faça a checagem da gpg no arquivo .sig baixado:
gpg suhosin-patch-5.1.6-0.9.6.patch.gz.sig
Descompacte o patch do Suhosin na pasta dos sources e renomeie o patch nos padrões RedHat (é mais frescura mesmo, somente para quem usa distro RPM based) , e então entre na pasta dos SPECs e edite o arquivo referente ao PHP:
mv suhosin-patch-5.1.6-0.9.6.patch
php-5.1.6-suhosin.patchcd /usr/src/redhat/SPECS/
vi php.spec
Adicione “Patch0: php-5.1.6-suhosin.patch” no bloco onde são definidos os patches a serem aplicados, mas lembre-se que caso o patch “ecalloc” estiver presente no spec ele deve ser desativado por apresentar conflitos com suhosin.
Adicione também a linha “%patch0 -p1 -b .suhosin” ao bloco %setup -q para entrar na compilação, segue exemplo:
[...]
Source51: php.iniPatch0: php-5.1.6-suhosin.patch
Patch1: php-5.1.4-gnusrc.patch
Patch2: php-5.1.4-warnings.patch
Patch5: php-4.3.3-install.patch
Patch6: php-5.0.4-norpath.patch
Patch7: php-4.3.2-libtool15.patch
Patch13: php-5.0.2-phpize64.patch
# Patch14: php-5.1.6-ecalloc.patch
[...]
%setup -q
%patch0 -p1 -b .suhosin
%patch1 -p1 -b .gnusrc
%patch2 -p1 -b .warnings
%patch5 -p1 -b .install
%patch6 -p1 -b .norpath
%patch7 -p1 -b .libtool15
%patch13 -p1 -b .phpize64
# %patch14 -p1 -b .ecalloc
[...]
Após as modificações recompile o PHP com:
rpmbuild -ba php.spec
Podem ser apresentadas diversas dependências que necessáriamente devem ser instaladas no sistema antes da compilação, para usuários RHEL, Fedora e CentOS podem utilizar o yum ou up2date. Para instalação a partir dos fontes ou em outras distribuições, instale todos os pacotes necessários antes de iniciar o processo de compilação.
Após o final da compilação e empacotamento os pacotes estarão disponíveis em /usr/src/redhat/RPMS/i386 e já podem ser instalados com o suhosin-patch embutido.
Instalando a extensão Suhosin
Descompacte os fontes e compile com:
tar xvfz suhosin-0.9.20.tgz
cd suhosin-0.9.20
phpize
./configure
make
make install
Para habilitar a extensão vamos incluir um novo arquivo de include para o PHP com o conteúdo “extension=suhosin.so“, ou adicione a linha diretamente ao php.ini. Para ativar o novo módulo apenas reinicie o Apache.
Apesar da instalação padrão já atender a maioria dos usuários, você pode personalizar as configurações do Suhosin para atender as necessidades de seu ambiente, para isso é disponível um manual diretamente no site oficial.