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













1 Introducción

1.1 GNU/Linux













1.2 Apache






1.3 PHP


Características generales:












1.4 Perl

      Características generales:









1.5 MySQL






1.6 Herramientas adicionales

      1. CVS











      1. SSH







2 Linux


2.1 Sistema de ficheros







2.2 Comandos básicos

ls /tmp/




cd /tmp/



pwd



mkdir /tmp/dir1



rm /tmp/prueba.txt



cp /usr/prueba.txt /tmp/



mv /usr/prueba2.txxt /tmp/



less /tmp/prueba2.txt


3 Apache

3.1 HTTP








      1. GET

  1. Se abre un socket con el host host.com, puerto 80 que es el puerto por defecto para HTTP.


  1. Se envía un mensaje en el estilo siguiente:


  1. La respuesta del servidor está formada por encabezados seguidos del recurso solicitado, en el caso de una página web:



      1. POST









      1. Códigos de respuesta









4 PHP


4.1 Referencia del lenguaje


      1. Sintaxis



<?php

CODIGO_PHP

?>



# Comentario

// Comentario

/* Comentario */








      1. Tipos de datos










array (5 => 1, 12 => 2);

array (5,3,2,1,0);


foreach ($matriz as $i => $valor) {

print $i;

}


new foo;











(int) $var Convierte la variable var a tipo entero

(string) $var Convierte la variable var a tipo cadena



      1. Variables






global $a; // La variable está definida en un contexto superior.











      1. Expresiones

++$a

      1. Operadores


Estos son los operadores más habituales:








      1. Estructuras de control


Las estructuras de control más usadas son las siguientes:



if (expr)

				sentencia

if (expr) {

				sentencia
			} else {
				sentencia
			}




if (expr) {

sentencia

} elseif ($a == $b) {

sentencia
} else {

sentencia

}


if (expr):

sentencia

sentencia

elseif (expr):

sentencia

sentencia

else:

sentencia

endif


while (expr) sentencia


while (expr) {

sentencia

}


do {

sentencia

} while (expr);



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 (expresion_array as $value) sentencia

foreach (expresion_array as $key => $value) sentencia



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



Se utilizan para incluir y evaluar el archivo especificado.



      1. Funciones




function takes_array ( $input )



function takes_array ( & $input )



function takes_array ( $input = “foo” )



return ($resultado)



      1. Clases y objetos









class Contador {

var $numero;


function incrementar (){

$this->numero += 1;

}

}



$objeto = new Contador;



$objeto->incrementar();



class Contador_dec extends Contador {


function decrementar (){

$this->numero -= 1;

}

}



class Contador_init extends Contador {


function Contador_init ( $num ){

$this->numero = $num;

}

}


      1. Excepciones


En PHP4 no hay control de excepciones :-(


Pero si está incluido en PHP5 :-)





4.2 Más características


      1. Autenticación HTTP con PHP



header('WWW-Authenticate: Basic realm="My Realm"');

header('HTTP/1.0 401 Unauthorized');



<?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>";

}

?>


      1. Cookies













<?php

$valor = 'valor de la cookie';

setcookie("CookieDePrueba", $valor);

/* o fijar que expire en 1 hora */

setcookie("CookieDePrueba", $valor, time()+3600);

?>



<?php

//Imprime una cookie individual

echo $_COOKIE["CookieDePrueba"];

echo $HTTP_COOKIE_VARS["CookieDePrueba"];

// Para ver todas las cookies

print_r($_COOKIE);

?>


      1. Funciones de fecha y hora


Estas son algunas de las funciones de fecha y hora más utilizadas:



// 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));



$hoy = getdate();

print_r($hoy);



echo date ("M-d-Y", mktime(0, 0, 0, 12, 32, 1997))





4.3 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.


4.4 Conexión con MySQL



$link= mysql_connect(“localhost”, “usuario”, “password”);



$bbdd= mysql_select_db('nombre_bbdd', $link) or die('Error');



$query = 'SELECT * FROM mi_tabla';

$resultado = mysql_query($query, $bbdd) or die('Error: ' .

mysql_error());



mysql_free_result($resultado);



mysql_close($link);












5 Perl


5.1 Referencia del lenguaje


      1. Sintaxis






      1. Tipos de datos




"camel"



56



7.53



("camel", "llama", "owl")

(42, “valor”)









			("apple", "red", "banana", "yellow")

			( apple  => "red", banana => "yellow",)
      1. Variables













      1. Operadores


Estos son los operadores más habituales:








      1. Estructuras de control


Las estructuras de control más usadas son las siguientes:



if ( condition ) {

...

} elsif ( other condition ) {

...

} else {

...

}



También en la versión opuesta:


unless ( condition ) {

...

}



while ( condition ) {

...

}


until ( condition ) {

...

}

También como post-condición:


print "LA LA LA\n" while 1;


for ($i=0; $i <= $max; $i++) {

...

}





foreach my $key ( keys %hash) {

print "The value of $key is $hash{$key}\n";

}


      1. Funciones



sub nombre_de_función {

instrucciones;

[return Variable o expresión;]

}



my ($key, $value) = @_;


o bien:


$key = @_[0];

$value = @_[1];



my (*key, *value) = @_;


5.2 Más características


      1. Expresiones regulares


valor a comparar =~ patrón de búsqueda


Ejemplo:


if ($linea =~ /html/) {

...

}



variable =~ s/patrón de búsqueda/patrón de sustitución/opciones


Ejemplos:


$a =~ s/foo/bar/; # replaces foo with bar in $a


$a =~ s/foo/bar/g; # replaces ALL INSTANCES of foo

with bar in $a



variable =~ tr/patrón de búsqueda/cadena a traducir/opciones


Ejemplos:


$var =~ tr/A-Z/a-z/; # transforma mayúsculas a minúsculas


$cnt = $var =~ tr/*/*/; # cuenta los arteriscos de $var


      1. Funciones relacionadas con cadenas










      1. Funciones relacionadas con listas asociativas



%cuotas = ("root", 10000, "pat", 256);

@list = keys(%cuotas); # @list = ("root", "pat")



%cuotas = ("root", 10000, "pat", 256);

@list = values(%cuotas); # @list = (10000, 256)

%cuotas = ("root", 10000, "pat", 256);

while (($clave, $valor)=each(%cuotas)) {

    print "Login: $clave, Cuota: $valor\n";

}





      1. Entrada/salida



STDIN, STDOUT, STDERR


open (PUNTERO, "modo de acceso + nombre de archivo");


El modo de acceso puede ser:


< Solo lectura (por defecto)

> Escritura

>> Escritura al final del fichero

+> Lectura/escritura



print PUNTERO “Texto...”



open(PASSWD, "/etc/passwd");

while ($p = <PASSWD>) { # lee una línea del archivo

chop($p); #quitamos el salto de línea

@field = split(/:/, $p);

print " Usuario $field[0] y su directorio es $field[5]";

}

close(PASSWD);



$uno = <STDIN>;



      1. Funciones de fecha y hora



localtime()






($sec, $min, $hour, $mday, $mon, $year, $wday, $yday,

$resto)=localtime(time);

			printf "%4d-%02d-%02d %02d:%02d:%02d\n", $year+1900, 
				$mon+1, $mday, $hour, $min, $sec;


5.3 Conexión con MySQL



use DBI();



$bbdd = DBI->connect ( “DBI:mysql:database=test; host=localhost”,

“prueba”,

“prueba”,

{'RaiseError' => 1}

);



$query = “SELECT * FROM tabla”;

$order = $bbdd->prepare ($query);

$order->execute;



$order->finish;



$bbdd->disconnect();


6 MySQL


6.1 Permisos de acceso

Para cada usuario que se conecta se verifican varias cosas:




Esta información de usuarios, accesos y permisos se almacenan en las tablas de la base de datos mysql.


6.2 Acceso de usuarios

Para acceder a la base de datos se puede hacer de la siguiente forma:


shell> mysql -u monty -p db_name

shell> mysql -u monty -pguess db_name


6.3 Creación de usuarios


Primero, conectarse como administrador de la base de datos:


shell> mysql -u monty -pguess db_name


Después,


mysql> GRANT ALL PRIVILEGES ON *.* TO

'monty'@'localhost' IDENTIFIED BY 'some_pass' WITH GRANT

OPTION;


NOTA 1: El *.* significa BBDD.tabla


NOTA 2: Para especificar desde cualquier máquina: 'monty'@'%'





NOTA 3: “ALL PRIVILEGES” puede ser substituido por un

conjunto de los siguientes separados por comas: SELECT,

INSERT, UPDATE, DELETE, CREATE, DROP, ...


Otro modo de hacerlo sería:


shell> mysql -u root mysql

mysql> INSERT INTO user VALUES ('localhost', 'monty',

PASSWORD('some_pass'), 'Y', 'Y', 'Y', 'Y', 'Y', 'Y',

'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y', 'Y');

mysql> FLUSH PRIVILEGES;


6.4 Restaurar contraseña del administrador


  1. Crear un fichero de texto que contenga lo siguiente:

    SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpass');

Guarda el fichero y asígnale un nombre, por ejemplo ~/mysql-init



  1. Arranca el servidor MYSQL con la opción --init-file=~/mysql-init:

shell> mysqld_safe --init-file=~/mysql-init &



El contenido del fichero es ejecutado al arrancar el servidor cambiando la contraseña del usuario root.

6.5 Operaciones habituales



Mostrar bases de datos existentes:



mysql> show databases;



Conectarse a una base de datos:



mysql> use bd_prueba;



Mostrar las tablas que hay en la base de datos:



mysql> show tables;



Mostrar la estructura de una tabla:



mysql> desc nombre_tabla;

Crear una tabla:



mysql> CREATE TABLE agenda (id INT NOT NULL, nombre

CHAR(50), direccion CHAR(100) , KEY (id) )



Crear una tabla con claves ajenas:



mysql> CREATE TABLE email (id INT NOT NULL, email

CHAR(50), agenda_id INT, FOREIGN KEY (agenda_id)

REFERENCES agenda(id) )



6.6 Tipos de datos



      1. Números


Algunos de ellos son:



Un entero muy pequeño. Su rango es de -128 a 127. Para

enteros sin signo el rango es de 0 a 255.




Un entero normal. Su rango es de -2147483648 a 2147483647. Para enteros sin signo el rango es de 0 a 4294967295.




Un número pequeño de punto flotante (o bien, de precisión

sencilla). El rango de valores permitidos es de

-3.402823466E+38 a -1.175494351E-38, 0, y de

1.175494351E-38 a 3.402823466E+38.


      1. Fecha y hora



Valores de fecha. “YYYY-MM-DD”



Valores de hora. “HH:MM:SS”


Valores de fecha y hora. “YYYY-MM-DD HH:MM:SS


      1. Cadenas de caracteres



Cadena de caracteres de tamaño n


Una columna TEXT con una longitud máxima de 255

caracteres.
















7 Herramientas adicionales

7.1 CVS


export CVSROOT=":ext:USUARIO@www.url.com:/home/cvs"

export CVS_RSH=/usr/bin/ssh



export CVSROOT=":pserver:USUARIO@www.url.com:/home/cvs"



cvs co [nombre-del-módulo]



cd [directorio-del-módulo]

cvs update



cvs commit


[...]

>>>>>>>>>>>>>>

taca

===========

tacataca

<<<<<<<<<<<<<<

[...]



cvs add [fichero]






cvs remove [fichero]





7.2 SSH



ssh usuario@maquina



scp path_fichero usuario@maquina:path_destino



scp usuario@maquina:path_destino path_fichero
























8 Referencias


      [1] http://www.mysql.com


[2] http://www.mysql-hispano.org/


[3] http://www.thelinuxconsultancy.co.uk/phpeditors.php


[4] http://perldoc.perl.org


[5] http://www.php.net/docs.php


[6] http://news.netcraft.com/archives/web_server_survey.html


[7] http://www.ietf.org/rfc/rfc2616.txt


[8] http://www.php.net/manual/es/function.date.php





Diego Chaparro <dchaparro@acm.org> 33/33