Como hacer ping desde PHP

Cuando queremos «hacer algo» con algún equipo de nuestra red y éste no responde es por que probablemente este apagado/desconectado/colgado/etc, ping es lo primero que ejecutamos para confirmar nuestras sospechas.

Pero, y si hemos preparado un script para «hacer algo» (como sacar un backup) periódicamente debemos asegurarnos que el equipo esta conectado y encendido antes de meter la pata.

Muchos de los scripts que he desarrollado usan php-cli, me parece mas amigable que bash por que además puedo leer y escribir en bases de datos y también usar ncurses, es una maravilla!

Intentando con varios métodos, finalmente tengo algo que es de utilidad para determinar si un host esta «vivo» mediante un ping desde PHP:

getMessage();
}
else
{
    $ping->setArgs(array('count' => 1)); //Envios = 1
    $result = $ping->ping($host);

    if($result->getReceived() == 1 )  //Si recibimos lo 
    {
          echo "El equipo esta encendido!";
    }
    else
    {
          echo "El equipo esta apagado!";
    }
}
?>

Antes necesitamos tener instalado php-pear y Net_Ping:

ivancp@ubuntu~$ sudo apt-get install php-pear
ivancp@ubuntu~$ sudo pear install Net_Ping

Espero les sirva!

Mostrar posts de phpBB en una pagina externa

phpBBAlgunas veces queremos mostrar el contenido del post de phpBB en una pagina externa (fuera del foro) pero suele ser frustrante estudiar y utilizar el código de phpBB para extraer (inclusive) un texto simple, las medidas de seguridad contra el SPAM hacen que el código tenga niveles de complejidad difíciles de comprender.

Después de algunas horas estudiando el codigo y algunos tutoriales publicados sobre como extraer entradas del foro, estoy logrando migrar todos los artículos a phpBB de tal forma que va a ser mucho mas facil para los miembros de Latindevelopers publicar sus propios artículos.

Desistí de usar phpBB CMS Mod por que aun no esta listo y complicaría la migración, me parece mas como usar phpBB, lo único que me preocupa es que aparezcan algunos agujeros en la seguridad de phpBB, pero ya me ha pasado y no creo que sea gran cosa.

Aqui comparto el código para poder mostrar un post de phpBB fuera del foro, pero no esta todo el codigo, deben leer el articulo antes de usar el siguiente codigo, hice algunas modificaciones:

$posts_ary = array(
        'SELECT'    => 'p.*, t.*, u.username,
                         u.user_colour, p.bbcode_bitfield ',
        'FROM'      => array(
            POSTS_TABLE     => 'p',
        ),
        'LEFT_JOIN' => array(
            array(
                'FROM'  => array(USERS_TABLE => 'u'),
                'ON'    => 'u.user_id = p.poster_id'
            ),
            array(
                'FROM'  => array(TOPICS_TABLE => 't'),
                'ON'    => 'p.topic_id = t.topic_id'
            ),
        ),
        'WHERE'     =>  'p.post_id = ' . $post_id_article ,
        'ORDER_BY'  => 'p.post_id DESC',
    );

$sql = 'SELECT *
    FROM ' . ATTACHMENTS_TABLE . '
    WHERE post_msg_id = '.$post_id_article.'
            AND in_message = 0
    ORDER BY filetime DESC, post_msg_id ASC';
$result = $db->sql_query($sql);
$attachments = array();
while ($row = $db->sql_fetchrow($result))
{
    $attachments[$post_id_article][] = $row;
}

$db->sql_freeresult($result);

$posts = $db->sql_build_query('SELECT', $posts_ary);
$search_limit = 1;
$posts_result = $db->sql_query_limit($posts, $search_limit);

if($posts_row = $db->sql_fetchrow($posts_result))
{
    $topic_title = $posts_row['topic_title'];
    $post_author = get_username_string('full',
                      $posts_row['poster_id'],
                      $posts_row['username'],
                      $posts_row['user_colour']);
    $post_date = $user->format_date($posts_row['post_time']);
    $post_link = append_sid("{$phpbb_root_path}viewtopic.$phpEx",
                  'f=' .$posts_row['forum_id'] .
                  '&t=' . $posts_row['topic_id'] .
                  '&p=' . $posts_row['post_id']) . '#p' .
                   $posts_row['post_id'];
    $bbcode_bitfield = $posts_row['bbcode_bitfield'];

    $post_text = nl2br($posts_row['post_text']);

    $bbcode = new bbcode(base64_encode($bbcode_bitfield));
    $bbcode->bbcode_second_pass($post_text,
                                $posts_row['bbcode_uid'],
                                $posts_row['bbcode_bitfield']);

    $post_text = smiley_text($post_text);

    parse_attachments($forum_id,
                        $post_text,$attachments[$post_id_article],
                        $update_count);

    echo $topic_title."
"; echo $post_text; }

Al ejecutar el código podran ver la entrada, pero tambien tienen que copiar los estilos relacionados con el tema que estan usando, incluso los archivos javascript.

CMS based on phpBB posts

Detectar pais del visitante en PHP

PHP Logo Los webmasters nos preocupamos mucho por saber quienes son los que visitan nuestras páginas, para ello utilizamos herramientas muy útiles como contadores de visitas, analizadores de tráfico, etc., pero no siempre tenemos lo que queremos, no hay como hacer un script con tus propias manos.

Hace mucho tiempo encontré una base de datos (actualizada periódicamente) que contiene todos la mayoría de números IP que se pueden encontrar en la red. Estos están almacenados en forma de rangos y contiene el dato que nos interesa el País. Con esta base de datos es fácil determinar el país de procedencia del visitante a partir del numero  IP.

MaxMind es una empresa que provee este tipo de servicios y nos brinda un archivo libre (pero limitado) que podemos aprovechar.  http://www.maxmind.com/app/geolitecountry , solo tenemos que descargar el archivo e instalarlo en nuestra base de datos MySQL, sigan los pasos:

Paso 1: Descargar y Descomprimir la base de datos MaxMind (formato .csv):

wget http://www.maxmind.com/download/geoip/database/GeoIPCountryCSV.zip
unzip GeoIPCountryCSV.zip  #contiene el archivo GeoIPCountryWhois.csv

Esta es una vista previa del archivo GeoIPCountryWhois.csv

...
"190.8.128.0","190.8.159.255","3188228096","3188236287","PE","Peru"
"190.8.160.0","190.8.163.255","3188236288","3188237311","PA","Panama"
"190.8.164.0","190.8.167.255","3188237312","3188238335","VE","Venezuela"
"190.8.176.0","190.8.179.255","3188240384","3188241407","CO","Colombia"
"190.8.180.0","190.8.183.255","3188241408","3188242431","EC","Ecuador"
"190.8.184.0","190.8.191.255","3188242432","3188244479","AR","Argentina"
"190.8.192.0","190.8.255.255","3188244480","3188260863","CO","Colombia"
"190.9.0.0","190.9.31.255","3188260864","3188269055","AR","Argentina"
"190.9.32.0","190.9.47.255","3188269056","3188273151","VE","Venezuela"
...

Luego debemos crear la tabla donde vamos a importar esos datos en formato csv:

CREATE TABLE ipdatabase
(
  str_ip_from varchar(15),
  str_ip_to varchar(15),
  ip_from int unsigned,
  ip_to int unsigned,
  country_code2 char(2),
  country_name varchar(50),
  KEY ip_from (ip_from),
  KEY ip_to (ip_to)
);

Es importante que los campos ip_from e ip_to sean int unsigned por que guardaremos números realmente grandes.

LOAD DATA LOCAL INFILE '/ruta_hacia/GeoIPCountryWhois.csv'
INTO TABLE ipdatabase
FIELDS TERMINATED BY ',' ENCLOSED BY '"'
LINES TERMINATED BY '\n';

Para poder mostrar las imágenes debemos tener las imágenes de las banderas de todos los países, pueden descargar un pack banderas en diferentes tamaños de: http://speckyboy.com/2010/08/04/top-10-country-flag-icon-sets/

Ahora todo esta listo para que podamos escribir el código PHP que determinara el registro al cual pertenece un determinado numero de IP:

$link = mysql_connect("localhost" , "ipdatabase", "pwd");
mysql_select_db("ipdatabase",$link);
$sql = "SELECT lcase(country_code2) as code,country_name as name ".
"FROM ipdatabase ".
"WHERE ip_from <= inet_aton('{$_SERVER['REMOTE_ADDR']}') ".        
"AND ip_to >= inet_aton('{$_SERVER['REMOTE_ADDR']}') ";
if($res = mysql_query($sql,$link)) 
{
if(mysql_affected_rows($link) > 0 && $row = mysql_fetch_array($res))
    $im = imagecreatefrompng("../images/flags/".$row['code'].".png");
else
    $im = imagecreatefrompng("../images/flags/-.png");
header('Content-Type: image/png');
imagepng($im);
imagedestroy($im);
mysql_free_result($res);
}
else
{
echo mysql_error($link);
}
mysql_close($link);

El resultado del script anterior es el siguiente:

Usted nos esta visitando desde :

Ustedes pueden personalizar el código PHP para publicarlo en sus paginas web.

Espero les sirva.