¿Alguna vez se preguntaron, cómo es que hacen los sitios como blogger, twitter, facebook, google y otros para poner en cada publicacion "posteado hace #$%%& minutos/días/semanas/meses/año(s)?
Par empezar deben estar seguros de que las entradas de la tabla de su base de datos, la cual quieran extraer información tenga un campo date estilo TIMESTAMP el cual tenga un registro automático para el setéo de fechas (CURRENT_TIMESTAMP).
Luego de ello, usen esta función en la cual el parámetro va a ser el valor del key que determina la fecha del Array devuelvo por la base de datos.
function PostDate ( $Date )
{
if( empty ( $Date ) ) {
return "No se puede procesar una fecha nula";
}
$Period = array (
"segundo",
"minuto",
"hora",
"día",
"semana",
"mes",
"año"
);
$Length = array (
"60",
"60",
"24",
"7",
"4.35",
"12",
);
$Now = time();
$UnixDate = strtotime ( $Date );
if ( empty ( $UnixDate ) ) {
return;
}
if ( $Now > $unix_date ) {
$Difference = $Now - $UnixDate;
$Tense = "hace aproximadamente";
}
else {
$Difference = $UnixDate - $Now;
$Tense = "desde ahora";
}
for ( $j = 0; $Difference >= $Length [ $j ] && $j < count ( $Length ) -1; $j++ ){
$Difference /= $Length [ $j ];
}
$Difference = round ( $Difference );
if( $Difference != 1 ) {
$Period [ $j ].= "s";
}
return "{$Tense} $Difference $Period [ $j ]";
}
Entones para usarla hacemos simplemente print PostDate ( $Fecha );
Como ya sabemos el API de Twitter es escasa y tiene para muchos una documentación poco legible.
Entonces propongo una función, que trabaja mediante el cURL de PHP para traer los datos desde el server de Twitter hasta nuestra aplicación.
Cabe destacar que esta no es la forma oficial de hacerlo; pero, por si alguna razón la precisan, entonces acá la comparto.
function TwitterTimeLine ( $UserName )
{
try {
$Url = "http://twitter.com/statuses/user_timeline/".
$UserName.".
json?count=1";
$Curl = curl_init();
curl_setopt ( $Curl, CURLOPT_URL, $Url );
curl_setopt ( $Curl, CURLOPT_RETURNTRANSFER, 1 );
$CurlData = curl_exec ( $Curl );
curl_close ( $Curl );
return current ( json_decode ( $CurlData, true ) );
}
catch ( Exception $e ) {
error_log ( $e );
}
}
Entonces, así de simple se obtiene la información; para ver la extensa lista que esto nos proporciona, en formato JSON, por cierto, pueden hacer esto: print_r ( TwitterTimeLine ( 100000 ) );
Hoy hablaremos de los estándares en PHP.-
¿Para qué sirven éstos?; para facilitar el código y cuándo digo "facilitar" me refiero a apuntar que resulte fácil de leerse, que se obtengan menos errores y en caso de tenerlos, sea más fácil de identificarlos y depurarlos y a ayudar a mejorar el trabajo en equipo. Por convención se aprende a programar de diversas fuentes y materiales que se desparraman por toda la web; pero (...) todos o casi todos los desarrolladores de cualquier lenguaje tienen una forma diferente con la cual escriben su código. Pero imaginen que se esta trabajando con otros 2, 7, 15 o más desarrolladores en conjunto (...), sería tedioso lidiar con cada una de las notaciones del script; por eso sugiero ser más objetivo y dejar un poco de lado el ego y la subjetividad de uno mismo, o podríamos tener problemas luego (computacionalmente hablando).
Entonces, si nos basamos en los estandares PHP, nos podríamos remitir a los estándares ZEND, ya que no han de estar en vano, ya sea por optimizaciones de seguridad o por ser uno de los materiales del mismo lenguaje más visitado de la web o simplemente porque es la empresa que más se sumergió en el hecho de ayudara crecer a la extensa librería del proyecto de Rasmus Lerdorf.
Así que comencemos.
- No esta admitido el cierre de etiquetas ?> en donde el archivo solo contenga código PHP. Es decir, si contiene HTML u otros, debe de cerrarse, por el contrario, no se aconseja.
- No se permite tabular, solo espaciar 4 veces.
- Cada linea de código debe mantenerse por debajo de los 80 caractéres, si es posible. Los nombres de clases pueden contener sólo caracteres alfanuméricos. Los números están permitidos en los nombres de clase, pero desaconsejados en la mayoría de casos.
- Las clases abstractas siguen la misma convención que las clases comunes, solo que, adicionalmente, debe de agregarse al final del nombre de la clase "Abstract".
- Las Interfaces, al igual que las clases abstractas siguen la misma convención y acaba con la palabra clave "Interface".
- Para separar las palabras de la ruta del archivo, es estrictamente desaconsejable usar espacios o Camell Case. Simplemente (_) ó (-) estarán permitidos.
- Las funciones siguen el mismo patrón que las clases. Excepto que cuando las mismas se declaran como privadas o protegidas de acceso, debe de empezar su nombre por "_".
- Las variables siguen la misma manera que las funciones, y se aconseja asignarles un nombre constructivo a no ser que solo se les de utilidad en los loops.
- Las constantes deben nombrarse en mayúsculas y además, separar cada palabra con "_".
Si el nombre de una clase esta compuesto por mas de una palabra, la primer y solo la primer letra de cada palabra debe aparecer en mayúsculas.
Como es por converción, todo tomamos a PHP como un simple lenguaje capaz de conectarse a una base de datos e imprimir variables en pantalla, pero esto es erroneo. PHP es un lenguaje mucho más extenso y acá hay un ejemplo irrefutable de ello: el servicio o tecnología web sockets.
Una de las funcionas predefinidas desde el lenguaje más popular (en el ámbito de los sockets) es la llamada fsockopen(), la cual abre una conexión mediante socket a un dominio especificado.
Ahora, la pregunta es: ¿para que sirven estos benditos sockets?; simple: permite a los servidores y navegadores web un canal para el flujo de datos ordenado, en el cual se envían peticiones y respuestas de lado a lado. Éstos dependerán explícitamente del protocolo de comunicaciones en el cual estén basados, por lo general se usa TCP, aunque puede variar. Entonces, el servidor espera a que el cliente le proponga una petición y el mismo le responde con los datos en cuestión; simple y conciso.
Acá mismo cito un ejemplo para ver como funciona. Recomiendo profundizar un poco en cuanto a las funciones básicas.
*fsockopen abre el canal de transmisión de datos desde el cliente al servidor, por el cual van y vuelven datos de lado a lado. Sus parametros son:
1) El dominio al cual se le presenta la petición;
2) El puerto. (por lo general es 80, aunque podría ser otro. De todas formas a tener cuidado con el puerto seleccionado);
3) Si hay un error, esta variable nos proporciona su número;
4) Si hay un error, esta misma nos proporciona su mensaje;
5) Tiempo límite de conexión, aunque no siempre es necesario, a veces optimiza los canales;
*fclose cierra la conexión.
<?php
$Datos = false;
$Url ='www.miurl.com';
$Fp = @fsockopen ( $Url, 80, $Error, $ErrorStr, 1 );
if ( $fp ) {
stream_set_timeout ( $Fp, 1 );
$Salida = "GET / HTTP/1.0\r\n";
$Salida .= "Host: www.miurl.com\r\n";
$Salida .= "Connection: Close\r\n\r\n";
if ( fwrite ( $Fp, $Salida ) ) {
$Contenido='';
$Cabeceras = false;
while ( ! ( feof ( $Fp ) ) ) {
$Datos = true;
$Linea = fgets ( $Fp,128 );
if ( $Linea == "\r\n" && $Cabeceras ) {
$Cabeceras = true;
}
if ( $Cabeceras ) {
$Contenido.= $Linea;
}
}
fclose ( $Fp );
}
}
if ( ! ( $Datos ) ) {
print "No hay permisos necesarios para obtener datos desde $Url";
}
else {
print "$Contenido";
}
?>
Entonces, se supone que esto servirá para aquellos que quieren ponerse al día de las nuevas inclusiones de PHP.
Notese que no hay que abusar de estas tecnologías; ya que a veces simplemente hay otras alternativas menos consumistas y eficientes que una sopa de letras y funciones con callBacks y detección de errores.
A veces nuestro servidor se ve extensamente sobrecargado por nuestras aplicaciones. A lo que nos preguntamos, ¿qué es lo que consume tanto?; la respuesta es muchas cosas. Pero más básicamente se basa en peticiones a la base de datos.Entonces reformulemos la pregunta, ¿para qué hacer una petición a la base de datos de algo que posiblemente sea siempre igual, si podemos almacenarlo como un archivo y mostrarlo rápida, eficientemente y sin mayor consumo, en lugar de lo anterior?La respuesta a esto se llama CACHÉ, y he aquí una pequeña clase para manipular esta maravilla:
<?php
class Cache
{
private static $cache_dir = null;
private static $cache_reset_field = "mab";
private $cache_field = array();
/**
* @var {integer} 900 segundos -> 15 minutos.-
*/
private $cache_file = null;
public function __construct ()
{
if ( ! self::$cache_dir ) {
$this->set_cache_dir ( getcwd () . "/cached/" );
}
}
/** * @param {string} $dir.- * @return Cache.- */
public function set_cache_dir ( $dir )
{
if ( ! is_dir ( $dir ) )
@mkdir ( $dir, 0777 );
self::$cache_dir = $dir;
return $this;
}
/** * @param {string} $field.- * @return Cache.- */
public function set_cache_reset_field ( $field )
{
self::$cache_reset_field = $field;
return $this;
}
/** * @param {string} $field.- * @param {string} $value.- * @return Cache.- */
public function add_cache_field ( $field, $value )
{
$this->cache_field [] = "{$field}={$value}";
return $this;
}
/** * @return {string}.- */
public function get_cache_field ()
{
return @implode ( "&", $this->cache_field );
}
/** * @param {integer} $time.- * @return Cache.- */
public function set_cache_time ( $time )
{
$this->cache_time = $time;
return $this; } /** * @return {integer}.- */
public function sget_cache_time ()
{
return $this->cache_time;
}
/** * @return {boolean}.- */
public function start_cache ( $cache_id = null )
{ /** * #Resetea todo el caché si es necesario.- */
if ( isset ( $_GET [ self::$cache_reset_field ] ) ) { /** * #Resetea el tiempo.- */
$this->set_cache_time ( 0 ); /** * #Archivo entero.- */
if ( ! $cache_id ) {
/** * #Resetea el string.- */
$reset_field = self::$cache_reset_field. "{ $_GET [ self :: $cache_reset_field ] }";
$_SERVER [ "QUERY_STRING" ] = preg_replace (
array (
"/&{$reset_field}/", "/&{$reset_field}/",
"/&{$reset_field}/" ),
array( "", "", "" ), $_SERVER [ "QUERY_STRING" ] );
}
} /** * #Setemos el path completo.- */
$this->cache_file = self::$cache_dir.
md5 ( ( $cache_id
? $cache_id
: $_SERVER [ "SCRIPT_NAME" ]. $_SERVER [ "QUERY_STRING" ] ). $this->get_cache_field() ); /** * #¿Existe el archivo?.- * #Si es verdadero, comienza el caché.- */
if ( @file_exists ( $this->cache_file ) && ( ( time() - $this->get_cache_time() ) < @filemtime ( $this->cache_file ) ) )
{
print file_get_contents ( $this->cache_file ); /** * #Si es un archivo(...).- */
if ( ! $cache_id ) {
exit;
}
}
else {
/** * #Comienza el flujo de datos (...) [ BUFFERING ].- */
$cache_file = @fopen ( $this->cache_file, "w" ); @fwrite ( $cache_file, $cache_content );
@fclose ( $cache_file ); /** * #Salen los datos (...).- */
$path = $_SERVER ['DOCUMENT_ROOT'];
require_once $path.'/mi_directorio/Cache.php';
$Cached = new Cache; $Cached->start_cache(); (...)Código de la página en cuestión(...) $Cached->end_cache();
Como comentaba antes, atras queda ya el conocimiento sobre
Linux, y en este caso les acerco un poco sobre la preciada terminal.A diferencia de Mac o Windows, Linux tiene más aspectos en cuanto a la seguridad y si hablamos de su uso correcto, entonces quitemos de lado las ventanas y los cuadros de diálogo y vamos a centrarnos en la terminal de Linux. Por que, ¿qué mejor forma que usar un ordenador que desde su núcleo?.
Gestión de archivos
Privilegio de administrador
Tengan en cuenta que la terminal de Linux no ha matado a nadie, o por lo menos no directamente. Así que intentenlo, siempre les servira.
Entonces, puedo ayudarte. Voy a insertar una lista de libros para que te resulte más fácil aprender este preciado lenguaje.
Por Michele E. Davis & John A. Philips. Editorial O'reilly.~
Por Andrew G. Curioso. Editorial O'reilly. ~
Por Rasmus Lerdorf. Editorial O'reilly.~
Por Peter Maclntyre. Editorial O'reilly.~
