LAMP: Linux, Apache MySQL y PHP/Perl
LAMP: Linux, Apache, MySQL y PHP/Perl
Diego Chaparro (dchaparro@acm.org)
5 de Abril de 2006
Preámbulo
Este documento no pretende ser una guía completa de todas las tecnologías explicadas, sino simplemente una pequeña guía basada en notas que sirva como introducción a cada uno de los entornos aquí descritos.
Este documento no está libre de errores y está en continuo desarrollo.
Licencia
Este documento se distribuye bajo la licencia Creative Commons Attribution-ShareAlike. Para obtener la licencia completa véase:
http://creativecommons.org/licenses/by-sa/2.1/es/
Índice de contenido
1 Introducción 3
1.1 GNU/Linux 3
1.2 Apache 3
1.3 PHP 4
1.4 Perl 4
1.5 MySQL 5
1.6 Herramientas adicionales 5
2 Linux 6
2.1 Sistema de ficheros 6
2.2 Comandos básicos 7
3 Apache 7
3.1 HTTP 7
4 PHP 9
4.1 Referencia del lenguaje 9
4.2 Más características 15
4.3 Editores 17
4.4 Conexión con MySQL 17
5 Perl 18
5.1 Referencia del lenguaje 18
5.2 Más características 22
5.3 Conexión con MySQL 26
6 MySQL 26
6.1 Permisos de acceso 26
6.2 Acceso de usuarios 27
6.3 Creación de usuarios 27
6.4 Restaurar contraseña del administrador 28
6.5 Operaciones habituales 28
6.6 Tipos de datos 29
7 Herramientas adicionales 30
7.1 CVS 30
7.2 SSH 31
8 Referencias 32
Sistema operativo basado en Software Libre
Libre ≠ Gratis
El software libre proporciona 4 libertades:
Libertad de uso
Libertad de redistribución
Libertad de modificación
Libertad de redistribución de las modificaciones
No comparte origen ni diseño con ningún Unix, pero sí su filosofía de diseño (Minix).
Inicialmente creado por Linus Torvalds en 1991, proyecto de tesis
Pero linux es solo el kernel. GNU es el conjunto de aplicaciones
Distribución: recopilación de un kernel de Linux y un conjunto de aplicaciones disponibles en el mundo del Software Libre.
Ejemplos: Debian, Red-Hat (Fedora), Mandriva, Suse, Ubuntu, ...
Potente y flexible servidor web
Usado en más del 68% de todos los servidores web (datos de netcraft en Marzo 2006 [6])
Altamente configurables y extensibles a través de módulos
Versiones para Windows, Netware, OS/2, Unix, Linux, ...
Características generales:
No es un lenguaje de propósito general
Es un lenguaje "Open Source"
Interpretado de alto nivel
Embebido en páginas HTML.
Ejecutado en el servidor
Compatible con varios sistemas operativos (Linux, Unix, Windows, Mac OS, ...) y servidores web (Apache, IIS, Netscape, ...)
Programación procedimental o programación orientada a objetos
Compatible con gran número de bases de datos: dBase, Informix, MySQL, Oracle, PostgreSQL, Sybase, ODBC, Interbase, Adabas D, ...
Soporte para muchos protocolos: LDAP, IMAP, SNMP, NNTP, POP3, HTTP y muchos otros
Y muchas cosas más ;-)
Más información en [5]
Características generales:
Lenguaje de propósito general
Originalmente desarrollado para tratamiento de textos, pero actualmente utilizado para muchos propósitos: administración de sistemas, desarrollo web, programación de red, ...
Su diseño se basa en ser un lenguaje práctico: fácil de usar, eficiente y completo.
Lenguaje interpretado
Programación procedimental o programación orientada a objetos
Impresionante colección de módulos perl (CPAN): ficheros, protocolos, bases de datos, gráficos, seguridad, ...
Más información en [4]
Servidor de bases de datos relacionales “Open source”
Rápido, seguro, y fácil de usar.
Amplio subconjunto del lenguaje SQL
Accesible desde un gran número de lenguajes de programación
Replicación
CVS
Implementa un sistema de control de versiones
Permite que varios desarrolladores colaboren
El proyecto completo está en el servidor (repositorio) y cada cliente tiene una copia
Cada cliente modifica lo que necesite y sube los cambios al servidor
Si hay conflicto el sistema avisa al usuario
Se puede recuperar la historia
Se pueden crear ramas de desarrollo
SSH
Protocolo para acceso a máquinas remotas
Ejecución de comandos en la máquina remota
Normalmente acceso en modo texto
Ventaja principal frente a telnet o rlogin: cifrado
También se utiliza para copiar ficheros mediante canales cifrados: scp o sftp.
Cliente para windows: putty, pscp, psftp.
En forma de árbol
El directorio raíz se expresa con el símbolo /
PATH relativo: ruta entre el directorio actual y un fichero o directorio
PATH absoluto: ruta entre el directorio raíz y un fichero o directorio
Los nombres de ficheros y directorios son sensibles a mayúsculas y minúsculas
Los nombres de ficheros no deberían contener espacios en blanco ni caracteres “extraños”
ls: muestra el contenido de un directorio. Ejemplo:
ls /tmp/
cd: Cambiar de directorio. Ejemplo:
cd /tmp/
pwd: Muestra el directorio actual. Ejemplo:
pwd
mkdir: Crear directorios. Ejemplo:
mkdir /tmp/dir1
rm: Borra ficheros o directorios. Ejemplo:
rm /tmp/prueba.txt
cp: Copia ficheros o directorios. Ejemplo:
cp /usr/prueba.txt /tmp/
mv: Mover ficheros o directorios. Ejemplo:
mv /usr/prueba2.txxt /tmp/
less: Muestra el contenido de un fichero. Ejemplo:
less /tmp/prueba2.txt
Protocolo de transferencia de Hipertexto
Usado en cada transacción de la web
Es un protocolo sin estado
Para mantener estado se utilizan las cookies
La versión actual es HTTP 1.1 [7]
GET
Método para obtener un recurso de un servidor
Para obtener un recurso con el URL http://host.com/index.html
Se abre un socket con el host host.com, puerto 80 que es el puerto por defecto para HTTP.
Se envía un mensaje en el estilo siguiente:
GET /index.html HTTP/1.0
From: yo@miHost.example
User-Agent: HTTPTool/1.0
[Línea en blanco]
La respuesta del servidor está formada por encabezados seguidos del recurso solicitado, en el caso de una página web:
HTTP/1.0 200 OK
Date: Fri, 31 Dec 2003 23:59:59 GMT
Content-Type: text/html
Content-Length: 1221
<html>
<body>
<h1>Página principal de tuHost</h1>
(Contenido)
.....
</body>
</html>
Si se utiliza en un formulario, los valores de los campos van en la URL
POST
Es el método adecuado para los formularios que no solo sirven para obtener información
Los datos del formulario van en el cuerpo del mensaje
Códigos de respuesta
Son códigos de respuesta del servidor al cliente
Son códigos de tres cifras:
1xx Mensajes de información
2xx Operación con éxito
3xx Redirección hacia otra URL
4xx Error por parte del cliente
5xx Error por parte del servidor
Referencia
del lenguaje
Sintaxis
El
código php está delimitado por unas marcas de
principio y fin, que normalmente suelen ser las siguientes:
<?php
CODIGO_PHP
?>
Cada
instrucción debe ser terminada por el símbolo ;
Hay
varias formas de escribir comentarios en el código php:
#
Comentario
//
Comentario
/*
Comentario */
Tipos
de datos
PHP
no requiere la definición explícita de tipos en la
declaración de variables
El
tipo de una variable es determinado mediante el contexto.
El
tipo puede cambiar durante la ejecución del programa
PHP
Soporta 8 tipos de datos primitivos:
Cuatro
escalares:
boolean:
dos posibles valores:
FALSE,
0, 0.0, “”, ...
TRUE,
1, 2, 3, “ddd”, ...
integer:
número sin decimales ( en decimal, octal (0+n) o hexadecimal
(0xn))
float:
números de coma flotante ( 1.234)
string:
serie de caracteres entre comillas simples o comillas dobles.
Dos
tipos compuestos:
array:
conjunto de valores. Puede ser una matriz real, un vector, una
tabla, ... Ejemplos:
array
(5 => 1, 12 => 2);
array
(5,3,2,1,0);
foreach
($matriz as $i => $valor) {
print
$i;
}
object:
objeto de una clase (POO). Ejemplo:
new
foo;
Y
dos tipos especiales:
resource:
variable especial, que contiene una referencia a un recurso externo
como ficheros, conexión a bases de datos, ...
null:
representa una variable que no tiene valor.
Se
puede convertir una variable a otro tipo de esta forma:
(int)
$var Convierte la variable var
a tipo entero
(string)
$var Convierte la variable var
a tipo cadena
Variables
Se
representan con un símbolo dólar delante del nombre.
El
nombre es sensible a mayúsculas y minúsculas
El
nombre debe empezar con una letra o subrayado, seguido de cualquier
número de letras, subrayados o números
Dos
tipos de asignación:
Asignación
por valor: $a = $b;
Asignación
por referencia: $a = & $b;
Las
variables tienen ámbito local dentro del contexto en el que
están definidas. Si quiero utilizar una variable global
dentro de un ámbito local debe expresarse que esa variable es
global, en otro caso se supone que es local, de esta forma:
global
$a; // La variable está
definida en un contexto superior.
Variable
static: variable de
ámbito local en una función pero que no pierde su
valor entre las llamadas a la función.
Acceso
a variables externas. Procedentes de las operaciones GET y POST
Expresiones
La
forma más simple y ajustada de definir una expresión
es "cualquier cosa que tiene un valor".
Ejemplos:
5
5
+ 2
$a++
++$a
Operadores
Estos
son los operadores más habituales:
Aritméticos:
+ - * / %
Asignación:
= += -= .=
Comparación:
== != <> < > <= >=
Incremento/Decremento:
++ --
Lógicos:
and or xor ! && ||
De
cadenas: .
Estructuras
de control
Las
estructuras de control más usadas son las siguientes:
if:
if
(expr)
sentencia
if
– else:
if (expr) {
sentencia} else {sentencia}
if-elseif:
if
(expr) {
sentencia
}
elseif ($a == $b) {
sentencia
}
else {
sentencia
}
Sintaxis
alternativa:
if
(expr):
sentencia
sentencia
elseif
(expr):
sentencia
sentencia
else:
sentencia
endif
while:
while
(expr) sentencia
while
(expr) {
sentencia
}
do-while:
do
{
sentencia
}
while
(expr);
for:
for
(expr1; expr2; expr3) {
sentencia
}
expr1
se evalúa al principio del bucle
expr2
se evalúa al comienzo de cada iteración, si es TRUE el
bucle continúa y sino el bucle finaliza
expr3
se evalúa al final de cada iteración
foreach:
foreach
(expresion_array as $value) sentencia
foreach
(expresion_array as $key => $value) sentencia
return:
Cuando
se ejecuta desde una función termina inmediatamente la
ejecución
de la función y devuelve su argumento como valor de la
función
include
y require:
Se
utilizan para incluir y evaluar el archivo especificado.
Funciones
No
es necesario definirlas antes de referenciarlas
Pasar
argumentos por valor:
function
takes_array ( $input )
Pasar
argumentos por referencia:
function
takes_array ( & $input )
Argumentos
con valor por defecto:
function
takes_array ( $input = “foo” )
Devolver
valor de retorno:
return
($resultado)
Clases
y objetos
Una
clase es una colección de variables y funciones que trabajan
con éstas variables
Definición
de una clase:
class
Contador {
var
$numero;
function
incrementar (){
$this->numero
+= 1;
}
}
Definición
de un objeto:
$objeto
= new Contador;
Uso
de un objeto:
$objeto->incrementar();
Herencia:
puedo extender las funcionalidades de una clase:
class
Contador_dec extends Contador {
function
decrementar (){
$this->numero
-= 1;
}
}
Constructor:
son funciones en una clase que son llamadas automáticamente
cuando se crea una nueva instancia de una clase con new
class
Contador_init extends Contador {
function
Contador_init ( $num ){
$this->numero
= $num;
}
}
Excepciones
En
PHP4 no hay control de excepciones :-(
Pero
si está incluido en PHP5 :-)
Más
características
Autenticación
HTTP con PHP
Se
puede enviar un mensaje de “Autenticación requerida”
al navegador utilizando la función header con las siguientes
opciones:
header('WWW-Authenticate:
Basic realm="My Realm"');
header('HTTP/1.0
401 Unauthorized');
Ejemplo
real:
<?php
if (!isset($_SERVER['PHP_AUTH_USER'])) {
header('WWW-Authenticate:
Basic realm="My Realm"');
header('HTTP/1.0
401 Unauthorized');
echo
'Text to send if user hits Cancel button';
exit;
} else {
echo
"<p>Hello {$_SERVER['PHP_AUTH_USER']}.</p>";
echo
"<p>You entered {$_SERVER['PHP_AUTH_PW']} as
your
password.</p>";
}
?>
Cookies
Mecanismo
que sirve para almacenar datos en el navegador del usuario remoto,
para así poder identificar al usuario cuando vuelva
Las
cookies son parte de la cabecera HTTP,
por tanto la función setcookie() debe ser llamada antes
de que se produzca cualquier salida al navegador
Se
pueden poner cookies usando la función setcookie()
Ejemplo
para establecer una cookie:
<?php
$valor
= 'valor de la cookie';
setcookie("CookieDePrueba",
$valor);
/*
o fijar que expire en 1 hora */
setcookie("CookieDePrueba",
$valor, time()+3600);
?>
Obtener
el valor de una cookie del cliente:
<?php
//Imprime una
cookie individual
echo
$_COOKIE["CookieDePrueba"];
echo
$HTTP_COOKIE_VARS["CookieDePrueba"];
// Para ver
todas las cookies
print_r($_COOKIE);
?>
Funciones
de fecha y hora
Estas
son algunas de las funciones de fecha y hora más utilizadas:
date
([formato
[, marca_tiempo]]): Dar formato a una fecha/hora local. Se pueden
encontrar todas las opciones de formato en [8]. Ejemplos:
//
Imprime algo como: Monday 15th of August 2005 03:12:46 PM
echo
date('l dS \of F Y h:i:s A');
//
Imprime: July 1, 2000 is on a Saturday
echo
"July 1, 2000 is on a " . date("l", mktime(0, 0,
0, 7, 1, 2000));
getdate
( [marca_tiempo] ): devuelve un array con los valores de fecha y
hora actuales. Ejemplo:
$hoy
= getdate();
print_r($hoy);
mktime
([int hora [, int minuto [, int segundo [, int mes [, int dia [, int
anyo ]]]]]] ): obtiene la marca de tiempo de los datos
especificados. Ejemplo:
echo
date ("M-d-Y", mktime(0, 0, 0, 12, 32, 1997))
Editores
Hay
muchos editores de texto y Entornos Integrados de Desarrollo que se
pueden usar para crear, editar, y organizar archivos PHP. Contar con
un editor que resalte la sintaxis de PHP puede ser de mucha ayuda.
Hay una lista parcial de éstos en [3].
Pero
en realidad cualquier editor de texto es suficiente para poder
hacerlo.
Conexión
con MySQL
Conectarse a MySQL:
$link= mysql_connect(“localhost”, “usuario”, “password”);
Seleccionar la base de datos:
$bbdd=
mysql_select_db('nombre_bbdd',
$link) or
die('Error');
Realizar operación:
$query
= 'SELECT * FROM mi_tabla';
$resultado
= mysql_query($query, $bbdd) or die('Error: ' .
mysql_error());
Liberar el conjunto de resultados:
mysql_free_result($resultado);
Cerrar la conexión:
mysql_close($link);
Referencia
del lenguaje
Sintaxis
Las
instrucciones terminan en el carácter ;
Los
comentarios se indican con el carácter #
Las
cadenas de texto se especifican entre comillas dobles o
simples (aunque las variables
solo se interpretan entre las dobles)
Al
llamar a una función, los paréntesis entre los
argumentos son opcionales
Tipos
de datos
Escalares:
Cadenas
de texto:
"camel"
Enteros:
56
Float:
7.53
Arrays:
es un listado de valores
("camel",
"llama", "owl")
(42,
“valor”)
Hash
o listas asociativas: listado
de valores asociados con una clave:
("apple", "red", "banana", "yellow")(apple => "red", banana => "yellow",)
Variables
Las
variables tipo escalar se identifican por el prefijo $
Las
variables de tipo array se identifican por el prefijo @
Las
variables del tipo hash se identifican por el prefijo %
El
nombre es sensible a mayúsculas y minúsculas
El
nombre debe empezar con una letra, seguido de cualquier número
de letras, subrayados o números
No
es necesario definir el tipo al definir una variable
El
ámbito de una variable
se define así:
Variable
local: my
$var = “valor”;
Variable
global: $var
= “valor”;
El
0 es el primer índice de un array
$#var
muestra el índice del último elemento de un array
Operadores
Estos
son los operadores más habituales:
Aritméticos:
+ - * / %