Contador de usuarios activos con PHP

Con este script podemos contar los usuarios activos con PHP.

No vamos a usar ninguna base de datos. En su lugar usaremos un archivo llamado usuarios.dat

Creamos nuestro script PHP y lo llamamos activos.php

<?php

$tiempo_logout = 600; // segundos tras los cuales un usuario es marcado como inactivo

$arr = file("usuarios.dat");

$contenido = $REMOTE_ADDR.":".time()." ";

for ( $i = 0 ; $i < sizeof($arr) ; $i++ )

{

$tmp = explode(":",$arr[$i]);

if (( $tmp[0] != $REMOTE_ADDR ) && (( time() - $tmp[1] ) < $tiempo_logout ))

{

$contenido .= $REMOTE_ADDR.":".time()." ";

}

}

$fp = fopen("usuarios.dat","w");

fputs($fp,$contenido);

fclose($fp);

$array = file("usuarios.dat");

$USUARIOS_ACTIVOS = count($array);

?>

La explicación de lo que hace el codigo anterior es la siguiente:

  • Cargamos usuarios.dat a un array
  • Creamos el archivo de texto con las IP y la hora de visita de los que visitan nuestra web
  • “Borramos” de ese archivo los que llevan más de $tiempo_logout sin actividad
  • Escribimos el archivo
  • Declaramos una variable $USUARIOS_ACTIVOS que contiene el número de usuarios activos del momento

Para utilizar este Script, al principio de cualquier página ponemos

<?php

include(”activos.php”)

?>

y donde queremos mostrar el número de usuarios, usamos la variable $USUARIOS_ACTIVOS.

Hosting vitual basado en nombres en el servidor web Apache

Para usar hosting virtual basado en nombres en el servidor web Apache, debe especificar en el servidor qué dirección IP (y posiblemente qué puerto) se va a usar para atender las peticiones a los diferentes hosts. Esto se hace con la directiva NameVirtualHost. Normalmente, cualquiera o todas las direcciones IP del servidor pueden usarse, también puede usar * como argumento para la directiva NameVirtualHost. Si va a usar más de un puerto (por ejemplo si va usar SSL) debe añadir un puerto a cada argumento, por ejemplo *:80. Tenga en cuenta que especificando una dirección IP en la directiva NameVirtualHost no hace que el servidor escuche automáticamente en esa dirección IP.

Además, cualquier dirección IP especificada debe asociarse con un dispositivo de red del servidor web apache.

El siguiente paso es crear un bloque <VirtualHost> para cada host diferente que quiera alojar en el servidor. El argumento de la directiva <VirtualHost> debe ser el mismo que el argumento de la directiva NameVirtualHost (por ejemplo, una dirección IP, o un * para usar todas las direcciones que tenga el servidor). Dentro de cada bloque <VirtualHost>, necesitará como mínimo una directiva ServerName para designar qué host se sirve y una directiva DocumentRoot para indicar dónde están los contenidos a servir dentro del sistema de ficheros.

Como añadir hosts vituales a un servidor web Apache ya existente???

Si está añadiendo hosts virtuales a un servidor web apache ya existente, debe crear también un bloque <VirtualHost> para el host que ya tenga funcionando. Los valores de las directivas ServerName y DocumentRoot desde este nuevo host virtual deben tener los mismos valores que los de las directivas ServerName DocumentRoot globales. Ponga este host virtual como el primero en el archivo de configuración para que sea el que actúe como host por defecto.

Por ejemplo, suponga que está sirviendo el dominio www.midominio.com y quiere añadir el host virtual www.otrodominio.com, que apunta a la misma dirección IP. Entonces, lo único que tiene que hacer es añadir lo siguiente al fichero httpd.conf:

NameVirtualHost *:80

<VirtualHost *:80>

ServerName www.midominio.com

ServerAlias midominio.com *.midominio.com

DocumentRoot /www/midominio

</VirtualHost>

<VirtualHost *:80>

ServerName www.otrodominio.com

DocumentRoot /www/otrodominio

</VirtualHost>

También puede optar por especificar una dirección IP explícitamente en lugar de usar un * en las directivas NameVirtualHost y <VirtualHost>. Por ejemplo, puede hacer esto para hacer funcionar diferentes hosts virtuales basados en nombres en una dirección IP, o basados en IPs, o un conjunto de hosts virtuales basados en nombres en otra dirección.

También puede que quiera que se acceda a un determinado sitio web usando diferentes nombres. Esto es posible con la directiva ServerAlias, puesta dentro de la sección <VirtualHost>. Por ejemplo, en el primer bloque <VirtualHost> de arriba, la directiva ServerAlias indica la lista de nombres que pueden usarse para acceder a un mismo sitio web:

ServerAlias midominio.com *.midominio.com

entonces las peticiones para todos los hosts en el dominio midominio.com serán servidas por el host virtual www.midominio.com. Los carácteres comodines * y ? pueden usarse para encontrar equivalencias con los nombres. Por supuesto, no puede inventarse nombres y ponerlos en la directiva ServerName o ServerAlias. Primero debe tener su servidor de DNS debidamente configurado para que pueda hacer corresponder esos nombres con una dirección IP de su servidor.

Para terminar, puede mejorar el rendimiento de la configuración de los hosts virtuales en el servidor web Apache poniendo otras directivas dentro de las secciones <VirtualHost>. La mayor parte de las directivas pueden ponerse en esos containers y cambiarán solo la configuración del host virtual al que se refieran. Para ver si una directiva en particular puede usarse así, consulte el Contexto de la directiva. Las directivas de configuración especificadas en el contexto del servidor principal (fuera de cualquier sección <VirtualHost>) se usan única y exclusivamente si sus valores no son sustituidos por alguno de los parámetros de configuración del host virtual del servidor web Apache.

Cuando llega una petición, el servidor primero verifica si se está usando una dirección IP que coincide con el valor de la directiva NameVirtualHost. Si es el caso, mirará en cada sección <VirtualHost> cuya IP coincida e intentará encontrar si el valor de la directiva ServerName o de la directiva ServerAlias coincide con el nombre del sitio web de la petición. Si encuentra una coincidencia, usa la configuración de ese servidor. Si no la encuentra, usa el primer host virtual de la lista cuya dirección IP coincida con el de la petición.

Como consecuencia, el primer host virtual de la lista es el que se usa por defecto. La directiva DocumentRoot del servidor web Apache principal no se usará nunca cuando una dirección IP coincida con el valor de la directiva NameVirtualHost. Si quiere usar una configuración especial para peticiones que no coinciden con ningún host virtual en concreto, ponga esa configuración en una sección <VirtualHost> y póngala la primera en el fichero de configuración.

Hosting virtual Apache

El hosting virtual del servidor web Apache puede estar basado en nombres o IP.

Diferencias entre el hosting vitual basado en nombres y el basado en IPs

Hosting virtual Apache basado en IP

El hosting virtual basado en IPs usa la dirección IP de la conexión para determinar qué host virtual es el que tiene que servir. Por lo tanto, necesitará tener diferentes direcciones IP para cada host. Si usa hosting virtual basado en nombres, el servidor atiende al nombre de host que especifica el cliente en las cabeceras de HTTP. Usando esta técnica, una sola dirección IP puede ser compartida por muchos sitios web diferentes.

Hosting virtual Apache basado en nombres

El hosting virtual basado en nombres es normalmente más sencillo, porque solo necesita configurar su servidor de DNS para que localice la dirección IP correcta y entonces configurar Apache para que reconozca los diferentes nombres de host. Usando hosting virtual basado en nombres también se reduce la demanda de direcciones IP, que empieza a ser un bien escaso. Por lo tanto, debe usar hosting virtual basado en nombres a no ser que haya alguna razón especial por la cual tenga que elegir usar hosting vitual basado en direcciones IP. Algunas de éstas razones pueden ser:
  • Algunos clientes antiguos no son compatibles con el hosting virtual basado en nombres. Para que el hosting virtual basado en nombres funcione, el cliente debe enviar la cabecera de Host HTTP. Esto es necesario para HTTP/1.1, y está implementado como extensión en casi todos los navegadores actuales. Si necesita dar soporte a clientes obsoletos y usar hosting virtual basado en nombres, al final de este documento se describe una técnica para que pueda hacerlo.
  • El hosting virtual basado en nombres no se puede usar junto con SSL por la naturaleza del protocolo SSL.
  • Algunos sistemas operativos y algunos elementos de red tienen implementadas técnicas de gestión de ancho de banda que no pueden diferenciar entre hosts a no ser que no estén en diferentes direcciones IP.

eliminar los números que muestran cuántos productos hay en cada categoría en Oscommerce

Editar el archivo /catalog/includes/application_top.php

Sobre la línea 135 busca este código:

define('SHOW_COUNTS', 1); // show category count: false=disable; true=enable

cambia true por false y ya no veremos la cantidad de productos por categoria.


Cambiar la longitud del numero ID de producto en Oscommerce

Asumiendo que estás usando PHPMyAdmin selecciona la tabla 'orders_products de la izquierda

Hacer clic en el check box product_model

Hacer clic en el botón Change

Después, en la sección Length/Values establecemos la nueva longitud

Hacer clic en Save

Después, fijamos la tabla 'products' con los mismos parámetros:

Selecciona la tabla 'products' de la izquierda

Hacer clic en el check box product_model

Hacer clic en el botón Change

Después en Length/Values establecer la nueva longitud.


Agregar un link al home page en el logo del encabezado de Oscommerce

Los enlaces del logo que vuelven a la home page, no deberían abrirse en una ventana aparte, pero lo hace, así que tenemos que ajustarlo.

En header.php cambiar:

<td valign="middle"><?php echo tep_image(DIR_WS_IMAGES . 'oscommerce.gif', 'OSCommerce'); ?></td>

por:

<td valign="middle"><?php echo '<a href="' . HEADER_IMAGE_LINK . '">' . tep_image(DIR_WS_IMAGES . HEADER_IMG_PIC, HEADER_IMG_ALT) . '</a>'; ?></td>

Después en english.php definir lo siguiente:

// define header image information

define('HEADER_IMG_PIC', 'yourimage.gif');

define('HEADER_IMG_ALT', ' Welcome to whatever you want here ');

define('HEADER_IMAGE_LINK','http://www.yourdomain.com'); [this will open your page up in the same window]

define('HEADER_IMAGE_LINK','http://www.yourdomain.com” target=”_blank’); [this will open your page in another browser]

Estas definiciones hacen más fácil los futuros cambios de imagen, enlace y alt para el logo.

Agregar downloads en Oscommerce

En ciertas ocasiones es necesario permitir a los visitantes de nuestra tienda virtual bajar algun tipo de archivo. Esto es util por ejemplo si nuestra tienda virtual trata sobre software y queremos que los usuarios bajen demos o software libre.
Para aplicar este cambio, agregamos el producto al catálogo, y después vamos a Attributes y añadimos un atributo de download.

Establecemos los permisos de /catalog/pub a chmod 777 y /catalog/download a 755

Y listo... ya tenemos nuestro catalogo con downloads de productos.

Cambiar las esquinas de los bloques en Oscommerce para que se vean redondeadas

Es muy comun encontrar infinidad de sitios de comercio electronico que utilizan Oscommerce. Y eso hace necesario modificar nuestra tienda virtual para que se diferencie de las demas. Una de las opciones que permite Oscommerce es redondear las esquinas de los bloques.
Realizar esta modificacion en nuestra tienda virtual es muy facil. Debemos buscar en el código de cada bloque hasta encontrar algo como esto:

new infoBoxHeading($info_box_contents, false, false);

Cambiamos ambas definiciones 'false' por 'true' y nuestros bloques tendrán esquinas redondeadas a la izquierda y a la derecha.

Poner una imagen de fondo en las columnas de la tienda virtual Oscommerce

La solucion de comercio electronico Oscommerce nos ofrece muchas posibilidades de personalizacion.
Una de las cosas que podemos cambiar en nuestra tienda virtual es el fondo de las columnas laterales.
Para agregar una imagen de fondo en las columnas de Oscommerce debemos editar la página default.php (o index.php según la version) y cada página dentro del directorio /catalog/ y agregar el siguiente codigo (no olvides hacer una copia de seguridad de toda la tienda virtual antes de realizar las modificaciones por si algo falla)

<!-- body //-->
<table border="0" width="100%" cellspacing="0" cellpadding="3">
<tr>
<td width="<?php echo BOX_WIDTH; ?>" valign="top" background="images/columna.jpg" bgcolor="#5a6ba5"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="8">
<!
-- left_navigation //-->

Obviamente, el archivo columna.jpg es la imagen que queremos mostrar en el fondo de las columnas de Oscommerce.

Saber que navegador usa un visitante con PHP

Para hacerlo, vamos a consultar la información que el navegador nos envía como parte de su petición HTTP. Esta información es guardada en una variable. Las variables siempre comienzan con un signo de dólar ("$") en PHP. La variable que vamos a utilizar en esta situación es $_SERVER["HTTP_USER_AGENT"].

$_SERVER es una variable reservada por PHP que contiene toda la información del servidor web. Es conocida como Autoglobal (o Superglobal).

Para poder ver esta variable solo necesitamos el siguiente codigo:

<?php echo $_SERVER["HTTP_USER_AGENT"]; ?>

esto nos dara un resultado similar a:

Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)

$_SERVER es simplemente una variable que se encuentra disponible automáticamente en PHP.

Por ejemplo, si quisiéramos detectar el uso de "Internet Explorer", haríamos algo así:

   

<?php

if (strstr($_SERVER["HTTP_USER_AGENT"], "MSIE")) {

echo "Está usando Internet Explorer<br />";

}

?>

esto nos dara un resultado similar a:

Esta usando Internet Explorer

En el caso anterior estamos buscando "MSIE" dentro de $_SERVER["HTTP_USER_AGENT"]. Si la cadena fue encontrada, la función devolverá verdadero ("TRUE"), la declaración "if" se evalúa a verdadero ("TRUE") y el código adentro de las llaves {} es ejecutado. De otra manera no resulta ejecutado.

Creación del Password del Usuario root desde consola en Ubuntu Linux

Abrir la consola y entrar como root:

$ sudo -s

Escribir :

$ sudo passwd

Escribir la nueva contraseña y listo. La pedirá dos veces para asegurarse.


Iniciar sesión como superusuario ( root) en Ubuntu Linux

En ocasiones necesitamos realizar varias operaciones como superusuario y suele ser más cómodo iniciar sesion como tal. Pero si dichas operaciones se van a realizar en el Terminal, podemos simplemente escribir:

$ sudo su -


Nos preguntará la contraseña del usuario y desde entonces tendremos iniciada una sesión como root.


Eliminar kernel de Linux

De vez en cuando van saliendo actualizaciones del kernel Linux que podemos instalar. Las versiones anteriores del kernel no se desinstalan por si ocurre algún problema en el nuevo. En el menú de GRUB saldrán las versiones de kernel instaladas. Al cabo del tiempo la lista puede ser demasiado larga, y si el nuevo kernel Linux no nos ha dado problemas podemos eliminar los anteriores.

Eliminar kernel Linux que no utilizamos

Para ver un listado de los paquetes con los kernel Linux antiguos ejecutamos:

$ dpkg --get-selections | grep linux-image

Ahora puedes eliminar todos los kernel menos el último con:

$ sudo aptitude purge paquete

Donde paquete es el nombre del kernel Linux por ejemplo: ¨linux-image-2.6.20-12-generic¨

Si el paquete a remover no está actualizado te pedirá actualizarlo, luego de lo cual puedes aplicar lo mismo a las actualizaciones y paquetes antiguos:

$ sudo aptitude purge paquete

En caso que no quieras actualizar para luego remover puedes aplicar:

$ sudo aptitude remove paquete

pero esto puede no eliminar los ficheros de configuración del paquete.

Es mejor dejar solo el último kernel Linux instalado para ahorrar espacio en disco, pero debemos asegurarnos que no necesitemos el viejo kernel y que el nuevo kernel Linux funciona bien.

Crear un disquete de arranque para Linux

En ocasiones, cuando se presenta algun problema con nuestro Sistema Operativo, en conveniente tener cerca un disquete de arranque. No es comun que suceda en linux, pero....

Para crearlo, solo tenemos que ejecutar los siguientes comandos con un disquete vacío dentro de la disquetera:

[voodoo@localhost]$ /sbin/mke2fs /dev/fd0
[voodoo@localhost]$ [ -d /fd ] || mkdir /fd
[voodoo@localhost]$ mount /dev/fd0 /fd
[voodoo@localhost]$ cp /boot/boot.b /fd
[voodoo@localhost]$ cp /vmlinuz /fd
[voodoo@localhost]$ echo image=/fd/vmlinuz label=linux |
/sbin/lilo -C - -b /dev/fd0 -i /fd/boot.b -c -m /fd/map
[voodoo@localhost]$ umount /fd
[voodoo@localhost]$ rmdir /fd
Lo que hacen estos comandos es:
/sbin/mke2fs /dev/fd0    -> Formatea el disquete con formato ext2
[ -d /fd ] || mkdir /fd -> Si no existe el directorio /fd lo crea
mount /dev/fd0 /fd -> monta el disquete en dicho directorio.
cp /boot/boot.b /fd
cp /vmlinuz /fd -> Copia el kernel de Linux y el archivo
de boot al disquete. Si nuestro kernel no
se llama vmlinuz (por ej bzImage o zImage)
o no está en el raíz debemos cambiar esto.
echo image=... -> Activa el kernel en el disquete.
umount /fd -> Desmontamos el disco
rmdir /fd -> Borramos el dir /fd
Si alguno de los paths o nombres cambia los deberemos cambiar dentro del diquete.


Arrancar otro servidor gráfico en Linux / Ubuntu

En modo consola (Ctrl+Alt+F1), ejecuta uno de los siguientes comandos:
  • $ xinit -- :1
  • $ startx -- :1

Esto nos crea una nueva instancia de X.Org, a la cual podemos movernos con Ctrl+Alt+F9 (la instancia por defecto en Ubuntu está en Ctrl+Alt+F7).

Cargar gestor de ventanas

Cargamos un gestor de ventanas, ejecutando en este servidor gráfico, metacity (del escritorio GNOME), kwin (del escritorio KDE) o xfwm4 (del escritorio Xfce), por ejemplo, conseguiremos arrancar el gestor de ventanas para este servidor gráfico:

  • $ metacity &
  • $ kwin &
  • $ xfwm4 &



Cambiar resolución de pantalla desde el teclado en Ubuntu - Kubuntu - Linux

Aumentar la resolución de pantalla:

  • Ctrl Alt +

Disminuir la resolución de pantalla:

  • Ctrl Alt -

Que se puede hacer con PHP

PHP puede hacer cualquier cosa que se pueda hacer con un script CGI, como procesar la información de formularios, generar páginas con contenidos dinámicos, o enviar y recibir cookies. Y esto no es todo, se puede hacer mucho más.

Existen tres campos en los que se usan scripts escritos en PHP.

Scripts del lado del servidor. Este es el campo más tradicional y el principal foco de trabajo. Se necesitan tres cosas para que esto funcione. El intérprete PHP (CGI ó módulo), un servidor web y un navegador. Es necesario correr el servidor web con PHP instalado. El resultado del programa PHP se puede obtener a través del navegador, conectándose con el servidor web. Consultar la sección Instrucciones de instalación para más información.

Scripts en la línea de comandos. Puede crear un script PHP y correrlo sin ningún servidor web o navegador. Solamente necesita el intérprete PHP para usarlo de esta manera. Este tipo de uso es ideal para scripts ejecutados regularmente desde cron (en *nix o Linux) o el Planificador de tareas (en Windows). Estos scripts también pueden ser usados para tareas simples de procesamiento de texto.

Escribir aplicaciones de interfaz gráfica. Probablemente PHP no sea el lenguaje más apropiado para escribir aplicaciones gráficas, pero si conoce bien PHP, y quisiera utilizar algunas características avanzadas en programas clientes, puede utilizar PHP-GTK para escribir dichos programas. También es posible escribir aplicaciones independientes de una plataforma. PHP-GTK es una extensión de PHP, no disponible en la distribución principal.

PHP puede ser utilizado en cualquiera de los principales sistemas operativos del mercado, incluyendo Linux, muchas variantes Unix (incluyendo HP-UX, Solaris y OpenBSD), Microsoft Windows, Mac OS X, RISC OS y probablemente alguno más. PHP soporta la mayoría de servidores web de hoy en día, incluyendo Apache, Microsoft Internet Information Server, Personal Web Server, Netscape e iPlanet, Oreilly Website Pro server, Caudium, Xitami, OmniHTTPd y muchos otros. PHP tiene módulos disponibles para la mayoría de los servidores, para aquellos otros que soporten el estándar CGI, PHP puede usarse como procesador CGI.

De modo que, con PHP tiene la libertad de elegir el sistema operativo y el servidor de su gusto. También tiene la posibilidad de usar programación procedimental o programación orientada a objetos. Aunque no todas las características estándar de la programación orientada a objetos están implementadas en la versión actual de PHP, muchas bibliotecas y aplicaciones grandes (incluyendo la biblioteca PEAR) están escritas íntegramente usando programación orientada a objetos.

Con PHP no se encuentra limitado a resultados en HTML. Entre las habilidades de PHP se incluyen: creación de imágenes, archivos PDF y películas Flash (usando libswf y Ming) sobre la marcha. Tambié puede presentar otros resultados, como XHTM y archivos XML. PHP puede autogenerar éstos archivos y almacenarlos en el sistema de archivos en vez de presentarlos en la pantalla.

Quizás la característica más potente y destacable de PHP es su soporte para una gran cantidad de bases de datos. Escribir un interfaz vía web para una base de datos es una tarea simple con PHP. Las siguientes bases de datos están soportadas actualmente:

  • Adabas D
  • Ingres
  • Oracle (OCI7 and OCI8)
  • dBase
  • InterBase
  • Ovrimos
  • Empress
  • FrontBase
  • PostgreSQL
  • FilePro (read-only)
  • mSQL
  • Solid
  • Hyperwave
  • Direct MS-SQL
  • Sybase
  • IBM DB2
  • MySQL
  • Velocis
  • Informix
  • ODBC
  • Unix dbm

También contamos con una extensión DBX de abstracción de base de datos que permite usar de forma transparente cualquier base de datos soportada por la extensión. Adicionalmente, PHP soporta ODBC (el Estándar Abierto de Conexión con Bases de Datos), asi que puede conectarse a cualquier base de datos que soporte tal estándar.

PHP también cuenta con soporte para comunicarse con otros servicios usando protocolos tales como LDAP, IMAP, SNMP, NNTP, POP3, HTTP, COM (en Windows) y muchos otros. También se pueden crear sockets puros. PHP soporta WDDX para el intercambio de datos entre lenguajes de programación en web. Y hablando de interconexión, PHP puede utilizar objetos Java de forma transparente como objetos PHP Y la extensión de CORBA puede ser utilizada para acceder a objetos remotos.

PHP tiene unas características muy útiles para el procesamiento de texto, desde expresiones regulares POSIX extendidas o tipo Perl hasta procesadores de documentos XML. Para procesar y acceder a documentos XML, soportamos los estándares SAX y DOM. Puede utilizar la extensión XSLT para transformar documentos XML.

Si usa PHP en el campo del comercio electrónico, encontrará muy útiles las funciones Cybercash, CyberMUT, VeriSign Payflow Pro y CCVS para sus programas de pago.

Para terminar, contamos con muchas otras extensiones muy interesantes, las funciones del motor de búsquedas mnoGoSearch, funciones para pasarelas de IRC, utilidades de compresión (gzip, bz2),, conversión de calendarios, traducción, etc.

Qué es PHP

PHP (acrónimo de "PHP: Hypertext Preprocessor") es un lenguaje de "código abierto" interpretado, de alto nivel, embebido en páginas HTML y ejecutado en el servidor.

Una respuesta corta y concisa, pero, ¿qué significa realmente? Un ejemplo nos aclarará las cosas:

 

<html>

<head>

<title>Ejemplo</title>

</head>

<body>

<?php

echo "Hola, soy un script PHP!";

?>

</body>

</html>

Puede apreciarse que no es lo mismo que un script escrito en otro lenguaje de programación como Perl o C -- En vez de escribir un programa con muchos comandos para crear una salida en HTML, escribimos el código HTML con cierto código PHP embebido (incluido) en el mismo, que producirá cierta salida (en nuestro ejemplo, producirá un texto). El código PHP se incluye entre etiquetas especiales de comienzo y final que nos permitirán entrar y salir del modo PHP.

Lo que distingue a PHP de la tecnología Javascript, la cual se ejecuta en la máquina cliente, es que el código PHP es ejecutado en el servidor. Si tuviésemos un script similar al de nuestro ejemplo en nuestro servidor, el cliente solamente recibiría el resultado de su ejecución en el servidor, sin ninguna posibilidad de determinar qué código ha producido el resultado recibido. El servidor web puede ser incluso configurado para que procese todos los archivos HTML con PHP.

Lo mejor de usar PHP es que es extremadamente simple para el principiante, pero a su vez, ofrece muchas características avanzadas para los programadores profesionales.

Seguridad en linux - el archivo /etc/passwd

El contenido del archivo /etc/passwd determina quien puede acceder al sistema de manera legitima y que se puede hacer una vez dentro del sistema. Este archivo es la primera linea de defensa del sistema contra accesos no deseados. Debe mantenerse libre de errores y fallos de seguridad. En el tenemos registrados las cuentas de usuarios, asi como las claves de accesos y privilegios.

Una linea ejemplo en este archivo:

usuario1:FXWUuZ.vwXttg:500:501:usuario pepito:/home/usuario1:/bin/bash

Los diferentes campos(7) estan separados por dos puntos (:) y el significado de los mismos es el siguiente:

usuario1: Nombre de la cuenta (Login)

FXWUuZ.vwXttg: Clave de acceso encriptada (password)

500: UID de esta cuenta

501: GID del grupo principal al que pertenece la cuenta

usuario pepito: Nombre del usuario

/home/usuario1: Directorio de trabajo de usuario1

/bin/bash: Interprete de comando (shell) de usuario pepito

Una serie de reglas a tener en cuenta sobre el contenido de este archivo:

  • El UID de cuenta 0, pertenece al administrador (root), por debajo de UID 500 esta reservado para el sistema y por encima de UID 500 para los usuarios del sistema (Nota: la frontera del 500 puede variar dependiendo del sistema).

El GID del grupo principal esta definido en el archivo /etc/group y este sera el grupo por defecto cuando un usuario crea un archivo.

No hace falta decir que solo el administrador del sistema tiene que tener ID's 0 en estos dos campos. Lo contrario significaria estar dando permisos de administracion (root) a la cuenta en cuestion.

Lo unico que identifica a una cuenta root del resto es una identificacion UID igual a 0. Podemos tener por ejemplo una cuenta llamada "pepito" pero con UID igual a 0, esta cuenta tendria permisos de administrador (root) y muchos programas que hacen referencia al nombre de la cuenta (ej: who, w, etc) no nos darian informacion sobre que la cuenta "pepito" tiene permisos de root.

Esto es lo primero que un hacker suele hacer para instalar una puerta trasera en un sistema. Para averiguar cuentas con nombre diferente de root, pero permisos de root existen programas, pero a falta de uno podemos utilizar el siguiente comando:

awk -F: '{if ($3==0) print $1}' /etc/passwd

Lo mismo (con un pequeno cambio) se puede utilizar para ver cuentas con GID igual a 0:

awk -F: '{if ($4==0) print $1}' /etc/passwd

  • Es muy importante verificar asiduamente que toda cuenta (login) tiene asignada una clave valida. Existen programas para comprobar que no existen problemas de seguridad en /etc/passwd, pero a falta de uno se puede utilizar el siguiente comando para averiguar si existen cuentas sin claves:

awk -F: '{if ($2=="") print $1}' /etc/passwd

Nunca dejar una cuenta con el campo de clave vacio, esto significa que no es necesario una clave para entrar en el sistema. Las cuentas de pseudo-usuarios (ej: daemon, lp, etc) y cuentas de usuarios cerradas temporalmente, tienen que tener un asterisco (*) en el campo de la clave.

Otro punto a tener en cuenta es la eleccion de una buena clave. No se deberian utilizar claves que sean palabras de diccionario, nombres, datos personales, matriculas, etc, existen programas que son capaces de descifrar este tipo de claves. Utilizar al menos 7 caracteres (8 recomendable) e interpolar numeros y letras, mayusculas y minusculas. Existen programas que sustituyen el clasico "passwd" para crear/cambiar claves, que comprueban que la clave es suficientemente buena.

La explicacion de porque no se deberian utilizar palabras de diccionario, nombres, etc como claves de acceso, es la siguiente:

Cuando una clave es generada, esta, es codificada con la funcion "crypt", esta funcion se puede definir como una funcion "hash" de una sola direccion, esto es, un algoritmo que es facil de computar en una direccion pero muy dificil de calcular en direccion opuesta. La funcion crypt utiliza un valor aleatorio llamado "salt" el cual esta formado por una cadena de dos caracteres [a-z A-Z 0-9 ./]. Este valor aleatorio permite codificar una misma clave de 4096 maneras distintas (Los dos primeros caracteres de una clave codificada, son los valores de "salt", el resto hasta un total de 13 caracteres ASCII es la clave codificada segun el valor de "salt").

Una vez que sabemos un poco de teoria de como las claves son codificadas, nos podemos imaginar como se podria descifrar un clave de cuenta que es un palabra de diccionario, nombre, matricula, etc. Existen programas que codifican sistematicamente diccionarios de palabras de las 4096 maneras posibles (segun el valor "salt") y comparan cada codificacion con los valores encriptados en /etc/passwd, si algun valor coincide, significaria que una clave ha sido descifrada. Este es uno de los metodos utilizados por hackers para descifrar claves y la razon de porque no se deben utilizar claves que sean palabras de diccionarios, nombres, etc.

  • Nunca usar scripts/programas como interprete de comandos en cuentas sin clave. Un ejemplo que lei una vez en un grupo de noticias, hablaba sobre como apagar el ordenador sin necesidad de ser root. Una de las soluciones que daban era el tener la siguiente linea en el archivo /etc/passwd:

shutdown::0:0:shutdown:/sbin:/sbin/shutdown

Podemos ver que el campo de clave esta vacio, con esta linea en tu /etc/passwd cualquier usuario, local o no local, puede apagar tu ordenador haciendo un simple telnet a la maquina en cuestion y escribiendo shutdown como login. No hace falta explicar las consecuencias que esto puede tener para tu sistema.

  • Los archivos /etc/passwd y /etc/group deben tener permisos de lectura para todos para que muchos programas puedan funcionar y permisos de escritura solo para root.
-rw-r--r--  1 root root    11594 Nov 9 12:53   /etc/passwd

-rw-r--r-- 1 root root 1024 Nov 9 12:53 /etc/group

Con estos permisos, cualquiera que tenga acceso al sistema puede leer el contenido de estos archivos e intentar descifrar la clave encriptada de las cuentas. En pequeños sistemas, donde todos los usuarios se conocen y existe confianza entre ellos, esto no es un gran problema, pero en sistemas con un gran numero de usuarios, no es recomendable tener el sistema configurado de esta manera.

Para evitar esto se puede instalar "Shadow passwords". Con shadow passwords el archivo /etc/passwd puede ser leido por cualquier usuario con acceso, pero la informacion con las claves del sistema queda guardada en un archivo que solo puede ser leido por el administrador (root).


Tipos de particiones y sistemas de archivos en Linux

Particionar un disco duro es realizar una división en él de modo que, a efectos prácticos, el sistema operativo crea que tienes varios discos duros, cuando en realidad sólo hay un único disco físico dividido en varias partes. De este modo, se pueden modificar o borrar particiones sin afectar a los demás datos del disco.

Las particiones básicas se llaman primarias y puede haber a lo sumo 4. Esto puede ser suficiente para nuestros intereses. Como a veces no es así, se crearon las particiones extendidas que pueden albergar otras particiones dentro, llamadas lógicas.

Los sistemas de archivos indican el modo en que se gestionan los archivos dentro de las particiones. Según su complejidad tienen características como previsión de apagones, posibilidad de recuperar datos, indexación para búsquedas rápidas, reducción de la fragmentación para agilizar la lectura de los datos, etc. Hay varios tipos, normalmente ligados a sistemas operativos concretos. A continuación se listan los más representativos:

  • fat32 o vfat: Es el sistema de archivos tradicional de MS-DOS y las primeras versiones de Windows. Por esta razón, es considerado como un sistema universal, aunque adolece de una gran fragmentación y es un poco inestable.

  • ntfs: Es el nuevo sistema de Windows, usado a partir del 2000 y el XP. Es muy estable. El problema es que es privativo, con lo cual otros sistemas operativos no pueden acceder a él de manera transparente. Desde Linux sólo se recomienda la lectura, siendo la escritura en estas particiones un poco arriesgada.

  • ext2: Hasta hace poco era el sistema estándar de Linux. Tiene una fragmentación bajísima, aunque es un poco lento manejando archivos de gran tamaño.

  • ext3: Es la versión mejorada de ext2, con previsión de pérdida de datos por fallos del disco o apagones. En contraprestación, es totalmente imposible recuperar datos borrados. Es compatible con el sistema de archivos ext2. Actualmente es el más difundido dentro de la comunidad GNU/Linux y considerado el estándar de facto.

  • ReiserFS: Es el sistema de archivos de última generación para Linux. Organiza los archivos de tal modo que se agilizan mucho las operaciones con éstos. El problema de ser tan actual es que muchas herramientas (por ejemplo, para recuperar datos) no lo soportan.

  • swap: Es el sistema de archivos para la partición de intercambio de Linux. Todos los sistemas Linux necesitan una partición de este tipo para cargar los programas y no saturar la memoria RAM cuando se excede su capacidad. En Windows, esto se hace con el archivo pagefile.sys en la misma partición de trabajo, con los problemas que conlleva.

Ya se ha comentado que las particiones son como discos duros independientes, y así aparece en Windows. Cabe recordar que en Linux no existe el concepto de unidad (C:, D:, etc.) sino que las particiones se montan en el árbol de carpetas. Eso no nos debe preocupar mucho. Sólo comentar que la carpeta raíz de ese árbol se denota con / y que las particiones se suelen montar en la carpeta /media.


Directorios Linux

Aunque no es del todo necesario para un usuario nuevo, sí conviene que todos sepamos más o menos la estructura de directorios de Linux. Si no sabes para qué es cada carpeta o directorio en Linux, vamos a aprenderlo.

Directorios Linux

  • / (raíz): Es el nivel más alto dentro de la jerarquía de directorios de Linux. De aquí cuelgan el resto de carpetas, particiones y otros dispositivos. Es por esto que donde se instala el sistema, se selecciona la partición deseada y se le indica que el punto de montaje es justamente /.

  • /bin (binarios): Los binarios son los ejecutables de Linux. Aquí tendremos los ejecutables de los programas propios del sistema operativo, entre ellos comandos como cp, mv, cat, chown, etc. No es el único directorio que contiene ejecutables como veremos más adelante.

  • /boot (arranque): Aquí nos encontramos los archivos necesarios para el inicio del sistema, desde los archivos de configuración de Grub Lilo, hasta el propio kernel del sistema.

  • /dev (dispositivos): Linux se basa en la simpleza y en el tratamiento homogéneo de la información. Linux trata los dispositivos como si fueran un fichero más para facilitar el flujo de la información. En esta carpeta tendras los dispositivos del sistema, por ejemplo los usb, sda (o hda) con sus respectivos números que indican las particiones, etc.

  • /etc (etcétera): Aquí se guardan los ficheros de configuración de los programas instalados, así como ciertos scripts que se ejecutan en el inicio del sistema. Los valores de estos ficheros de configuración pueden ser complementados o sustituidos por los ficheros de configuración de usuario que cada uno tiene en su respectivo “home” (carpeta personal).

  • /home (hogar): Este hogar no es más que un directorio en Linux que a su vez contiene otros, uno por cada usuario dado de alta en el sistema. Dentro de dichos directorios es donde el usuario tiene su carpeta personal, donde están los ficheros de configuración de usuario, así como los archivos personales del mismo que puede crear, modificar y eliminar bajo su propio criterio.

  • /lib (bibliotecas): Contiene las bibliotecas (tambien mal conocidas como librerías) del sistema, así como módulos y controladores (drivers).

  • /lost+found (perdido y encontrado): Es una carpeta que nos podemos encontrar en todas las particiones. Cuando por cualquier circunstancia se cierra mal el sistema (un apagón por ejemplo), cuando éste se reinicie comprobaras que se llamará al programa fsck para restaurar la integridad del sistema de ficheros. En esta carpeta encontraremos la información que se mal-guardó debido a la incidencia.

  • /media (media/medios): Es donde se montan las unidades extraíbles como los dispositivos USB, disqueteras, unidades de CD/DVD y en algunas distros, como Ubuntu, las particiones adicionales.

  • /mnt (montajes): Es un directorio Linux que se suele usar para montajes temporales de unidades.

  • /opt (opcionales): Destinado para guardar paquetes adicionales de aplicaciones.

  • /proc: Información para la virtualización del sistema de ficheros de Linux.

  • /root: Es el /home del administrador. Es el único /home que no está incluido -por defecto- en el directorio anteriormente mencionado.

  • /sbin (binarios de sistema): Son los ejecutables de administración, tales como mount, umount, shutdown…

  • /srv (servicios): Información del sistema sobre ciertos servicios que ofrece (FTP, HTTP…).

  • /sys (sistema): Información sobre los dispositivos tal y como los ve el kernel Linux.

  • /tmp (temporales): Es un directorio de Linux donde se almacenan ficheros temporales. Cada vez que se inicia el sistema este directorio se limpia.

  • /usr: Es el directorio padre de otros subdirectorios de importancia:

    /usr/bin: Conjunto de ejecutables de la mayoría de aplicaciones de escritorio entre otras (por ejemplo firefox).
    /usr/include: Los ficheros cabeceras para C y C++.
    /usr/lib: Las bibliotecas para C y C++.
    /usr/local: Es otro nivel dentro que ofrece una jerarquía parecida al propio diretorio /usr.
    /usr/sbin: Otra serie de comandos administrativos para el sistema.
    /usr/share: Archivos compartidos como ficheros de configuración, imágenes, iconos, etc.
    /usr/src: Tiene en su interior el código fuente para el kernel Linux.

  • /var: Ficheros de sistema como el buffer de impresión, logs…

    /var/cache: Se almacenan datos cacheados para las aplicaciones.
    /var/lib: Información sobre el estado actual de las aplicaciones, modificable por las propias aplicaciones.
    /var/lock: Ficheros que se encargan de que un recurso sólo sea usado por una aplicación determinada que ha pedido su exclusividad, hasta que ésta lo libere.
    /var/log: Es uno de los subdirectorios más importantes ya que aquí se guardan todo tipo de logs del sistema.
    /var/mail: Los correos de los usuarios.
    /var/opt: Datos usados por los paquetes almacenados en /opt.
    /var/run: Información sobre el sistema desde que se inició.
    /var/spool: Datos esperando a que sean tratados por algún tipo de proceso.
    /var/tmp: Otro fichero temporal.


Con esto ya puedes tener idea de que contiene cada carpeta en caso de necesitar buscar algo. Con un poco de practica, podemos identificar sin problemas los directorios de Linux.

Compilar programas en Ubuntu Linux

Seguramente , en especial a los que empiezan a introducirse en el mundo de linux se encuentran que cuando descargan un programa no viene compilado (no se puede instalar directamente). Lo que tenemos que hacer es compilarlo.

Como compilar programas o aplicaciones en Ubuntu Linux

Lo primero que tenemos que hacer para compilar un programa en Ubuntu Linux es abrir un terminal y escribir el siguiente comando :

sudo apt-get install build-essential

Esto nos sirve para instalar las librerías y paquetes que necesitamos para poder generar archivos binarios. Una vez hecho esto ya podemos generar ejecutables.
Si tenemos los archivos comprimidos los descomprimimos en una carpeta. Desde el terminal acedemos a la carpeta usando el comando cd carpeta (para entrar en una carpata) y cd .. (para retroceder en las carpetas) por defecto nos encontramos en tu directorio, por ejemplo si queremos entrar en el escritorio escribimos :

cd Desktop

Una vez situados en la carpeta de los archivos ponemos :

sudo ./configure

lo que generará la configuración para nuestro pc y le dirá a GCC cómo debe compilar.

Después instalamos en el sistema, suele usarse el comando:

sudo make o sudo make install

Con esto deberiamos tener nuestro programa o aplicacion ya compilado y funcionando en Ubuntu Linux.

Caracteristicas propuestas para Ubuntu Hardy Heron

Las novedades propuestas para Ubuntu Hardy Heron:

1. Instalación limpia sin sobreescribir el /home: eso significa que podemos reinstalar el sistema sin perder nuestros datos personales.
2. Detección de hardware mejorada: si ya era buena en Gutsy, en Hardy aseguran que será mucho mejor.
3. GDM más interactivo: se podrá elegir el login según el avatar que tengamos para la cuenta.
4. Auto-detección de la frecuencia del monitor: para evitar problemas.
5. Apt mejorado: algunas veces fallaba sin razón aparente, y parece que se ha arreglado.
6. Código del Rectricted-Manager rediseñado
7. Manejo de disco duro lleno: ahora, si se te llena el disco, te avisará con antelación para utilizar la herramienta de limpieza.
8. Efectos de escritorio (Compiz Fusion) más estable.
9. Nuevo tema de escritorio: algo más claro y agradable a la vista.
10. Compartir archivos fácilmente
11. Soporte para dos o más monitores: actualmente tenías que hacerlo manualmente, pero parece ser que quieren hacer una herramienta para facilitar esto.
12. Integrar Prefetch: con lo que notaremos una pequeña mejora de velocidad a la hora de arrancar.
13. El equipo de Ubuntu colabora con Automatix: es buena noticia.
14. Instalación con un click: las instalaciones aún más fáciles.
15. Integración de Apparmor
16. Firewall de Ubuntu: facilidad para cambiar las normas del cortafuegos.
17. Mejora de Apt con aplicaciones de terceros: cuando instalamos una aplicación externa, se agregará el repositorio para poder actualizar la aplicación automáticamente.
18. Cambios a la hora de apagar.
19. Mejor integración con Wine: ayudando a solucionar el bug #1 ;)
20. Xorg 7.3
21. SlickBoot: para mejorar la apariencia del proceso de encendido/apagado.

Nota: Estas no son las únicas novedades que traerá, si no las más interesante propuestas hasta ahora.


Ancho de la tienda virtual Oscommerce

Hay ocasiones en que por gusto o por necesidad necesitamos cambiar el ancho de nuestra tienda virtual.
Esto es bastante fácil de hacer en Oscommerce.
Primero abrimos el archivo default.php (o index.php) con un buen editor de texto. Buscamos el codigo html que controla los atributos de la tabla principal de nuestro comercio electronico. Nos interesan en particular los elementos en negrita que aparecen más abajo:

Cambia esto:

<!-- body //-->

<table border="0" width="100%" cellspacing="3" cellpadding="3">

<tr>

<td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">

A esto:

<!-- body //-->

<table border="0" width="750" cellspacing="1" cellpadding="1" align=”center”>

<tr>

<td width="<?php echo BOX_WIDTH; ?>" valign="top"><table border="0" width="<?php echo BOX_WIDTH; ?>" cellspacing="0" cellpadding="2">

El cambio anterior establecerá el ancho de nuestra tienda virtual a 750 píxeles y centrará la tabla en la página. Esto también reducirá el padding y el espacio a 1 píxel.

A continuación debemos cambiar los mismos valores en header.php y footer.php en nuestro directorio /catalog/includes . Hemos concluido el segundo paso.

Y listo... ya cambiamos el ancho de la tienda virtual Oscommerce.

Variables variables en PHP

A veces es conveniente tener nombres de variables variables. Dicho de otro modo, son nombres de variables que se pueden establecer y usar dinámicamente. Una variable normal se establece con una sentencia como:

<?php

$a = "hello";

?>

Una variable variable toma el valor de una variable y lo trata como el nombre de una variable. En el ejemplo anterior, hello, se puede usar como el nombre de una variable utilizando dos signos $. p.ej.

<?php

$$a = "world";

?>

En este momento se han definido y almacenado dos variables en el árbol de símbolos de PHP: $a, que contiene "hello", y $hello, que contiene "world". Es más, esta sentencia:

<?php

echo "$a ${$a}";

?>

produce el mismo resultado que:

<?php

echo "$a $hello";

?>

p.ej. ambas producen el resultado: hello world.

Para usar variables variables con matrices, hay que resolver un problema de ambigüedad. Si se escribe $$a[1] el intérprete necesita saber si nos referimos a utilizar $a[1] como una variable, o si se pretendía utilizar $$a como variable y el índice [1] como índice de dicha variable. La sintaxis para resolver esta ambigüedad es: ${$a[1]} para el primer caso y ${$a}[1] para el segundo.

Tener en cuenta que variables variables no pueden usarse con Matrices superglobales. Esto significa que no se pueden hacer cosas como ${$_GET}.

Variable variables in PHP

Sometimes it is convenient to be able to have variable variable names. That is, a variable name which can be set and used dynamically. A normal variable is set with a statement such as:

<?php

$a = 'hello';

?>

A variable variable takes the value of a variable and treats that as the name of a variable. In the above example, hello, can be used as the name of a variable by using two dollar signs. i.e.

<?php

$$a = 'world';

?>

At this point two variables have been defined and stored in the PHP symbol tree: $a with contents "hello" and $hello with contents "world". Therefore, this statement:

<?php

echo "$a ${$a}";

?>

produces the exact same output as:

<?php

echo "$a $hello";

?>

i.e. they both produce: hello world.

In order to use variable variables with arrays, you have to resolve an ambiguity problem. That is, if you write $$a[1] then the parser needs to know if you meant to use $a[1] as a variable, or if you wanted $$a as the variable and then the [1] index from that variable. The syntax for resolving this ambiguity is: ${$a[1]} for the first case and ${$a}[1] for the second.

Please note that variable variables cannot be used with PHP's Superglobal arrays within functions or class methods. The variable $this is also a special variable that cannot be referenced dynamically.

Estructura de Control elseif en PHP

elseif, como su nombre sugiere, es una combinación de if y else. Como else, extiende una sentencia if para ejecutar una sentencia diferente en caso de que la expresión if original se evalúa como FALSE. No obstante, a diferencia de else, ejecutará esa expresión alternativa solamente si la expresión condicional elseif se evalúa como TRUE. Por ejemplo, el siguiente código mostraría a es mayor que b, a es igual a b o a es menor que b:

  

<?php

if ($a > $b) {

print "a es mayor que b";

} elseif ($a == $b) {

print "a es igual que b";

} else {

print "a es mayor que b";

}

?>


Puede haber varios elseifs dentro de la misma sentencia if. La primera expresión elseif (si hay alguna) que se evalúe como TRUE se ejecutaría. En PHP, también se puede escribir 'else if' (con dos palabras) y el comportamiento sería idéntico al de un 'elseif' (una sola palabra). El significado sintáctico es ligeramente distinto (si estas familiarizado con C, es el mismo comportamiento) pero la línea básica es que ambos resultarían tener exactamente el mismo comportamiento.

La sentencia elseif se ejecuta sólo si la expresión if precedente y cualquier expresión elseif precedente se evalúan como FALSE, y la expresión elseif actual se evalúa como TRUE.

Control structure elseif in php

elseif, as its name suggests, is a combination of if and else. Like else, it extends an if statement to execute a different statement in case the original if expression evaluates to FALSE. However, unlike else, it will execute that alternative expression only if the elseif conditional expression evaluates to TRUE. For example, the following code would display a is bigger than b, a equal to b or a is smaller than b:

There may be several elseifs within the same if statement. The first elseif expression (if any) that evaluates to TRUE would be executed. In PHP, you can also write 'else if' (in two words) and the behavior would be identical to the one of 'elseif' (in a single word). The syntactic meaning is slightly different (if you're familiar with C, this is the same behavior) but the bottom line is that both would result in exactly the same behavior.

<?php

if ($a > $b) {

echo "a is bigger than b";

} elseif ($a == $b) {

echo "a is equal to b";

} else {

echo "a is smaller than b";

}

?>


The elseif statement is only executed if the preceding if expression and any preceding elseif expressions evaluated to FALSE, and the current elseif expression evaluated to TRUE.

Estructura de control if en php

El caso de la instruccion "IF" es una de las características más importantes de muchos idiomas, incluido PHP. Permite la ejecución condicional de fragmentos de código. PHP cuenta con una estructura que es similar a la de C:

if (expr)

statement

La expresión se evalúa a su valor Boolean. Si la expresión evalúa a TRUE, PHP ejecutará las instrucciones, y si se evalúa a FALSE la ignora.

El siguiente ejemplo se mostrará que "a es mayor que b" si $ a es mayor que $ b:

<?php

if ($a > $b)

echo "a is bigger than b";

?>

A menudo, lo que se quiere es tener más de una declaración para ser ejecutado condicionalmente. Por supuesto, no hay necesidad de envolver cada declaración con una cláusula IF. En lugar de ello, podemos agrupar varias sentencias. Por ejemplo, este código mostrará "a es mayor que b" si $ a es mayor que $ b, y luego asignar el valor de $ a a $ b:

<?php

if ($a > $b) {

echo "a is bigger than b";

$b = $a;

}

?>

La declaracion IF se pueden anidar indefinidamente en el marco de otras estructuras de control, que le proporciona una total flexibilidad para la ejecución condicional de las diferentes partes de tu programa.

Control structure if in php

The if construct is one of the most important features of many languages, PHP included. It allows for conditional execution of code fragments. PHP features an if structure that is similar to that of C:

if (expr)

statement

Expression is evaluated to its Boolean value. If expression evaluates to TRUE, PHP will execute statement, and if it evaluates to FALSE - it'll ignore it.

The following example would display a is bigger than b if $a is bigger than $b:

<?php

if ($a > $b)

echo "a is bigger than b";

?>

Often you'd want to have more than one statement to be executed conditionally. Of course, there's no need to wrap each statement with an if clause. Instead, you can group several statements into a statement group. For example, this code would display a is bigger than b if $a is bigger than $b, and would then assign the value of $a into $b:

<?php

if ($a > $b) {

echo "a is bigger than b";

$b = $a;

}

?>

If statements can be nested indefinitely within other if statements, which provides you with complete flexibility for conditional execution of the various parts of your program.

Agregar repositorios Ubuntu Linux

Es posible agregar repositorios en Ubuntu, tales como los prestados por terceros o los de versiónes anteriores de Ubuntu.

Tenga cuidado al instalar software desde los repositorios de terceros. Puede que no hayan sido probados y podrian afectar su sistema Ubuntu.
  • Abra Sistema -> Administracion -> Origenes del Software y seleccione Software de Otros Proveedores.

  • Presione Agregar para agregar un nuevo repositorio.

  • Introduzca la linea APT para el. Esto debería estar disponible en el sitio web del repositorio o similar, por ejemlo:
    deb http://ftp.debian.org etch main

  • Presione Añadir y luego Cerrar para guardar los cambios

  • La mayoría de repositorios de software utilizan una clave GPG para firmar digitalmente los archivos que ofrecen, que permite comprobar que los archivos no han sido alterados desde su creación. Para que apt pueda comprobar esto, usted necesita la clave pública que corresponde a las firmas. La clave debería estar disponible para la descarga en el sitio web del repositorio.

  • Una vez que haya descargado la clave GPG, importe la clave mediante la selección de la ficha Identificación, haga clic en Importar archivo, y, a continuación, seleccionar la clave GPG a importar.

  • Haga clic Recargar en el gestor de paquetes para actualizar la lista de paquetes disponibles.

Adding extra repositories in Ubuntu

It is possible to add extra repositories, such as those provided by third parties or those for older version of Ubuntu.

Be careful when installing software from third-party repositories. It may not have been tested with Ubuntu and could cause your system to break.

  • Open System -> Administration -> Software Sources and press Third-Party Software.
  • Press Add to add a new repository.
  • Enter the APT line for the extra repository. This should be available from the website of the repository or similar, and should look similar to the following:
    deb http://ftp.debian.org etch main
  • Press Add Source and then click Close to save your changes.
  • Most software repositories use a GPG key to digitally sign the files they provide, which makes it easy to check that the files have not been tampered with since their creation. In order for apt to be able to check this, you need the public key that corresponds to the signatures. The key should be available for download on the repository's website.
  • Once you have downloaded the GPG key, import the key by selecting the Authenticate tab, and clicking on Import Key File..., and then selecting the GPG key to be imported.
  • Click Reload in the package manager to update the list of available packages.

How To Connecting to and Disconnecting from the Mysql Server

To connect to the server, you will usually need to provide a MySQL user name when you invoke mysql and, most likely, a password. If the server runs on a machine other than the one where you log in, you will also need to specify a host name. Once you know the proper parameters, you should be able to connect like this:

shell> mysql -h host -u user -p
Enter password: ********

host and user represent the host name where your MySQL server is running and the user name of your MySQL account. Substitute appropriate values for your setup. The ******** represents your password; enter it when mysql displays the Enter password: prompt.

If that works, you should see some introductory information followed by a mysql> prompt:

shell> mysql -h host -u user -p
Enter password: ********

Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 25338 to server version: 5.0.56-standard
Type 'help;' or '\h' for help. Type '\c' to clear the buffer.
mysql>

The mysql> prompt tells you that mysql is ready for you to enter commands.

If you are logging in on the same machine that MySQL is running on, you can omit the host, and simply use the following:

shell> mysql -u user -p

If, when you attempt to log in, you get an error message such as ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2), it means that that MySQL server daemon (Unix) or service (Windows) is not running.

Some MySQL installations allow users to connect as the anonymous (unnamed) user to the server running on the local host. If this is the case on your machine, you should be able to connect to that server by invoking mysql without any options:

shell> mysql

After you have connected successfully, you can disconnect any time by typing QUIT (or \q) at the mysql> prompt:

mysql> QUIT
Bye

On Unix, you can also disconnect by pressing Control-D.

Permisos en Linux - Seguridad del sistema de archivos Linux

El sistema de permisos en el sistema operativo Linux se basa en un esquema de usuarios/grupos que lo convierte en la base principal de la seguridad en Linux, a estos usuarios y grupos se les asignan distintos derechos sobre los archivos y directorios de Linux.
Esta es una de las características que ayudan a que Linux sea casi inmune a los Virus de computadora, los virus deben ser capaces de escribir sobre un archivo para poder infectarlo y ejecutarse de alguna manera para poder infectar mas archivos, con el sistema de permisos de Linux los virus no pueden copiarse a cualquier archivo, si el usuario carece de permisos el virus no podrá infectar más archivos y por lo tanto no podrá reproducirse.

Todos los archivos y directorios en el sistema operativo Linux tienen permisos que verifican quien puede hacer o no alguna acción con él.

Cuales son los permisos en Linux?

Los permisos propiamente dichos son tres:

  • r: read (lectura): Cuando el permiso de lectura está activo sobre un directorio significa que se podrá listar los recursos almacenados en él, si está asignado a un archivo se podrá leer su contenido.
  • w: write (escritura): Cuando el permiso de escritura está activo sobre un directorio significa que se podrá crear y borrar archivos en su interior, si esta activado para un archivo significa que se podrá modificar su contenido.
  • x: execute (ejecución): Si el permiso de ejecución está activo sobre un directorio significa que el usuario podrá realizar otras funciones dentro de él mediante los otros permisos de lectura y escritura, y si está activo sobre un archivo se podrá ejecutarlo desde la línea de comandos.

Y donde están los permisos en linux?

Para poder ver los permisos de los archivos y directorios en el sistema operativo Linux es necesario ejecutar el siguiente comando:

$ ls –l

Este comando nos dará una salida similar a la siguiente:

drwxr-xr-x 3 fabian fabian 4096 2005-02-16 14:47 Desktop
drwxr-xr-x 5 fabian fabian 4096 2005-02-16 12:42 GNUstep
-rw-r--r-- 1 fabian fabian 246417 2005-03-03 13:13 imagen1.png
-rw-r--r-- 1 fabian fabian 232505 2005-03-03 13:14 carta2.abw
-rw-r--r-- 1 fabian fabian 239618 2005-03-03 13:14 informe.abw
drwxr-xr-x 2 fabian fabian 4096 2005-02-16 12:42 tmp

Con la siguiente línea interpretamos la información así:

- rw- r -- r -- 1 fabian fabian 246417 2005-03-03 13:13 imagen1.png

1 : Tipo de archivo = es un archivo regular
2 : Permisos = los permisos para el propietario son de lectura y escritura
3 : Permisos = el grupo tiene permiso de sólo lectura
4 : Permisos = los otros usuarios tienen el permiso de sólo lectura
5 : Enlace Físico = tiene un enlace físico
6 : Propietario = el usuario fabian es el propietario de este archivo
7 : Grupo = este archivo pertenece al grupo fabian
8 : Tamaño = su tamaño es de 246417 bytes
9 : Fecha = fue creado el 03 de marzo de 2005
10 : Hora = a 13:13 horas
11 : Nombre = el archivo se llama imagen1.png

Como habrás apreciado los permisos están asignados en grupos de 3 (rwx) y corresponde al: propietario (owner: dueño del archivo o directorio), grupo (group: grupo del archivo o directorio) y otros (others: otro usuario diferente del propietario).

COMANDOS RELACIONADOS EN LINUX

Linux dispone de 3 comandos que permite cambiar los permisos, el propietario y el grupo de un archivo y/o directorio respectivamente:

  • Comando chmod : se utiliza para cambiar los permisos del archivo o directorio
    $ chmod [permisos] [archivo/directorio] [opciones]
  • Comando chown : se utiliza para cambiar el propietario del archivo o directorio
    # chown [nuevo usuario propietario] [archivo/directorio] [opciones]
  • Comando chgrp : utilizado para cambiar el grupo del archivo o directorio
    # chgrp [nuevo grupo] [archivo/directorio] [opciones]

¿COMO SE CAMBIAN LOS PERMISOS EN LINUX?

Para cambiar los permisos en el sistema operativo linux se puede hacer de 2 maneras:

1. Utilizando taquigrafía basada en caracteres, o
2. Utilizando números.

1. CAMBIO DE PERMISOS EN LLINUX UTILIZANDO TAQUIGRAFÍA DE CARACTERES

Para poder utilizar la taquigrafía basada en caracteres tomemos en cuenta la siguiente lista con su respectiva correspondencia:

Identidades en linux

u Es el usuario propietario del archivo o directorio
g Es el grupo al que pertenece el archivo o directorio
o Otros usuarios, el resto del mundo, ni el propietario ni su grupo
a Todo el mundo – propietario, grupo y otros

Permisos en linux

r Acceso de lectura
w Acceso de escritura
x Acceso de ejecución

Acciones en linux

+ Añade los permisos
- Elimina los permisos
= el único permiso

Vamos a practicar con el comando chmod, para ello lo primero que haremos será crear el archivo imagen1.png para ver los cambios de permisos, así que les recomiendo seguir la secuencia:

$ touch imagen1.png
creamos el archivo imagen1.png
Resultado: imagen1.png

$ chmod a-rwx imagen1.png
quitamos todos los permisos al archivo imagen1.png
Resultado:
---------

$ chmod u+rwx imagen1.png
añadimos todos los permisos para el propietario

Resultado:
rwx------

$ chmod g+x imagen1.png
añadimos el permiso de ejecución para el grupo
Resultado: rwx—x---

$ chmod o+r imagen1.png
añadimos el permiso de lectura para los otros usuarios

Resultado:
rwx—xr--

$ chmod u-rw imagen1.png
eliminamos los permisos de lectura y escritura para el propietario

Resultado: --x—xr--

$ chmod a=r imagen1.png
establecemos como unico permiso de lectura para los 3 grupos
Resultado:
r—r—r--

$ chmod a=rx imagen1.png
establecemos los permisos de lectura y ejecución para los 3 grupos
Resultado: r-xr-xr-x

$ chmod a=- imagen1.png
quitamos todos los permisos
Resultado:
----------

$ chmod u+rx,o+x imagen1.png
añadimos los permisos de lectura y ejecución al propietario y ejecución a otros
Resultado: r-x-----x

$ chmod g+rx,o-x imagen1.png
añadimos permiso de lectura y ejecución al grupo y eliminamos permiso de ejecución a otros
Resultado: r-xr-x---

$ chmod ug+wx,o-x imagen1.png
añadimos permiso de escritura y ejecución al propietario y grupo, y eliminamos permiso de ejecución a otros

Resultado:
rwxrwx---

$ chmod a=rw imagen1.png
permite a cualquiera modificar el contenido e incluso eliminar el archivo
Resultado:
rw-rw-rw-

Si cambiamos los permisos a un directorio y deseamos que estos permisos tengan efecto sobre todos sus subdirectorios y archivos sólo deberemos añadir la opción –R. Ejemplo:

$ chmod a=rw DIRECTORIO –R

2. CAMBIO DE PERMISOS EN LINUX UTILIZANDO NÚMEROS

Cada permiso en el sistema operativo Linux tienen asignado un valor, incluso cuando el permiso no está activo. Para poder utilizar los números tendremos que tener en cuenta la siguiente tabla con sus respectivos valores:

r = 4 (lectura)
w = 2 (escritura)
x = 1 (ejecucion)
- = 0 (sin permisos)

Cuando asignamos los permisos en el sistema operativo Linux utilizando números debemos tener en cuenta que primero se sumarán los valores y dicho resultado será el que se coloque, aquí una tabla que muestra dichos valores:

0 --- El valor cero significa que no se han asignado permisos
1
--x sólo se ha asignado el de ejecución
2
-w- sólo permiso de escritura
3
-wx permisos de escritura y ejecución
4
r-- sólo permiso de lectura
5
r-x permisos de lectura y ejecución
6
rw- permisos de lectura y escritura
7
rwx permisos: lectura, escritura y ejecución

Los permisos por números se asignan en grupos de 3, es decir, para el propietario-grupo-otros, no es factible asignar solo para uno o dos de ellos.

Ejemplos:

  • rw------- (600) — Sólo el propietario tiene el derecho de leer y escribir.
  • rw-r--r-- (644) — Sólo el propietario tiene los permisos de leer y escribir; el grupo y los demás sólo pueden leer.
  • rwx------ (700) — Sólo el propietario tiene los derechos de leer, escribir y ejecutar el archivo.
  • rwxr-xr-x (755) — El propietario tiene los derechos de leer, escribir y ejecutar; el grupo y los demás sólo pueden leer y ejecutar.
  • rwx--x--x (711) — El propietario tiene los derechos de lectura, escritura y ejecución; el grupo y los demás sólo pueden ejecutar.
  • rw-rw-rw- (666) — Todo el mundo puede leer y escribir en el archivo. ¡No es una buena elección!
  • rwxrwxrwx (777) — Todo el mundo puede leer, escribir y ejecutar. ¡Tampoco es buena elección!

Utilizaremos el mismo ejercicio anterior para poder practicar con los permisos utilizando números, el único cambio que haremos será utilizar otro archivo llamado imagen2.png:

$ touch imagen2.png
creamos el archivo imagen2.png
Resultado: imagen2.png

$ chmod 000 imagen2.png
quitamos todos los permisos al archivoimagen2.png
Resultado:
----------

$ chmod 700 imagen2.png
añadimos todos los permisos para el propietario
Resultado:
-rwx------

$ chmod 710 imagen2.png
añadimos el permiso de ejecución para el grupo
Resultado:
-rwx—x---

$ chmod 714 imagen2.png
añadimos el permiso de lectura para los otros usuarios
Resultado: -rwx—xr--

$ chmod 114 imagen2.png
eliminamos los permisos de lectura y escritura para el propietario
Resultado: ---x—xr--

$ chmod 444 imagen2.png
establecemos como unico permiso de lectura para los 3 grupos
Resultado: -r—r—r--

$ chmod 555 imagen2.png
establecemos los permisos de lectura y ejecución para los 3 grupos
Resultado: -r-xr-xr-x

$ chmod 000 imagen2.png
quitamos todos los permisos
Resultado:
-----------

$ chmod 501 imagen2.png
añadimos los permisos de lectura y ejecución al propietario y ejecución a otros
Resultado: -r-x-----x

$ chmod 550 imagen2.png
añadimos permiso de lectura y ejecución al grupo y eliminamos permiso de ejecución a otros
Resultado: -r-xr-x---

$ chmod 770 imagen2.png
añadimos permiso de escritura y ejecución al propietario y grupo, y eliminamos permiso de ejecución a otros
Resultado: -rwxrwx---

$ chmod 666 imagen2.png
permite a cualquiera modificar el contenido e incluso eliminar el archivo
Resultado: -rw-rw-rw-

CAMBIANDO PROPIETARIOS Y GRUPOS EN LINUX

Otro de los puntos a la hora de establecer permisos en Linux es la necesidad de poder cambiar el propietario y grupo del archivo o directorio, para hacer esta operación debe estar como root y los usuarios y grupos que utilizará deben haber sido creados previamente.

Cambiando el propietario en Linux

Utilizamos el comando chown explicado líneas arriba:

# chown clases imagen1.png
estamos cambiando el propietario del archivo, ahora el usuario clases será el propietario del archivo imagen1.png

# chown fabian imagen2.png
el usuario fabian será el propietario del archivo imagen2.png

Si vamos a cambiar el propietario de un directorio y con todos sus subdirectorios y archivos en forma recursiva utilizaremos la opción –R:

# chown clases datos/ –R
el usuario clases sera el nuevo propietario de todos los archivos y subdirectorios que estén dentro del directorio datos/

Cambiando el grupo de usuarios en Linux

Utilizamos el comando chgrp explicado líneas arriba:

# chgrp clases imagen1.png
estamos cambiando el propietario del archivo, ahora el archivo imagen1.png será del grupo clases

# chgrp fabian imagen2.png
el archivo imagen2.png será del grupo fabian

Si vamos a cambiar el grupo de un directorio y con todos sus subdirectorios y archivos en forma recursiva utilizaremos la opción –R:

# chgrp clases datos/ –R
todos los archivos y sub directorios del directorio datos/ serán del grupo clases


Manejo de archivos en Php

Apertura de un archivo con PHP

La función utilizada para abrir un archivo en PHP es fopen, la sintaxis.

fp_handler=fopen(“path”,”modo”);

Path es la ruta completa del archivo a abrirmediante codigo Php, si el path comienza con “http://” se realiza una conexión a la URL indicada y se abre la página como si fuera un archivo (con las limitaciones lógicas, por ejemplo no es posible escribir).
Los modos en los que se puede abrir un archivo con Php son:

r Sólo lectura
r+ Lectura y escritura
w Sólo escritura, si no existe el archivo lo crea, si existe lo trunca
w+ Lectura y escritura, si existe lo trunca, si no existe lo crea
a Modo append sólo escritura si no existe lo crea
a+ Modo append lectura y escritura si no existe lo crea

La función devuelve un file_handler que luego debe ser usado en todas las funciones de tipo fnombre_funcion, como por ejemplo fgets, fputs, fclose, fread, fwrite, etc.

Lectura desde un archivo con Php

Las funciones que pueden usarse para leer un archivo desde el codigo Php son:

string=fgets(file_handler, longitud) : Lee una línea de texto hasta el fin de línea o bien hasta que se cumpla la longitud indicada, devuelve el resultado en la variable pasada. El archivo debe estar abierto con fopen.

var=fread(file_handler, cantidad): Lee la cantidad de bytes indicados ignorando saltos de línea y deja el resultado en la variable var.

Ejemplo

$buffer=fread($fp, 1024); //Lee 1Kb desde el archivo cuyo handler es $fp

string=fgetss(file_handler, longitud) Idéntica a fgets con la diferencia de que los tags html son eliminados del archivo a medida que se lee el mismo. Opcionalmente puede pasarse una lista de tags que no deben ser eliminados.

Ejemplo:

$string=fgetss($fp,999999,”<b> <i> <table> <tr> <td>”);

Lee una línea (de cualquier longitud) eliminando los tags html excepto los indicados como segundo parámetro. Los tags que cierran los tags especificados en la lista de tags permitidos tampoco son eliminados.

Escritura a un archivo con Php

fwrite(file_handler, variable, longitud);

Escribe la variable al archivo indicado por file_handler. Si esta indicado el parámetro “longitud” (que es opcional) se escribirán tantos bytes como la longitud indicada por dicho parámetro o como la longitud de la variable, en aquellos casos en que el parámetro longitud es mayor que la longitud de la variable.
La función devuelve la cantidad de bytes escritos en el archivo.

Ejemplo:

$q = fwrite($fp,$buffer,999999);

fputs es idéntico a fwrite y funciona de la misma manera. (es un alias).

Cierre de archivos con Php

fclose(file_handler)

Cierra un archivo abierto con fopen.

Fin de archivo con Php

boolean = feof(file_handler);

Devuelve verdadero si no quedan más bytes para leer en el archivo o si se produce algún tipo de error al leer.

Ejemplo:
$fp=fopen(“/usr/luis/archivo.txt”,”r”);
while(!feof($fp)) {
$s=fgets($fp,999999);
print(“$s”);
}



Manejo de archivos con Php

PHP provee funciones para copiar, renombrar, mover y borrar archivos y directorios, las funciones son:

rename(path_origen, path_destino); Renombra un archivo.

Ejemplo:
$newname=”/usr/eduardo/file.txt”;
Rename(“/usr/eduardo/archivo.txt”,”$newname”);

unlink(path_a_borrar); Elimina un archivo.

rmdir(directorio_a_borrar); Elimina un directorio (debe estar vacío)

mkdir(path_a_crear); Crea un directorio Nuevo.

copy(path_origen, path_destino); Copia un archivo o varios.

Otras funciones útiles con Php

fseek(file_handler,posicion,desde) Posiciona el puntero de lectura/escritura de un archivo en el offset indicado. El parámetro “desde” es opcional y puede tomar uno de los siguientes valores:

SEEK_SET (el offset es absoluto)
SEEK_CUR (el offset es relativo a la posición actual)
SEEK_END (el offset es desde el final del archivo)

El default es SEEK_SET

ftruncate(file_handler, longitud) Trunca el archivo indicado a la longitud en bytes especificada.

array=file(path) Lee un archivo de texto y devuelve un vector donde cada elemento del vector es una línea del archivo.

file_exists(path) Devuelve true/false según el path indicado exista o
no.

filemtime(path) Devuelve la fecha de última modificación de un archivo en formato Unix. (ver manejo de fechas)

filesize(path) Devuelve el tamaño de un archivo.

filetype(path) Devuelve el tipo de un archivo.

flock(file_handler,modo) Lockea un archivo (independientemente del filesystem),
el modo puede ser:

1: Lock en modo lectura (compartido)
2: Lock en modo escritura (exclusivo)
3: Release del lock adquirido.

Al hacer un fclose del archivo se liberan automáticamente los locks adquiridos sobre el mismo.
Si flock no puede obtener el lock espera hasta que el lock este disponible, si se quiere que flock no bloquee el script sumar 4 al modo (modos: 5,6,7) y consultar por el valor devuelto por la función: true si el lock fue adquirido o false si no fue adquirido. Usando esta función pueden implementarse mecanismos de sincronización entre procesos.

fpassthru(file_handler) Escribe al standard_output el contenido del archivo.

readfile(path) Lee todo el archivo y lo escribe al standard output.

is_dir(path) True/false según el path sea un directorio

is_file(path) True/false según el path sea un archivo

tempnam(path) Dado el nombre de un directorio devuelve un nombre de archivo que no existe en el directorio dado (útil para crear archivos temporarios)

Manejo de directorios con Php

Las siguientes funciones de PHP están orientadas a recorrer directorios y obtener los archivos que se encuentran dentro de ellos. Las funciones son independientes del file-system con lo cual funcionan correctamente tanto en UNIX como en Windows.

directory_handle = opendir(path);
Abre el directorio pasado como parámetro y devuelve un handler al directorio, previamente puede usarse la función is_dir(path) para verificar si el path es un directorio en caso de que esta validación sea necesaria.

string = readdir(directory_handler)
Lee la próxima entrada en el directorio abierto con opendir, usualmente las dos primeras entradas de un directorio con “.” y “..” por lo que el código que procesa los archivos del directorio debe tener esto en cuenta para no procesar dichas entradas en caso de que tal cosa no sea deseable.

closedir(directory_handler)
Cierra un handler abierto con opendir.

rewinddir(directory_handler)
Rebobina el puntero interno de un directorio para que apunte nuevamente al comienzo del mismo.

Video de funcionamiento de Compiz Fusion en Ubuntu Linux

Tras instalar Ubuntu 7.10 Gutsy la mayoría lo primero que busca es cómo activar Compiz Fusion ya que es una de sus novedades principales.
Para activarlo (o instalarlo) nada mejor que seguir la guia de Ubuntu. Solo hay que ir a
http://www.guia-ubuntu.org/index.php?title=Xgl_y_Beryl
donde se detalla el proceso de instalación / activacion de Compiz Fusión en Ubuntu 6.10, 7.04 y 7.10.
Para ver como funciona, dejo aqui un video






Video performance Compiz Fusion

After installing Ubuntu 7.10 most the first thing you are looking for is how to activate Compiz Fusion since it is one of their highlights.
To activate (or install) nothing better than to follow the guide Ubuntu. Here I leave the Link
http://ubuntuguide.org/wiki/Ubuntu:Gutsy#Advanced_Desktop_Effects_.28Compiz_Fusion.29
this page describes the process of installation / activation of Compiz Fusion on Ubuntu



Cookie Php - Sesiones en Php

Uno de los problemas clásicos en el desarrollo de web sites y aplicaciones web es la perdida de persistencia cuando el usuario pasa de una página a otra. Debido a las características de diseño del protocolo HTTP que fuerza una nueva conexión y desconexión por cada request no es posible saber quien está accediendo a que página o en que lugar esta cada usuario del site. Mantener persistencia a lo largo de la navegación del sitio ha sido uno de los temas más complejos e importantes en el desarrollo de aplicaciones web. Vamos a detallar distintos métodos que pueden usarse en programacion PHP para mantener persistencia.

Cookies php y sesiones php

Sesiones en Php

Se suele definir como una sesión Php al tiempo en el que un usuario determinado se encuentra navegando en el sitio, dependiendo de la definición podemos decir que si el usuario no navega por el sitio durante una cierta cantidad de minutos ha terminado su sesión en el sitio y a partir de allí cuando vuelve a ingresar lo hace en una nueva sesión. El concepto de sesión es útil porque es posible asociar a cada sesión un identificador único de forma tal de registrar la actividad del usuario en el site y mantener persistencia utilizando únicamente este identificador, el problema pasa a ser como mantener la persistencia del identificador de sesión (SID) de ahora en adelante, y las posibilidades son las que detallamos a continuación:

Cookies Php

Uno de los mecanismos más usados para mantener persistencia con Php es el mecanismo de cookies, inventado por Netscape y hoy en día aceptado por casi todos los browsers, en especial los más populares. El concepto es que mediante un header del protocolo HTTP el server pueda almacenar información en el cliente. A esta información que el server guarda en el cliente se la denomina “cookie”. Las cookies pueden habilitarse o deshabilitarse desde el navegador web por lo que algunos usuarios no lo soportan, son de uso bastante general en muchos web sites a punto tal que en sites de la importancia de yahoo si el usuario no tiene habilitadas las cookies prácticamente no puede utilizar la mayoría de los servicios del site. Cuando el server envía un header con un cookie, el navegador web, si acepta cookies, guarda la información enviada en un archivo de texto con un formato especial. Cada vez que el browser solicita una página del dominio que envió la cookie re-envia la cookie al site, de esta forma es posible mantener persistencia. La información que puede guardarse en una cookie esta limitada por lo que habitualmente se utiliza la misma para mantener el identificador de sesión del usuario almacenándose el resto de los datos necesarios en el servidor usando el session-id de la cookie como clave.
Para crear un cookie en PHP se utiliza la función setcookie cuya sintaxis es la siguiente:

int=setcookie(nombre, valor, expiración, path, dominio);

Nombre : Nombre de la cookie a setear por ejemplo “sesion
Valor : Valor que contendrá la cookie, como por ejemplo “khdhkfdh47”
Expiracion : Fecha de vencimiento de la cookie (fecha en la cual el browser la borra del disco del usuario), debe estar en formato Unix. En general el uso más practico es time()+tiempo donde tiempo es la cantidad de segundos de vida de la cookie.
Path : En general no se usa, suele setearse en “/”
Dominio : Dominio para el cual el cookie es valido eje mplo “.prueba.com” en cuyo caso sirve para algo.prueba.com, site1.prueba.com, site2.prueba.com y todos los de la misma forma.
La función devuelve verdadero si pudo setearse la cookie o falso en caso contrario (por ejemplo si el browser no acepta cookies)
Ejemplo de cookie en Php:

$val=setcookie(“sesion”,”1”,time()+3600,”/”,”.prueba.com”);

Para recuperar el valor de una cookie en Php se debe usar el vector de PHP $HTTP_COOKIE_VARS que es un vector asociativo indexado por nombre de cookie.
Ejemplo para recuperar el valor de una cookie con Php:

$ck=$HTTP_COOKIE_VARS[“sesion”];

Con lo cual se recupera el valor de la cookie.

Las cookies son sumamente practicas para manejar sesiones Php, en cada página se verifica si el usuario tiene seteada la cookie con nombre “session” si la tiene se recupera el valor de la sesión, si no la tiene se crea un identificador de sesión nuevo y único y se setea la cookie php correspondiente con el vencimiento que corresponde según la duración que uno considere necesaria. Luego el identificador de sesión es accesible en cada página para almacenar valores por ejemplo en la base de datos como el nombre del usuario, preferencias de la sesión y otros valores. La recuperación de la cookie y su creación en caso de no existir se puede colocar en un modulo php que luego se incluye en cada página por ejemplo mod_session.php solo hay que recordar en cada página hacer un include(“mod_session.php”); y luego se puede usar la variable $session_id (o el nombre que se le haya dado en el modulo) para guardar y recuperar valores correspondientes a la sesión actual.

2. URL

Otro método posible para pasar información desde una página a otra es mediante el URL de la página en cuestión, usando el URL se pueden pasar datos de una página a otra usando el query string de la forma:

http://dominio/path?query_string

Donde query_string es de la forma: variable=valor&variable2=valor2&variable3=valor3 … etc…
De esta forma podríamos hacer un manejo similar al anterior pero pasando el session_id usando el url en lugar de usando cookies, la desventaja de este método es que todos los links deben generarse dinámicamente en PHP para agregar a la dirección del link el valor del cookie de la forma:

<a href=”http://dominio/path?session=<?print(“$session_id”);?>”>

El funcionamiento es similar, no requiere que el browser tenga habilitados cookies pero altera la forma en que se escriben los links y afea un poco la forma en la cual se muestra la URL de la página actual, podría por ejemplo tener consecuencias como entorpecer la tarea de generar el bookmark de una determinada página.

Sesiones PHP

PHP soporta en forma nativa desde el lenguaje el concepto de sesiones, se pueden manejar sesiones php en forma transparente al usuario, el lenguaje define una constante PHPSESSID con el identificador de cada sesión y se encarga de propagar el mismo usando cookies o bien el URL de la página en caso de que los cookies estén deshabilitados.
Para usar cookies en PHP es necesario invocar la función session_start(); en el comienzo del script, esta función se encarga de recuperar el session_id en la constante $PHPSESSID y si la sesión no existe crea una nueva.
Si PHP esta compilado con la opción –enable-trans-sid el interprete se encarga de re-escribir dinámicamente las URLs agregando el session_id en caso de que el usuario no tenga cookies, en caso contrario hay que modificar los links de la forma:

<a href=”/lugar?PHPSESSID=<?echo “$PHPSESSID”?>”>

PHP dispone además de funciones para “registrar” variables dentro de una sesión, esto se hace llamando a la función session_register(); Por ejemplo:

<?
session_start();
$x=”hola”;
session_register(“x”);
?>

Notar que session_register recibe el “nombre” de la variable a registrar sin “$”. Una vez registrada una variable la misma estará disponible en todas las páginas que usen session_start durante la sesión actual, es decir que si desde la página donde hicimos el session_register el usuario se traslada a otra página que usa session_start entonces la variable $x automáticamente estará definida y con el valor “hola” ya que es una variable registrada dentro de la sesión. Cualquier tipo de variable de PHP puede registrarse con este método, incluyendo objetos (sólo las propiedades del objeto se registran, no los métodos!)

Otras funciones de manejo de sesiones con Php:

session_id(); Devuelve el id de la sesión actual, si se le pasa como parámetro un string cambia el id de la sesión al string pasado, esta función hace lo mismo que la consulta directa a la variable $PHPSESSID
session_destroy(); Destruye la sesión actual y todas las variables registradas.
session_name(); Devuelve el nombre de la sesión actual (PHPSESSID), si se le pasa como parámetro un string cambia el nombre de la sesión y por consiguiente de la variable que contiene el id de la sesión al valor pasado.
session_unregister(variable_name); Elimina de la sesión una variable registrada con session_register
session_is_registered(variable_name); Dice si una variable esta o no registrada en la sesión actual (devuelve true/false), notar que es equivalente a la función isset pero tomando en cuenta la sesión.

Manejo avanzado de sesiones PHP

Una pregunta interesante relativa al manejo de sesiones en PHP es como se almacenan los datos de la sesión (las variables registradas y demás), en PHP por omisión los datos sobre las sesiones se almacenan en archivos en el directorio /tmp, este método funciona correctamente pero tiene 2 inconvenientes:

1. No es fácil compartir sesiones entre servers.

Dado que los datos se almacenan en un file-system una variable “registrada” en un server no puede ser visible en otro ya que el mismo no tiene forma de recuperar el contenido de la misma. (Podría hacerse si se cambia el directorio /tmp a un directorio compartido entre maquinas usando NFS pero este no es el tema aquí)

2. Dada una cantidad de usuarios realmente elevada el método no es eficiente.

Estamos hablando de cantidades de usuarios realmente muy grandes simultáneos, dados los cuales hay demasiadas sesiones por mantener y el file-system se torna lento en la búsqueda y recuperación de los archivos con los datos.
Afortunadamente en PHP es posible redefinir los métodos de almacenamiento que el lenguaje utiliza para almacenar las sesiones Php. Esto se hace con la función session_set_save_handler
Ejemplo:

session_set_save_handler ("open", "close", "read", "write", "destroy", "gc");

Que recibe como parámetros los “nombres” de 6(seis) funciones, cuyos prototipos y funcionalidad son los siguientes:

function open ($save_path, $session_name) Se llama luego de cada session_start, recibe un path y un nombre de sesión que por omisión es PHPSESSID.
function close() Cierra la sesión.
function read ($key) Dada una clave “key” recupera para la sesión actual el valor de la clave pasada.
function write ($key, $val) Guarda un par clave-valor para la sesión actual.
function destroy ($key) Destruye la clave pasada como parámetro.
Function gc($maxlifetime) Garbage collection, se encarga de destruir los datos de las sesiones Php vencidas.

En general en open no es necesario hacer nada ya que todo el manejo de Registración de variables esta dado por read y write. Write recibirá como clave el identificador de la sesión y como datos una estructura interna de php que contiene la representación de todos los datos a almacenar para la sesión. De la misma forma read debe ,dada la clave (session_id), recuperar todos los datos de la sesión y luego php en forma interna setea las variables correspondientes para que sean visibles.

Todas las funciones deben devolver “true” para que el manejo de sesiones funcione.

Con esta información, ya podemos mediante programación Php, manejar mejor la persistencia en php, ya sea con cookies php o sesiones php.