Archivo de la categoría: PHP

Todo lo relacionado con la programación en PHP

«SCRAM-SHA-1» authentication mechanism requires libmongoc built with –enable-ssl

Vamos a ponernos en antecedentes, estaba con una contenedor de Docker, para ser mas claros el de WordPress, en el cual quería habilitar unos módulos de PHP que necesitaba, uno de ellos el de mongodb. La instalación de la extensión de MongoDB para PHP se realiza, como la mayoría de los modulos con pecl. El modulo que estoy instalando es la versión 1.4.1.

# pecl install mongodb

Bien una vez realizado esto, el código que tenia ejecutándose en esta maquina me ha devuelto este bonito error, buscando documentación he encontrado que el motivo de este error es que para usar el mecanismo de autentificación SCARM-SHA-1 debe estar habilitado en el modulo de php de mongodb el libmongoc SSL, el cual no se habilita cuando se instala el modulo. Solución,  pues lo mas fácil es:

      1. Desinstalamos el modulo si lo tenemos
        # pecl uninstall mongodb
      2. Debemos comprobar si tenemos instalado el libssl-dev, y si no instalarlo, por ejemplo en sistemas Debian (Ubuntu, Mint)
        # sudo apt-get install libssl-dev
      3. Una vez instalado, podemos o bien descargar el mongodb-1.4.1 u otra versión desde la web de pecl o bien utilizar el que hemos descargado anteriormente que seguramente esta en los temporales. Pecl MongoDB
      4. Ahora viene la parte mas «complicada», descomprimimos el fichero, y nos ubicamos dentro de la carpeta que se ha generado por medio del terminal:
        # descomprimidos el fichero descargado
        $ tar -xvf mongodb-1.4.1.tgz
        # Accedemos a la carpeta
        $ cd mongodb-1.4.1
        # Ejecutamos dentro de la carpeta el phpize
        $ phpize
        # Una vez ejecutado configuramos la extensión asi - Comprobar la salida de la
        # instalación con pecl para ver donde esta la ruta de --with-php-config
        $ ./configure --with-php-config=/usr/local/bin/php-config --with-mongodb-ssl=openssl
        # Finalizada la configuración correctamente generamos la extensión
        $ make
        # Ahora copiamos las extension generada al directorio donde estan nuestras
        # extensiones. Se puede comprobar con el phpinfo() o con php -i en linea
        $ cp modules/mongodb.so /directorio/php/modules/
        
      5. Ya solo queda cargar la extensión, si no lo habíamos hecho antes agregando la linea «extension=mongodb.so» a nuestro php.ini o creando el fichero en el directorio de carga de extensiones de PHP.

     

Anuncio publicitario

Como aumentar y reducir las fechas con PHP

DateTime es una clase la cual nos ayuda a manejar las fechas y las horas con PHP desde la versión 5.2.0, aunque yo me he encontrado problemas con algún metodo con esta versión. No es una operación muy habitual pero es posible que alguna vez nos veamos en la necesidad de aumentar o reducir una fecha. La manera general es usando el DateInterval, pero la nomenclatura de este puede ser un tanto liosa, ya que por ejemplo para representar un dia tienes que pasa P1D como parametro y cosas asi. Una manera mas sencilla es utilizando el metodo modify.

// Creamos el objeto fecha con el dia actual
$fecha = new DateTime();
// Agregamos 1 dia a la fecha
$fecha->modify('+1 day');
// Quitamos 1 dia a la fecha
$fecha->modify('-1 day');

Aparte de day para dia podemos usar week, month, year para fechas.

Mas información DateTime modify en PHP

 

Detección de Genero con Gender API o Genderize.io

A la hora de detectar el genero de una persona en base al nombre, nos podemos ayudar de dos servicios web, gender API y Genderize.io. Los dos funcionan estupendamente, y los dos tienen un limite de peticiones, y funcionan los dos muy rápidos, y tienen los  dos un funcionamiento prácticamente igual. He creado un gist que usa los dos servicios, por defecto usa Gender API, y que esta configurado para España, aunque se puede cambiar para cualquier país cambiando el código de país.


function generoPersona($nombre, $provider = 'genderAPI')
{
$providers = array(
'genderAPI' => array(
'url' => 'https://gender-api.com/get?name=',
'pais' => '&country=ES'
),
'genderize' => array(
'url' => 'https://api.genderize.io/?name=',
'pais' => '&country_id=es'
)
);
if (array_key_exists($provider, $providers)) {
$dataProvider = $providers[$provider];
}
$generoPersona = 'Hombre';
$curl = curl_init($dataProvider['url'].$nombre.$dataProvider['pais']);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
$result = json_decode(curl_exec($curl));
if (is_a($result, 'stdClass') && property_exists($result, 'gender')) {
$generoPersona = ($result->gender == 'female')? 'Mujer' : 'Hombre';
}
return $generoPersona;
}

Mas info: https://gender-api.com y https://genderize.io

Uso de array_map para codificar los valores de un Array

En alguna situación nos podemos encontrar con la necesidad de tener que codificar todos los valores de un array. Un método largo seria por medio de un foreach o el for, o podemos usar array_map para aplicar una función a todos lo valores contenidos en el array.

 

$encodedArray = array_map("utf8_encode", $decodedArray);

Mas Info: http://php.net/manual/es/function.array-map.php

¿Como saber cuando cae el domingo de pascua de un año en particular con PHP? – Funciones curiosas de PHP

Hace poco que ha pasado la Semana Santa y las fechas en las que cae es algo que nos preguntamos cada año, es muy típica la conversación – ¿Oye el año que viene cuando cae Semana Santa?, puff ni idea.

Hagamos un poco de historia:

La fecha del Domingo de Pascua fue definida por el Concilio de Nicea en el año 325 D.C. como el domingo después de la primera luna llena que cae en o después del Equinocio de Primavera. El equinoccio se asume que cae en el 21 de marzo, por lo que el cálculo se reduce a determinar la fecha de la luna llena y la fecha del siguiente domingo.

Para poder calcular cuando cae ese Domingo en un año en particular, podemos usar 2 funciones con PHP, easter_days() y easter_date().

easter_date

Obtener la fecha Unix para la medianoche de Pascua de un año dado


<span class="type">int</span> <span class="methodname">easter_date</span> ([ <span class="methodparam"><span class="type">int</span> <code class="parameter">$year</code><span class="initializer"> = date("Y")</span></span> ] )

Si no le pasamos ningún parámetro nos devuelve la fecha Unix del domingo de pascua del año actual. Esta función tiene un problema, y es nos devolverá un error si en año no esta en el rango de 1970 y 2037, lo cual es lógico si nos devuelve la fecha Unix. Para calcular cuando cae el domingo de Pascua en años anteriores o posteriores a ese rango utilizaremos easter_days.

easter_days

Obtener el número de días despúes del 21 de marzo en el cuál cae Pascua para un año dado


<span class="type">int</span> <span class="methodname">easter_days</span> ([ <span class="methodparam"><span class="type">int</span> <code class="parameter">$year</code><span class="initializer"> = date("Y")</span></span> [, <span class="methodparam"><span class="type">int</span> <code class="parameter">$method</code><span class="initializer"> = CAL_EASTER_DEFAULT</span></span> ]] )

+ información: http://php.net/manual/es/function.easter-date.php http://php.net/manual/es/function.easter-days.php

Agregar mas de un destinatario al enviar Mails con Zend_Mail – Zend Framework

Supongamos el siguiente ejemplo de Zend_Mail


$mail = new Zend_Mail()

$mail->setBodyText('This is the text of the mail.');

$mail->setFrom('somebody@example.com', 'Some Sender');

$mail->addTo('somebody_else@example.com', 'Some Recipient');

$mail->addCc('somebody_else@example.com', 'Some Recipient');

$mail->addBcc('somebody_else@example.com', 'Some Recipient');

$mail->setSubject('TestSubject');

$mail->send();

Si queremos agregar mas de un destinatario al addTo(), addCc() y al addBcc() lo podemos hacer por medio de un array de direcciones de correo. En el caso del addTo() y el addCc(), estas arrays pueden ser asociativas, y en estas la key es el nombre del destinatario. Es decir:


$toRecipients = array('Some Recipient' => 'somebody_else@example.com', 'Other' => 'other@example.com');

$hideRecipients = array('one@example.com', 'two@example.com');

$mail->addTo($toRecipients);

$mail->addCc($toRecipients);

$mail->addBcc($hideRecipients);

+ Información: http://framework.zend.com/manual/1.12/en/zend.mail.adding-recipients.html

Función para eliminar los espacios no deseados dentro de un texto

Alguna vez nos podemos encontrar con que a la hora de que el usuario introduzca texto en nuestra aplicación, este de una manera «no voluntaria» nos ponga espacios en blanco extra. Esto lo podemos solucionar de una manera simple con un trim() o ltrim() o rtrim(), ¿pero que pasa si los espacios extras estan dentro del texto? Para esto he creado una función la cual nos deja solo un espacio entre palabras.

<?php
function quitaEspacios($texto)
{
$partes = explode(' ', $texto);
$textoLimpio = "";
foreach ($partes as $parte) {
if (strlen($parte) > 0 || $parte != "") {
$nombreLimpio .= $parte." ";
}
}
return trim($nombreLimpio);
}

PHP CURL POST & GET Examples – Submit Form using PHP CURL

Sourabh Jain

In PHP CURL POST tutorial, I have explained how to send HTTP GET / POST requests with PHP CURL library.

Below are the examples covered in this article.
1) Send HTTP GET Request with CURL
2) Send HTTP POST Requests with CURL
3) Send Random User-Agent in the Requests
4) Handle redirects (HTTP 301,302)
5) Handle Errors.

Why we need PHP CURL ?
To send HTTP GET requests, simply we can use file_get_contents() method.

1
file_get_contens('http://hayageek.com')

But sending POST request and handling errors are not easy with file_get_contents().

Sending HTTP requests is very simple with PHP CURL.You need to follow the four steps to send request.

step 1). Initialize CURL session

1
$ch= curl_init();

step 2). Provide options for the CURL session

1
2
3
curl_setopt($ch,CURLOPT_URL,"http://hayageek.com");
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
//curl_setopt($ch,CURLOPT_HEADER, true); //if you want headers

CURLOPT_URL ->…

Ver la entrada original 619 palabras más

Configurar visualización resultados Xdebug

A la hora de depurar en PHP una de las opciones que mas uso es el var_dump, el cual me da un volcado en pantalla de la variable que le pasamos. Esta función, usada sin Xdebug nos devuelve un volcado en texto plano el cual es un poco dificil de interpretar, aunque siempre podemos usarla en combinación con las etiquetas pre. Si tenemos activado el Xdebug, no hace falta ponerlo entre las etiquetas pre ya que la salida viene formateada.

Tomemos el siguiente ejemplo:


$variables = array(
 'uno' => array(
 'blanco' => array(
   'arriba' => array(
     'hola'
    ),
   'abajo' => array(
     'adios'
    )
   )
 )
);

var_dump($variables);

Si ejecutamos el var_dump sin tener Xdebug habilitado nos mostrara lo siguiente:

Captura de pantalla 2014-03-23 a la(s) 20.47.08Si lo ejecutamos con Xdebug habilitado

Captura de pantalla 2014-03-23 a la(s) 20.48.25Si veis, los valores de la tercera array anidada no se muestran, esto es debido a que los niveles de profundidad del Xdebug están establecidos como máximo a 3. Esto podemos modificarlo para que muestre los niveles de profundidad que nos interesen con estableciendo la variable xdebug.var_display_max_depth. En este ejemplo voy a establecer el nivel de profundidad a 4. El máximo valor que podemos establecer es 1023, y si no queremos poner limite la establecemos a -1. Para que esto funcione lo mas rápido es establecer su valor por medio del ini_set al principio del script.


ini_set('xdebug.var_display_max_depth', 4);

Ahora la visualización sera así

Captura de pantalla 2014-03-23 a la(s) 20.53.39

http://www.xdebug.com/docs/display

Uso de DateTime:sub – PHP Tips

DateTime::sub  — date_sub – Sustrae una cantidad de días, meses, años, horas, minutos y segundos de un objeto DateTime.

Esta función nos sirve para sustraer un intervalo de tiempo de un objeto DateTime, es decir, imaginemos que necesitamos quitarle a 10 días para hacer esto usaríamos el DateTime::sub()


$fecha = new DateTime('2014-03-21');

$fecha->sub(new DateInterval('P10D'));

echo $fecha->format('d-m-Y') . "\n"; // devolvera 11-03-2014

http://es1.php.net/manual/es/datetime.sub.php