PHP 5.3.1 + mysql time out connection

A nova versão do php, a 5.3.1 trabalha com um driver nativo do mysql (mysqlnd)

Caso tenha algum problema para conectar ao mysql após a atualização do PHP para a versão 5.3.1, verifique o seu arquivo de Hosts

No windows : C:\Windows\System32\drivers\etc\hosts

No linux:     /etc/hosts

altere  a seguinte linha
de ->      ::1 localhost

para->   #::1 localhost

ou seja, simplesmente comente a linha do IPV6

Referências :
http://stackoverflow.com/questions/1871112/cannot-connect-to-mysql-through-php

http://bugs.mysql.com/bug.php?id=6348

http://bugs.php.net/bug.php?id=47820

PHP 5.3.1 + Ldap + SSL + Apache + Moodle

Após atualização das versões :

Apache: 2.2.11  para : 2.2.14

PHP : 5.2.8       para: 5.3.1

Moodle : 1.9.6  para: 1.9.7

SO : Windows 2008

A autenticação do Moodle no Ldap (Active Directory ) deixou de funcionar, ou seja, não se conseguia conectar ao servidor do Active Directory para autenticar os usuários.

O Active Directory estava rodando sobre conexão segura (ssl) na porta : 636

Para testar o motivo da não conexão ao Active Directory, fiz um script simples em PHP

<?php

$ip_ad = “ldaps://ip_do_servidor_do AD”;
$user_ad=”esquemauser@nome_dominio”;
$pass_ad = “senha_user_esquemauser”;
$port_ad=”636″;
$dn=”dc=nome_dominio”;

//Conecta ao AD
$ds=ldap_connect($ip_ad ,$port_ad) or die(ldap_error()).”Nâo foi possível conectar ao AD”;

ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
$r=ldap_bind($ds,$user_ad,$pass_ad);

if(!$r)
echo “ERROR”;
else
echo “OK”;

//mostra erros do ldap
ldap_get_option($ds,LDAP_OPT_ERROR_STRING,$error);
echo $error;
?>

onde era obtido o seguinte erro do Ldap :

error:14090086:SSL
routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

após várias consultas ao google consegui localizar o bug do PHP em

http://bugs.php.net/bug.php?id=48866

onde nos diz que temos que simplesmente alterar o caminho do arquivo : ldap.conf

anteriormente era : C:\OpenLDAP\sysconf\ldap.conf

e na versão 5.3 deverá ser em : c:\ldap.conf

e não se esquecer de restartar o Windows ( não basta apenas restartar o apache)

Indico a leitura dos seguintes artigos :

Problemas de acentos no Active Directory – adicionar usuário active directory

Recentemente necessitei criar várias contas de usuários no Active Directory (AD) importando os dados de uma base de dados Mysql.
Ao importar o nome do usuário, os que possuíam acentos , eram criados no AD incompletos:
Exemplo :
Usuário : José Thomé de Araújo
era criado no Ad : Jos Thom de Ara jo
Este problema solucionei da seguite forma :

$nome_usuario=utf8_encode($nome_usuario);

Codificar a string em UTF 8

Exemplo de script em linguagem de programação PHP para criar automaticamente usuários no AD

/*
Script: cria_CN_professores.php
Desenvolvedora: Gisele Rodrigues Brugger – giselebrugger@gmail.com
Data: 17/05/2009
Descricao: script irá primeiramente fazer uma busca no banco de dados mysql (tabela professores) e localizar todas os professores e verificar a existência dos mesmos no Active Directory, e caso os mesmos não existam , eles serão criados.
*/

include(“includes/info_mysql.php”); // arquivo contendo informaçoes de conexao a base de dados myqsl
include(“includes/info_ad.php”); // arquivo contendo informcaoes de conexao com o AD
include(“includes/funcoes.php”); // arquivo contendo funcoes de manipulacao de strings

//conecta ao AD
$ds=ldap_connect($ip_ad ,$port_ad) or die(ldap_error()).”Nâo foi possível conectar ao AD”;

if ($ds){
//seta algumas variáveis
ldap_set_option($ds, LDAP_OPT_PROTOCOL_VERSION, 3);
ldap_set_option($ds, LDAP_OPT_REFERRALS, 0);
$r=ldap_bind($ds,$user_ad,$pass_ad);

$query1=mysql_query(“SELECT matricula_professor, nome_professor from professores “)or die (mysql_error());

echo “Cria CNS – CRIA CNs professores dentro da OU=Professores “;
$conta_novos_professores=0; // contador de nr de novos professores
$total_usuarios_encontrados=0; // contador de nr de professores verificados

while($row=mysql_fetch_array($query1)){

$matricula_professor=trim($row[“matricula_professor”]); // campo contendo o nr de matricula do professor na tabela professores
$nome_professor=trim($row[“nome_professor”]); // campo contendo o nome completo do professor na tabela professores

echo “antes->” . $nome_professor;
$nome_professor=FisrtToUpper($nome_professor);
$nome_professor=utf8_encode($nome_professor); // codifica a string em UTF8
echo “depois->” . $nome_professor;

//fazer busca no AD para verificar se existe a CN do professor selecionado
$justthese = array(“cn”);
$filter = “cn=”.$matricula_professor;
$sr=ldap_search($ds,$dn, $filter, $justthese,0,0,0);
$total_cn_encontrada=ldap_count_entries($ds,$sr);

if( $total_cn_encontrada == 0){
//não existe ainda a CN no AD e irá ser criada
//ps: a senha do usuario deverá ser trocada no primeiro login
//objectClass : top;person;organizationalPerson;user

$add[“cn”][0]=$matricula_professor;
$add[“sn”][0]=$matricula_professor;
$add[“userPrincipalName”][0]=$matricula_professor.$dominio;
$add[“DisplayName”][0]=$nome_professor;
$add[‘description’] =$nome_professor;
$add[‘sAMAccountName’] =$matricula_professor;
$add[“name”][0]=$matricula_professor;
// conta do usuario será criada já habilitada e sem senha(cod 544 = 512+32)
//explicacao: consulte ->
// Como usar os sinalizadores UserAccountControl para manipular as propriedades da conta de usuário http://support.microsoft.com/?id=305144

$add[“UserAccountControl”] = “544”;

//forcar usuario a trocar senha no primeiro acesso
$add[“pwdLastSet”]=”0″;

//Ps : você conseguira setar a senha do usuario apenas se o AD estiver rodando em conexao segura, ou seja , porta 636
//detalhes em : http://support.microsoft.com/?scid=kb%3Bpt-br%3B321051&x=15&y=12
//http://adldap.sourceforge.net/wiki/doku.php?id=ldap_over_ssl

//$add[‘userPassword’] =$senha_padrao_aluno;

$add[“objectclass”][0]=”top”;
$add[“objectclass”][1]=”person”;
$add[“objectclass”][2]=”organizationalPerson”;
$add[“objectclass”][3]=”user”;
// print_r($add); // exibe o vetor de objetos do usuario
/* Sintaxe no AD
dsadd user [-samid ] [-upn ] [-fn ] [-mi ] [-ln ] [-display ] [-empid ] [-pwd { | *}] [-desc ] [-memberof …] [-office ] [-tel ] [-email ] [-hometel ] [-pager ] [-mobile ] [-fax ] [-iptel ] [-webpg ] [-title ] [-company ] [-mgr ] [-hmdir ] [-hmdrv :][-profile ] [-loscr ] [-mustchpwd {yes | no}] [-canchpwd {yes | no}] [-reversiblepwd {yes | no}] [-pwdneverexpires {yes | no}] [-acctexpires ] [-disabled {yes | no}] [{-s | -d }] [-u ] [-p { | *}] [-q] [{-uc | -uco | -uci}]

Sintaxe no PHP
ldap_add ( resource $link_identifier , string $dn , array $entry )
*/
$nome_OU_pai=”cn=”.$matricula_professor.”,ou=Professores,”.$dn;

echo $nome_OU_pai;

$r= ldap_add($ds,$nome_OU_pai,$add); //adiciona novo usuario no AD
if(!$r){
echo “ERRO !!! CN -> ” . $matricula_professor . ” -> não foi adicionada.“;

}
else{
echo “CN -> “. $matricula_professor . “-> adicionado com SUCESSO “;
$conta_novos_professores ++;
}

}//fi do if

$total_usuarios_encontrados ++;

}//fim do while

echo “Total de professores verificados= ” .$total_usuarios_encontrados;
echo “Total de novos professores adicionados= ” . $conta_novos_professores;
ldap_close($ds);
mysql_close();
}
?>

arquivos dos includes



funcoes.php

function loCase($string){
$string = strtolower($string);
$string = str_replace(“”,”â”,$string);
$string = str_replace(“Á”,”á”,$string);
$string = str_replace(“Ô,”ã”,$string);
$string = str_replace(“A”,”à”,$string);
$string = str_replace(“Ê”,”ê”,$string);
$string = str_replace(“É”,”é”,$string);
$string = str_replace(“I”,”Δ,$string);
$string = str_replace(“Í”,”í”,$string);
$string = str_replace(“Ó”,”ó”,$string);
$string = str_replace(“Õ”,”õ”,$string);
$string = str_replace(“Ô”,”ô”,$string);
$string = str_replace(“Ú”,”ú”,$string);
$string = str_replace(“U”,”û”,$string);
$string = str_replace(“Ç”,”ç”,$string);
return ($string);
}
//funcao retira acentos
function SemAcentos($string){

$string = str_replace(“”,”a”,$string);
$string = str_replace(“â”,”a”,$string);
$string = str_replace(“Á”,”a”,$string);
$string = str_replace(“á”,”a”,$string);
$string = str_replace(“Ô,”a”,$string);
$string = str_replace(“á”,”a”,$string);
$string = str_replace(“ã”,”a”,$string);

$string = str_replace(“Ê”,”e”,$string);
$string = str_replace(“ê”,”e”,$string);
$string = str_replace(“É”,”e”,$string);
$string = str_replace(“é”,”e”,$string);

$string = str_replace(“I”,”i”,$string);
$string = str_replace(“í”,”i”,$string);
$string = str_replace(“Í”,”i”,$string);

$string = str_replace(“Ó”,”o”,$string);
$string = str_replace(“ó”,”o”,$string);
$string = str_replace(“Õ”,”o”,$string);
$string = str_replace(“ô”,”o”,$string);
$string = str_replace(“Ô”,”o”,$string);

$string = str_replace(“Ú”,”u”,$string);
$string = str_replace(“ú”,”u”,$string);

$string = str_replace(“Ç”,”c”,$string);
$string = str_replace(“ç”,”c”,$string);

$string = str_replace(“º”,””,$string);
$string = str_replace(“ª”,””,$string);

return ($string);

}

function FisrtToUpper($string){
//converte tudo para minusculo
$string=strtolower($string);
//converte para maiusculo o primeiro caracter de cada palavra
$string=ucwords($string);
return ($string);
}

function Concantena_string($string){
//concatena a string retirando espacos em branco
$string=str_replace(” “,””,$string );
return ($string);
}
?>

/*
Script: info_ad.php
Desenvolvedora: Gisele Rodrigues Brugger – giselebrugger@gmail.com
Data: 19/03/2009
Informa os dados para conexão com o Active Directory (AD)
*/

$ip_ad = “nome_do_servidor_do_Active_Directory”;
$user_ad=”nome_do_usuario_do_AD_com_permissao_alterar_esquema@dominio”;
$pass_ad = “senha_do_usuario”;
$port_ad=”389″;
$dn=”dc=nome_do_dominio”;
$dominio=”@nome_dominio”;
$senha_padrao_aluno=”123456″ ;
?>

/*
Script: info_mysql.php
Desenvolvedora: Gisele Rodrigues Brugger – giselebrugger@gmail.com
Data: 19/03/2009
Informa os dados para conexão com a base de dados MYSQL
*/
$host_mysql = “nome_do_servidor_mysql”; //ou IP
$base_mysql = “nome_base_de_dados_mysql”;
$user_mysql = “nome_usuario_mysql”;
$pass_mysql = “senha_usuario_mysql”;
$conecta=mysql_connect($host_mysql,$user_mysql,$pass_mysql);
mysql_select_db($base_mysql);
?>