You are on page 1of 31

Curso Avanzado de PHP

Unidad 3: Configuración y Conectividad de PHP

Unidad 3. Configuración y Conectividad de PHP

Introducción
En esta Unidad vamos a aprender a conocer y saber configurar las
diferentes características y opciones de PHP. Es importante saber
reconocer y asignar valores a las directivas que integran el fichero de
configuración php.ini.

Además, estudiaremos las funciones y procedimientos de PHP que permiten


hacer ping, conocer la ruta de acceso a un servidor, saber la velocidad de
una conexión y optimizar el ancho de banda.

Después, conoceremos las funciones que permiten realizar a través de la red


las operaciones siguientes: comprobar registros DNS, obtener el nombre de
dominio o la dirección IP de los servidores, obtener protocolos y
servicios de Internet y establecer conexiones entre máquinas mediante
Sockets.

Finalmente, veremos cómo transferir archivos entre servidores a través de


la red usando el protocolo FTP mediante las funciones PHP disponibles.

3.1. Entorno y configuración en PHP


Es importante conocer y saber configurar las diferentes características y
opciones de PHP, de cualquier versión, sobre todo en este curso que es para
personas que quieren aprender aspectos avanzados de este lenguaje. En este
primer apartado de la Unidad y en otros vamos a conocer de una forma
práctica el entorno y configuración de PHP a fin de poder modificarlo según nos
convenga.

Cuando se instala PHP es preciso determinar su estado: opciones de


compilación, extensiones, versión, informaciones sobre varios aspectos,
entorno del servidor cuando está compilado como un módulo de Apache,
entorno PHP, versión del sistema operativo, rutas, opciones maestras y locales
de configuración, cabeceras HTTP, librería GNU de codificación de caracteres
de hasta 150 códigos diferentes, etcétera.

El archivo de configuración se denomina php.ini y se lee cuando el servidor


Web carga PHP.

Para realizar el presente curso, a veces, es necesario modificar este fichero de


configuración cambiando alguna de las directivas del fichero php.ini. No

1
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

obstante, hemos considerado oportuno que el alumno las conozca y sepa,


básicamente, para qué sirve cada una. En el Ejemplo 1 hemos codificado un
sencillo script que contiene algunas funciones que nos permiten conocer
informaciones concretas sobre el entorno y la configuración de PHP. Son las
siguientes:

En la instrucción…

if (preg_match("/opera/i",$_SERVER['HTTP_USER_AGENT']))
{$val=explode(" ",stristr($_SERVER['HTTP_USER_AGENT'],"opera"));

…hemos usado la matriz asociativa $_SERVER con el índice HTTP_USER_AGENT


para localizar el nombre del navegador con el que se está mostrando la página,
su versión y la cadena de identificación.

Atención: en la Unidad 5 se explica en detalle cómo utilizar expresiones


regulares con la función preg_match de PHP. No dudes en leer esta parte de la
teoría si lo consideras necesario.

En la estructura condicional…

if (isset($_SERVER['HTTP_X_FORWARDED_FOR']))
$ip=$_SERVER['HTTP_X_FORWARDED_FOR'];
else if (isset($_SERVER['HTTP_CLIENT_IP']))
$ip=$_SERVER['HTTP_CLIENT_IP'];
else if (isset($_SERVER['REMOTE_ADDR']))
$ip=$_SERVER['REMOTE_ADDR'];

…obtenemos la dirección IP (Internet Protocol) del usuario.

Finalmente, con la instrucción phpinfo(); conseguimos mostrar de una vez


toda la información disponible sobre el entorno de PHP. Veamos, a
continuación, algunos apartados de esta información con las directivas
principales o de uso más frecuente en el entorno Windows.

Directivas Generales de PHP

asp_tags permite el uso de las etiquetas de estilo ASP <%...%>, además de las
habituales etiquetas de estilo PHP <?php...?>. Puede estar activado (on) o
desactivado (off). Por defecto y en este curso está desactivado.

auto_prepend_file permite incluir un fichero, cuyo nombre debe indicarse


como una cadena, que ha de interpretarse de forma automática antes del script
principal. Es similar a la función include() dentro del script. Para que esta
directiva esté desactivada basta no poner el nombre del fichero detrás del signo
=. Si queremos que el fichero se interprete después del script principal, hay que
poner el nombre en la directiva auto_append_file.

2
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

display_errors especifica si los errores deben mostrarse en la pantalla como


parte de la salida HTML o no. Puede estar activado (on) o desactivado (off). En
un servidor real es recomendable, desactivarlo, pero en este curso esta
directiva está activada por defecto en XAMPP. El alumno o alumna puede ver
los mensajes de error en la pantalla y poder así depurar mejor sus programas.

doc_root indica en forma de cadena el nombre del directorio raíz de PHP en el


servidor.

engine sólo es útil en la versión de PHP como módulo Apache. Se utiliza para
habilitar la ejecución de PHP directorio por directorio. Puede estar activado (on)
o desactivado (off).

error_log indica en forma de cadena el nombre del fichero donde deben


registrarse los errores de un script. Si se asigna la cadena "syslog", los errores
se envían al registro de errores del sistema operativo. En el curso, en Windows,
el fichero es C:\xampp\php\logs\php_error_log. Cuando un script no funcione
bien, puede abrirse este fichero y mirar el texto del error que se ha producido,
como medio de depuración de los programas.

error_reporting fija el nivel de informe de errores. El valor que debe escribirse


es un número entero que representa la suma de los valores de los niveles de
informe de error que se quiere indicar, según la tabla siguiente:

Niveles de Informe de errores


Constante Valor bit Descripción
Errores Fatales en tiempo de ejecución que indican
errores que no se pueden recuperar, tales como un
E_ALL 1
problema de asignación de memoria. La ejecución
del script se interrumpe.
Advertencias en tiempo de ejecución (errores no
E_WARNING 2
fatales). La ejecución del script no se interrumpe.
E_PARSE 4 Errores del analizador sintáctico (parser)
Avisos de estilo no críticos en tiempo de ejecución.
E_NOTICE 8 Indican que el script encontró algo que podría
señalar un error.

El valor por defecto para esta directiva es E_ALL & ~E_DEPRECATED &
~E_STRICT, donde se muestran los errores normales, avisos normales y errores
del analizador sintáctico. En este curso es recomendable modificarlo a E_ALL,
para que se muestren todos los errores. Para entender mejor esta directiva,
conviene editar y mirar el fichero php.ini, dentro de la sección Error handling
and logging. Ahí se explican con ejemplos las opciones de errores que se
pueden configurar y cómo se ha de llevar a cabo esta operación.

También puedes acceder al Manual de PHP en este enlace y estudiar todas las
posibilidades que ofrece PHP en este aspecto.

3
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

En el Ejemplo 1 hemos cambiado el nivel de informes de errores con las


siguientes instrucciones:

echo "<CENTER>La variable \$prueba $prueba no existe y aparecerá un


error del tipo 'Notice: Undefined variable'.";

error_reporting(E_ERROR);

echo "<P><CENTER>Ahora, aunque la variable \$prueba $prueba no existe,


no aparece ningún error.";

La primera sentencia muestra el error: “Notice: Undefined variable: prueba in


C:\xampp\htdocs\curso\unidad3.eje1.entorno\index.php on line 82”. Sin
embargo, la tercera sentencia, similar a la primera, no muestra ningún error al
haber modificado el nivel de informes de errores.

open_basedir determina el camino donde sólo se permiten operaciones (abrir,


escribir, borrar, etcétera) sobre los ficheros desde PHP. El valor . (punto) indica
que el directorio padre de esta ruta es aquél en el que reside el script. Usando
PHP como módulo de Apache, los caminos de open_basedir de los directorios
padre se heredan automáticamente. Por eso, en la configuración esta directiva
no tiene ningún valor asignado. El valor por defecto es permitir abrir todos los
archivos.

variables_order establece el orden de prioridad de las variables


GET/POST/COOKIE/ENVIRONMENT/BUILT-IN. El valor por defecto de esta
directiva es "GPCS", que es el utilizado en el curso. Si ponemos, por ejemplo,
"GP", PHP ignora las cookies y sobrescribe las variables recibidas por GET con
las que tengan el mismo nombre y procedan de POST.

ignore_user_abort determina si la interpretación de los scripts terminará


cuando se intente enviar una salida después de que el usuario solicitante haya
interrumpido la conexión o no. Por defecto, esta directiva está deshabilitada, es
decir, los scripts terminarán tan pronto como intenten enviar algo después de
que un cliente haya roto la conexión pulsando el botón Detener en su
navegador de Internet. La función ignore_user_abort() permite modificar este
valor desde dentro de los propios scripts, como se explicó en la gestión de
conexiones del Curso de iniciación.

include_path especifica una lista de directorios en los que las funciones


require(), include() y fopen_with_path() buscan los archivos. En Windows
cada directorio se separa de otro por punto y coma.

log_errors especifica si los mensajes de error de los scripts deben ser


registrados (on) o no (off) en un fichero log. En XAMPP esta directiva está
activada por defecto. Complementaria de la anterior es la directiva
log_errors_max_len, que indica el número máximo de caracteres de la cadena
que contiene el texto del error. Por defecto, su valor es 1.024.

magic_quotes_gpc establece la forma de funcionamiento de los marcadores


(magic_quotes, comillas y barra invertida) cuando se realizan operaciones con

4
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

Get, Post o Cookie. Si magic_quotes está en on todas las ' (comilla sencilla), "
(comilla doble), \ (barra invertida) y los NUL se marcan con una barra invertida
automáticamente. Además, si la directiva complementaria magic_quotes_sybase
contiene también on, la comilla sencilla es marcada con otra comilla sencilla en
lugar de la barra invertida. Por defecto, XAMPP estable ambas directivas en off.

magic_quotes_runtime si se encuentra en on (en XAMPP está en off), al recibir


datos de una fuente externa (base de datos, fichero de texto, etcétera), las
comillas se marcan con una barra invertida. La directiva complementaria
magic_quotes_sybase funciona de la misma forma que en la directiva
magic_quotes_gpc.

max_execution_time se usa para impedir que un script con errores de diseño


pueda bloquear el servidor que alberga el intérprete PHP. Esta directiva limita
el número de segundos que puede usar el intérprete para ejecutar un script. El
tiempo establecido por defecto es de 30 segundos. Complementaria de ésta es
la directiva max_input_time, que limita el tiempo durante el cual el fichero script
puede estar enviando datos al servidor. Por defecto este tiempo es de 60
segundos.

memory_limit se usa también para impedir que un script con errores de diseño
o que exige recursos muy amplios pueda agotar la memoria disponible del
servidor. Esta directiva limita el número de bytes que puede reclamar un script.
Por defecto XAMOO, establece el límite en 128 Mb. Para entender mejor las
tres directivas anteriores, conviene editar y mirar el fichero php.ini, dentro de
la sección Resource Limits.

short_open_tag permite usar el formato corto (<?... ?>) de la etiqueta de


apertura de PHP si está en on. Si no se permite, debe estar en off. Si se utiliza
PHP en combinación con XML, hay que desactivar esta opción. Cuando está
desactivada, es necesario utilizar el formato largo de la etiqueta de apertura
(<?php... ?>). Es recomendable desactivar siempre esta directiva.

track_errors permite ver el último mensaje de error, que está guardado en la


variable global $php_errormsg, si está habilitada (on) o no, si está desactivada
(off).

upload_tmp_dir contiene, si se quiere usar, una cadena con el nombre del


directorio temporal utilizado para almacenar archivos cuando se envían al
servidor. En el caso de XAMPP en Windows, este directorio es "C:\xampp\tmp".

upload_max_filesize permite asignar el tamaño máximo que puede tener el


fichero que queremos subir al servidor. Por defecto, XAMPP asigna el valor a
2MB.

user_dir contiene, si se quiere usar, una cadena con el nombre del directorio
inicial de usuario para los archivos PHP.

5
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

Directivas de Configuración de Correo

SMTP contiene una cadena donde aparece el nombre DNS (Domain Name
System) o la dirección IP del servidor de SMTP (Simple Mail Transfer Protocol)
que PHP debe usar para enviar correo con la función mail(). Por defecto, en
XAMPP el nombre es localhost, aunque está deshabilitado por defecto.

sendmail_from contiene una cadena donde aparece la dirección del remitente


para los correos enviados desde PHP.

sendmail_path contiene el camino del servidor SMTP.

Directivas de Carga de Extensiones

enable_dl en la versión de PHP como módulo del Apache habilita (on) o


deshabilita (off) la carga dinámica de extensiones de PHP mediante la función
dl().

extension_dir contiene una cadena con el nombre del directorio donde PHP
debe buscar las extensiones para que puedan cargarse.

extension contiene una cadena con el nombre de las extensiones dinámicas


que debe cargar PHP cuando arranca.

Aconsejamos a los alumnos y alumnas que miren, en la información que nos


ofrece la función phpinfo() del Ejemplo 1, la relativa al entorno (Environment) y
a las variables (PHP Variables). Ahí se reflejan las principales características
de configuración y contenido de las supervariables globales (matrices
asociativas) de la versión de PHP que esté disponible en ese momento.

La función ini_set permite cambiar muchas de las directivas de configuración


de PHP únicamente para la ejecución de un determinado script. Como primer
parámetro lleva el nombre de la variable de configuración que se quiere
cambiar. Como segundo hay que especificar el nuevo valor de la variable. Si el
cambio puede realizarse, esta función devuelve el valor antiguo de la variable.
Si no se puede, devuelve el valor False. Para conocer los nombres de las
variables de entorno y configuración, así como los valores que tienen
asignados por defecto, puede consultarse esta función en el Manual de PHP 5.

Otras funciones de PHP también permiten llevar a cabo operaciones con la


configuración:

• ini_alter funciona como ini_set pero modificando el fichero php.ini,


por lo que todos los scripts que se ejecutasen a continuación respetarían
esta directiva modificada.
• ini_get devuelve el valor configurado para una directiva.
• ini_get_all devuelve el valor configurado para todas las directivas.

6
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

• ini_restore restaura el valor inicial configurado para una directiva.

Recomendamos a los alumnos y alumnas que modifiquen las directivas


configuradas con cuidado, pues el servidor Apache/PHP podría dejar de
funcionar o hacerlo incorrectamente. Antes de modificar este fichero de
configuración, aconsejamos hacer una copia de seguridad para poder
recuperar el fichero de configuración original posteriormente.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 1 (Variables de


entorno) de la Unidad 3. Estudia el código fuente y ejecútalo para mostrar
en el navegador el resultado de su interpretación.

Si ejecutas el Ejemplo 1 de la Unidad 3 verás que aparece la siguiente página:

Nota: tu versión de PHP puede ser superior a la que se muestra en la imagen


anterior.

7
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

3.2. Conectividad básica en PHP


En este apartado vamos a completar los contenidos del anterior, estudiando de
una forma teórico-práctica algunas funciones especiales de PHP que permiten
obtener también información sobre servidores remotos o sobre el proceso de
conexión y comunicación entre ellos.

Hacer ping

Esta operación, denominada hacer ping o pinging, consiste en tratar de


establecer contacto con un servidor local o remoto. Mediante la misma sólo
pretendemos saber si la máquina destino está accesible. No tiene sentido
hacer ping a un servidor local, por lo cual, lo habitual es tratar de contactar con
una máquina o equipo remoto.

Esta operación se lleva a cabo transmitiendo un paquete de datos desde la


máquina solicitante a una dirección IP, citada de forma numérica o por el
nombre de su dominio. En ella se solicita una respuesta del Protocolo de
Control de Mensajes en Internet (ICMP), diseñado para encontrar y depurar
errores en la red.

En el Ejemplo 2 se accede al servidor cuyo IP o nombre de máquina se indique


mediante un formulario con la instrucción siguiente:

shell_exec("ping $tipo $num_pings ".$nombre_ip);

Como puede verse, usamos el programa ping.exe de Windows y lo hacemos a


través de una ventana de comandos. Para ello, usamos la función shell_exec
de PHP. Esta función ejecuta un programa externo y devuelve su salida, es
decir, el resultado de su ejecución. Como primer parámetro lleva una cadena
donde se indica la orden o comando (pueden ser varias palabras) que debe
ejecutarse. Esta función devuelve NULL en caso de fallo de ejecución del
comando.

Usando el mismo Ejemplo 2, supongamos que conocemos el nombre de la


máquina rediris.es y que queremos hacer tres intentos de acceso. Con estos
datos la instrucción quedaría configurada así:

shell_exec("ping -n 3 rediris.es");

Si preferimos acceder a la ventana de comandos de Windows, detrás del


símbolo del sistema escribiremos:

ping -n 3 rediris.es

8
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

Como consecuencia, cuando se ejecute la orden, el programa enviará tres


paquetes de datos al equipo remoto y éste devolverá las respuestas una por
una. Éste sería el resultado:

C:\>ping -n 3 rediris.es

Haciendo ping a rediris.es [130.206.13.20] con 32 bytes de datos:


Respuesta desde 130.206.13.20: bytes=32 tiempo=26ms TTL=53
Respuesta desde 130.206.13.20: bytes=32 tiempo=26ms TTL=53
Respuesta desde 130.206.13.20: bytes=32 tiempo=25ms TTL=53

Estadísticas de ping para 130.206.13.20:


Paquetes: enviados = 3, recibidos = 3, perdidos = 0
(0% perdidos),
Tiempos aproximados de ida y vuelta en milisegundos:
Mínimo = 25ms, Máximo = 26ms, Media = 25ms

Este resultado indica que el equipo remoto ha recibido los tres paquetes. De no
haber sido así, se habría indicado que el equipo no estaba accesible (Host
desconocido) o que la solicitud había superado el tiempo de espera (Tiempo de
espera agotado). También se muestra el tamaño del paquete enviado. Para
valorar la velocidad de la conexión nos hemos de fijar en el tiempo, ya que éste
nos muestra lo que tarda el paquete en completar su trayecto en milisegundos.

El término TTL significa tiempo de vida del paquete (Data). Se refiere al número
de saltos entre equipos remotos que el paquete dará antes de que el mensaje
de Host desconocido aparezca. Podemos cambiar la configuración por defecto,
que es de 246 saltos, a través de una línea de comandos. La característica de
tiempo de vida de un paquete se implementó en el TCP/IP para asegurarse de
que los paquetes de datos que se perdían o no alcanzaban su destino no se
quedaban rebotando indefinidamente por la red.

Para obtener una lista de las opciones disponibles, hay que escribir: ping -h en
la línea de comandos de Windows.

Conocer la ruta de acceso a un servidor (tracert)

La orden tracert del sistema operativo Windows (en Linux se llama


traceroute) es una utilidad que detecta la ruta que sigue un paquete de datos
enviado a través de ICMP (Internet Control Message Protocol) hasta una
dirección IP dada y el tiempo de acceso (TTL, Time-To-Live) en cada salto que
se da a lo largo de esa ruta. Para determinar el número de saltos a lo largo de
la ruta se envía un paquete de datos con un TTL inicial de valor 1. En cada
salto de una máquina a otra (routers intermedios) se aumenta el número de
TTL en 1, hasta que responde el servidor que tiene el IP solicitado o hasta que
se consume el tiempo previsto.

Como resultado, la orden tracert muestra una lista ordenada de los routers
por los que se ha ido pasando el paquete hasta encontrar su destino o exceder
el número máximo de saltos previsto.

9
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

En el Ejemplo 2 se vuelve a utilizar la función shell_exec de PHP para ejecutar


tracert de la forma siguiente:

shell_exec("$tipo ".$nombre_ip);

Como consecuencia, cuando se ejecute la orden, el programa enviará tres


paquetes de datos al equipo remoto y mostrará un resultado similar al siguiente
dependiendo de cada situación:

C:\>tracert rediris.es

Traza a la dirección rediris.es [130.206.13.20] sobre un máximo de 30


saltos:

1 3 ms 1 ms <1 ms CONECTA [192.168.1.1]


2 27 ms 22 ms 21 ms 90.161.27.190
3 * 25 ms 24 ms 10.255.241.105
4 27 ms 23 ms 24 ms 10.255.144.102
5 26 ms 24 ms 24 ms 10.34.196.22
6 26 ms 24 ms 27 ms 10.34.34.41
7 26 ms 24 ms 24 ms rediris-1.espanix.net [193.149.1.26]
8 27 ms 25 ms 25 ms rediris.es [130.206.13.20]

Traza completa.

De izquierda a derecha aparece el número de salto (hasta 8 en este caso), el


número de milisegundos consumidos en cada paquete de datos y el nombre
del router con su dirección IP. Finalmente, aparece un informe con el resultado:
Traza completa.

Entre la orden y el nombre de la máquina o dirección IP pueden ponerse las


opciones -d, para que en la lista no se muestre el nombre de la máquina, sino
sólo su dirección IP; -h, para fijar el número máximo de saltos (por defecto es
30); -w, para fijar el tiempo máximo de espera, en milisegundos, entre intentos.

Para obtener una lista de las opciones disponibles hay que escribir: tracert sin
argumentos en la línea de comandos de Windows. En Linux podemos escribir
man traceroute.

Conocer la dirección IP de un servidor (nslookup)

Domain Name System o DNS (en español: sistema de nombres de dominio)


es un sistema jerárquico para computadoras, servicios o cualquier recurso
conectado a Internet o a una red privada. Este sistema asocia cierta
información a los nombres de dominios. Su función más importante, es traducir
(resolver) nombres inteligibles para las personas a direcciones IPs, con el
propósito de poder localizar estos equipos mundialmente.

La orden nslookup del sistema operativo es una utilidad que usa el protocolo
DNS para resolver nombres a sus IPs.

10
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

En el Ejemplo 2 se vuelve a utilizar la función shell_exec de PHP para ejecutar


nslookup de la forma siguiente:

shell_exec("nslookup ".$nombre_ip);

Como consecuencia, cuando se ejecute la orden, el programa solicitará la IP


del nombre de dominio y mostrará un resultado similar al siguiente
dependiendo de cada situación:

C:\>nslookup rediris.es
Servidor: CONECTA
Address: 192.168.1.1

Respuesta no autoritativa:
Nombre: rediris.es
Addresses: 2001:720:418:cafd::20
130.206.13.20

IMPORTANTE: no es recomendable usar la función shell_exe() sin validar el


parámetro que se ejecuta en el servidor. En este código, un usuario
malintencionado podría modificar el contenido de las variables de entrada y
ejecutar comandos en el servidor. En la Unidad 5 estudiaremos cómo validar
los campos que puede introducir un usuario.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 2 (Conectividad


en PHP) de la Unidad 3. Estudia el código fuente y ejecútalo para mostrar
en el navegador el resultado de su interpretación.

Si ejecutas el Ejemplo 2 de la Unidad 3 verás que aparece la siguiente página:

Conocer la velocidad de nuestra conexión

Algo importante para trabajar en Internet es la velocidad de transmisión con la


cual accedemos a las páginas web o enviamos y recibimos ficheros y
mensajes. Cuando nos venden una conexión a Internet, el precio de la misma
suele estar siempre relacionado con la velocidad que nos ofrezcan.

11
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

La velocidad está directamente relacionada con el ancho de banda


(bandwidth), que es la capacidad de transporte de datos a través de la red o la
cantidad de información que puede pasar por una línea de comunicación al
mismo tiempo y se mide en bits por segundo (bps). Cuando se transmiten
grandes cantidades de información, la medida suele expresarse en megabytes
por segundo (MB/s) o en gigabytes por segundo (GB/s).

Nos ha parecido conveniente aprender en este curso a medir el ancho de


banda de una conexión usando código PHP. En el Ejemplo 3 medimos el
ancho de banda de una conexión a Internet. Hemos aplicado un procedimiento,
curioso, que nos proporciona una aproximación bastante buena a la medición
real de ancho de banda.

En Internet puedes encontrar múltiples páginas que ofrecen el servicio de


medición de ancho de banda mediante programas Flash u otros lenguajes de
programación.

Conviene probar este script contra un servidor remoto, pues si se hace contra
el propio servidor local no funciona correctamente al no producirse una
transmisión real de información a través de la red. Puedes probar el script en
un servidor de Mentor en el siguiente enlace.

Lo hacemos de la forma siguiente:

• Tomamos la hora del sistema en que se inicia la operación.

fecha = new Date();


tiempoinicial = fecha.getTime();

• Abrimos y leemos el fichero payload.bin, que es muy grande.

$fichero = fopen ("payload.bin", "r");


if (isset($_GET['kbps'])) {
$test_kbytes = ($_GET['kbps'] / 8);
if ($test_kbytes > 5000) $test_kbytes = 5000;
}
else $test_kbytes = 512;
$contenido = fread ($fichero, $test_kbytes * 1024);

• Tomamos la hora del sistema en que se acaba la operación.

fecha = new Date();


tiempofinal = fecha.getTime();

• Hallamos la velocidad de la línea, hacemos los cálculos en diferentes


medidas y mostramos el resultado mediante el siguiente código
JavaScript y PHP mezclado:

if (tiempofinal == tiempoinicial){downloadtime = 0;}


else {downloadtime = (tiempofinal - tiempoinicial)/1000;}

12
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

kbytes_of_data = <?php echo $test_kbytes; ?>;


linespeed = kbytes_of_data/downloadtime;

// Para calcular el ancho de banda en bits hay


// que multiplicar cada byte por 8 bits.
kbps = (Math.round(linespeed*8));
<?php
$url = "resultados.php?kbps=' + kbps + '";
echo "nextpage='$url';";
?>
document.location.href=nextpage;

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 3 (Medidor de


Ancho de Banda) de la Unidad 3. Estudia el código fuente y ejecútalo para
mostrar en el navegador el resultado de su interpretación.

Si ejecutas, en el servidor de Mentor, el Ejemplo 3 de la Unidad 3 verás que


aparece la siguiente página:

Optimizar el ancho de banda

Cuando un servidor remoto necesita enviar gran cantidad de información a un


navegador que hace una petición, el tiempo de transmisión depende, entre
otras cosas, del volumen de información que debe transferirse. Por lo tanto, si
logramos transmitir dicha información comprimida, optimizaremos nuestro
ancho de banda.

En el Ejemplo 5 medimos el tiempo que tarda en transmitirse una información


desde el servidor remoto donde se albergan los ficheros scripts hasta el
navegador del ordenador que hace la petición. Para poder apreciar la diferencia

13
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

de tiempo entre la información sin comprimir y la misma información


comprimida, en el script index.php se han puesto dos botones:

<TR><TD height=50 valign=middle>


<a href="index_normal.php#ancla" target="_blank">
Pulsa aqu&iacute; para lanzar la prueba de NORMAL
</a>.
</TD></TR>
<TR><TD>
<ahref="index_comprimido.php#ancla" target="_blank">
Pulsa aqu&iacute; para lanzar la prueba de COMPRIMIDA
</a>.
</TD></TR>

Si se elige la prueba NORMAL, en el fichero index_normal.php se lanza un


proceso que consiste en mostrar en el navegador solicitante una frase 6.000
veces y medir el tiempo que ha tardado en llevarse a cabo la operación.

Si se elige la prueba COMPRIMIDA, en el fichero index_comprimido.php se


lanza el mismo proceso anterior, pero comprimiendo antes el texto integrado
por las 6.000 frases, y se mide, igualmente, el tiempo que ha tardado en
llevarse a cabo la operación. El navegador recibe el texto comprimido, por lo
que la información transmitida es mucho menos voluminosa. En consecuencia,
en las mismas condiciones de transmisión, el tiempo de la transferencia será
menor.

Este programa hay que probarlo contra un servidor remoto para no falsear la
medida correcta de la transmisión de los datos. Puedes probar el script en un
servidor de Mentor en el siguiente enlace.

Aconsejamos a los alumnos y alumnas que estudien el código de los tres


scripts anteriores y lean los comentarios, pues en ellos se aplican diferentes
funciones ya estudiadas anteriormente, como las de comprensión de ficheros o
las de control de salida usando buffers.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 4 (Compresión


de páginas) de la Unidad 3. Estudia el código fuente y ejecútalo para
mostrar en el navegador el resultado de su interpretación.

Si ejecutas, en el servidor de Mentor, el Ejemplo 4 de la Unidad 3 verás que


aparece la siguiente página:

14
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

Si haces clic en el primer enlace, podrás ver que tarda cierto tiempo en
cargarse la página:

Sin embargo, si haces clic en el segundo enlace, el tiempo de descarga es


menor:

15
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

3.3. Funciones de Red en PHP


En este apartado vamos a abordar las funciones de red. En el mismo se
explican de una forma teórica las principales funciones que usa PHP para
acceder a otros servidores y se aplican en ejemplos y ejercicios de diferentes
tipos.

PHP puede realizar a través de la red las operaciones siguientes:

1. Comprobar registros DNS que corresponden a nombres de servidores o a


direcciones IP. Para ello, se sirve de las funciones siguientes:

• Función checkdnsrr, que tiene esta sintaxis:

checkdnsrr(cadena con el nombre del servidor [,cadena con el


tipo de servidor])

El parámetro nombre del servidor puede ser la dirección IP en formato


xxxx.xxxx.xxxx.xxxx o bien el nombre de la máquina. El tipo de
servidor, parámetro opcional, puede ser A (IPv4 Address Resource),
MX (Mail Exchanger Resource), NS (Authoritative Name Server
Resource), SOA (Start of Authority Resource), PTR (Pointer Resource),
CNAME (Alias "Canonical Name" Resource), o ANY (cualquiera). Por
defecto es MX. Esta función devuelve True si encuentra algún registro o
False si no encuentra ninguno o se produce algún error.

• Función getmxrr, similar a la anterior pero más completa, obtiene


registros de un servidor de tipo MX (Mail Exchanger Resource)
correspondientes a una máquina conectada a Internet. Tiene la sintaxis
siguiente:

getmxrr(cadena con el nombre del servidor,matriz con la lista de


registros encontrados [,matriz con información de los mismos])

Esta función devuelve True si encuentra algún registro o False si no


encuentra ninguno o se produce algún error. El tercer parámetro es
opcional.

2. Obtener el nombre de dominio o la dirección IP de los servidores. Para


ello, se sirve de las funciones siguientes:

• Función gethostbyname obtiene la dirección IP correspondiente al


nombre de una máquina conectada a Internet. Tiene la sintaxis
siguiente:

gethostbyname(cadena con el nombre del servidor)

Complementaria de la función anterior es gethostbyname, que obtiene


una lista de direcciones IP correspondientes a los nombres de máquinas
conectadas a Internet.

16
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

• Función gethostbyaddr obtiene el nombre de una máquina conectada a


Internet correspondiente la dirección IP especificada. Tiene la sintaxis
siguiente:

gethostbyaddr(cadena con la dirección IP)

Esta función devuelve el nombre del ordenador conectado a Internet


especificado por el parámetro cadena con la dirección IP. Si ocurre un
error o no lo encuentra, devuelve la misma cadena.

3. Obtener protocolos y servicios de Internet. Para ello, utiliza las funciones


siguientes:

• La función getprotobyname obtiene el número asociado al nombre de un


protocolo. Tiene la sintaxis siguiente:

getprotobyname(cadena con el nombre de protocolo)

Esta función devuelve el número asociado al nombre del protocolo.

• La función getprotobynumber obtiene el nombre de un protocolo


asociado al número de protocolo especificado. Tiene la sintaxis
siguiente:

getprotobynumber(cadena con el número de protocolo)

Esta función devuelve el nombre asociado al número del protocolo


indicado.

• La función getservbyname obtiene el número del puerto asociado al


servicio Internet especificado. Tiene la sintaxis siguiente:

getservbyname(cadena con el nombre de servicio, cadena con el


número de protocolo)

Esta función devuelve el puerto que corresponde al nombre de servicio


especificado por el número de protocolo. El parámetro número de
protocolo puede ser de tipo tcp o udp.

• La función getservbyport obtiene el servicio de Internet que


corresponde al número de puerto especificado. Tiene la sintaxis
siguiente:

getservbyport(cadena con el número de puerto, cadena con el


número de protocolo)

Esta función devuelve el nombre del servicio que corresponde al número


de puerto especificado por el número de protocolo. El parámetro
número de protocolo puede ser de tipo tcp o udp.

17
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

4. Establecer conexiones entre máquinas mediante Sockets.

Un socket (enchufe) es un punto de contacto para que puedan comunicarse


dos máquinas entre sí. PHP dispone de la función fsockopen para llevar a cabo
esta conexión.

La función fsockopen abre una conexión de dominio Internet o Unix a través de


sockets. Tiene la sintaxis siguiente:

fsockopen(cadena con el nombre del servidor,


número de puerto[,número de error
[,cadena con el mensaje de error
[,tiempo espera en segundos]]])

Inicia una conexión que tiene dominio Internet (AF_INET) o dominio Unix
(AF_UNIX). En el domino Internet abre una conexión TCP hacia el ordenador
nombre del servidor mediante el puerto número de puerto. Si se accede a un
dominio Unix, nombre del servidor se usa como ruta hacia el socket y número
de puerto debe ser 0. El parámetro opcional tiempo espera en segundos se
puede usar para indicar el tiempo de espera para establecer la conexión. Los
parámetros opcionales número de error y mensaje de error, que deben
pasarse por referencia, muestran el error del sistema producido en la llamada
mediante connect().

Esta función devuelve False si no se ha podido iniciar la conexión. En este


caso, si el parámetro número de error devuelve 0, es señal de que el error
ocurrió antes de hacerse la llamada connect(). Si se ha llevado a cabo la
conexión, esta función devuelve un puntero de fichero, que puede usarse en
otras funciones de tratamiento de ficheros ya estudiadas en el Curso de PHP
Iniciación, como fgets(), fgetss(), fputs(), fclose()y feof().

Vamos a usar bastante estas funciones de red en lo que queda de curso. En el


Ejemplo 5 usamos la función fsockopen para escanear puertos disponibles de
la forma siguiente:

function puerto_activo($host, $puerto)


{
$fp = @fsockopen("$host", $puerto, &$errno,&$errstr, 1);
if (!$fp) return false;
fclose($fp);
unset($fp);
return true;
}

Algo más adelante, en este mismo script, se usa otra función de red para
obtener el servicio de Internet que corresponde al número de puerto
especificado:

$serv = getservbyport($i,"tcp");

Aconsejamos a los alumnos y alumnas del curso que estudien detenidamente


el código de los ficheros script que integran este ejemplo y que lean los

18
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

comentarios. Así aprenderán a utilizar las funciones de red más importantes


aplicadas en estos programas.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 5 (Escaneador


de servicios) de la Unidad 2. Estudia el código fuente y ejecútalo para
mostrar en el navegador el resultado de su interpretación.

Si ejecutas el Ejemplo 5 de la Unidad 2 verás que aparece la siguiente página:

19
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

3.4. Funciones FTP en PHP


PHP pone a disposición de los programadores de páginas web varios
protocolos. Entre ellos, el más usado y común es FTP (File Transfer Protocol),
palabra que es un acrónimo de Protocolo de Transferencia de Ficheros.

FTP es el método más seguro y fiable para transferir archivos entre


ordenadores a través de la red. PHP proporciona funciones propias para usar
FTP en forma directa desde un script php. En esta apartado vamos a conocer y
aprender a aplicar las más usadas y necesarias.

Para poder trabajar en PHP con un servidor FTP debemos activarlo primero. Al
instalar XAMPP ya se incluye el servidor FileZilla FTP Server. Para arrancarlo
debemos ejecutar el Panel de Control de XAMPP y hacer clic en el botón
correspondiente “Start” del servidor FileZilla:

Si usas Windows, aparecerá un mensaje del Firewall solicitando permisos para


ajecutar el servidor FTP:

20
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

A continuación, vamos a dar de alta un usuario en este servidor FTP haciendo


clic en el botón “Admin” del servidor FileZilla:

Después, aparecerá una ventana donde podremos conectar con el servidor


local FTP (configuración de la siguiente imagen) u otro servidor remoto. En esta
ventana pulsamos simplemente el botón “OK” para continuar:

Aparecerá la ventana de configuración del servidor FTP FileZilla. En este caso


y por simplificación no vamos a usar grupos de usuarios (usuarios que tienen
las mismas propiedades) y daremos de alta directamente el usuario “admin” sin
asociarlo a ningún grupo. Para ello, pulsamos en el botón “Users” de esta
ventana:

21
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

Después, pulsaremos el botón “Add” para añadir un nuevo usuario:

Indicamos el nombre de usuario, por ejemplo “admin”. No seleccionamos


ningún grupo de usuarios y pulsamos el botón “OK”:

22
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

En la siguiente ventana podemos incluir una contraseña del usuario:

Seleccionamos la pestaña “Shared Folder”, añadimos con el botón “Add” la


carpeta o carpetas accesibles por el usuario (por ejemplo,
C:\xampp\htdocs\curso), marcamos los permisos de acceso a ficheros y
direcciotorios y, finalmente, pulsamos el botón “OK” para finalizar el alta del
usuario:

23
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

En la ventana de administración de FileZilla podemos ver todos los comandos


que se ejecutan en el servidor y, en la parte inferior, las conexiones de los
usuarios al servidor y las operaciones que ejecutan:

Una vez hemos arrancado el programa y dado de alta un usuario en el servidor


FTP FileZilla, en el Ejemplo 6 de esta Unidad hemos utilizando las funciones
FTP de que dispone PHP.

24
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

Veamos cómo lo hemos hecho en las correspondientes instrucciones en el


archivo index.php del proyecto PHP:

1. Conexión con el servidor

$conexion=@ftp_connect($_SESSION['server'], $_SESSION['port']);

La función ftp_connect permite establecer una conexión FTP entre nuestro


equipo y el servidor FTP remoto. Su sintaxis es:

$conexion=ftp_connect(servidor, puerto, temporización);

…donde servidor (host) es el nombre de la máquina a la que queremos


conectarnos, el parámetro opcional puerto es el número de puerto a través del
cual nos conectamos. Si éste no se especifica o se pone 0, se utiliza el puerto
por defecto fijado para el protocolo FTP, que es el 21. El parámetro
temporización es el tiempo de espera para todas las operaciones siguientes. Si
no se indica, el tiempo por defecto son 90 segundos. En la variable $conexion
se almacena una cadena con el contenido del flujo de datos que el cliente (en
este caso el ordenador que alberga el intérprete PHP) recibe del servidor, es
decir, los mensajes de conexión aceptada (incluidos los detalles) o de conexión
rechazada.

2. Autenticación en el servidor FTP

$acceso_ftp=@ftp_login($conexion,$_SESSION['user'],$_SESSION['password
']);

Una vez establecida la conexión, es preciso identificarse para que el servidor


remoto permita el intercambio de datos. Aunque en muchos casos no podamos
ver esta fase, pues los datos pedidos inicialmente (nombre de usuario y
contraseña) no se preguntan varias veces, esta operación de identificarse es
imprescindible y muy importante. Se realiza mediante la función ftp_login, que
inicia una sesión FTP y tiene esta sintaxis:

ftp_login(conexion,nombre de usuario, contraseña);

Esta función devuelve True si se puede iniciar la sesión y False si no se ha


podido. Como parámetros hay que proporcionar el identificador de conexión
obtenido mediante la función ftp_connect, el nombre del usuario y la
contraseña de quien intenta conectarse.

3. Activación en modo pasivo

ftp_pasv($conexion, true);

Con este comando se activa el modo pasivo del protocolo FTP. En este modo,
las conexiones de datos las inicia el cliente en lugar del servidor. Es habitual
hacerlo si el cliente se encuentra detrás de un firewall, ya que, si no, la
conexión no funciona.

25
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

4. Obtención del tipo de sistema operativo

$tipo_sis=@ftp_systype($conexion);

Una vez que hemos establecido la conexión, podemos saber el tipo de sistema
del servidor remoto con la función ftp_systype, que devuelve un identificador
del sistema remoto sobre el que estamos haciendo FTP o False si no se puede
obtener. Un posible valor devuelto por esta función es "UNIX".

Nota: si usas FileZilla Server de XAMPP en Windows el servidor indica el sistema de ficheros
de tipo LINUX. Sin embargo, no funciona el cambio de permisos de los ficheros porque
realmente el sistema operativo es Windows.

5. Cambio de directorio

ftp_chdir($conexion,$dirActual);

La función ftp_chdir, así como su semejante ftp_cdup, sirve para moverse


dentro de los directorios del servidor remoto. La función
ftp_chdir(conexion,directorio) permite moverse al directorio especificado
dentro del servidor de conexión. La función ftp_cdup(conexion) permite
moverse al directorio padre (un nivel por encima de donde se está) dentro del
servidor de conexion.

6. Obtención del directorio actual

$dirActual=ftp_pwd($conexion);

La función ftp_pwd sirve para invocar el comando pwd (print work directory), que
devuelve el nombre del directorio actual del servidor al que nos hemos
conectado.

Como puedes ver, si has usado alguna vez un servidor FTP por comandos, las
funciones se parecen mucho a estos comandos y resultan familiares y sencillas
de recordar.

7. Descarga de archivo

ftp_fget($conexion,$fp,"$file",$mode)

La función ftp_fget invoca el comando GET para bajar un archivo del servidor
remoto. Hay que especificar como parámetros de la función el identificador de
la conexión, el puntero al nombre del archivo local abierto, el nombre del
archivo remoto y la modalidad de la transferencia, que puede ser FTP_ASCII o
FTP_BINARY.

La sintaxis de la función ftp_fget es:

ftp_fget(conexion,identificador del puntero al fichero local,


nombre del fichero del servidor remoto,modalidad)

26
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

Por ejemplo, para bajar del servidor el archivo informa.txt, suponiendo que
estamos ya en el directorio que lo incluye, y almacenarlo en el directorio local
/tmp con nombre informacion.txt en modalidad ASCII, escribiremos:

$fichero=ftp_fget($conexion,"/tmp/informacion.txt",
"informa.txt",FTP_ASCII);

Para saber si la operación se ha podido realizar, tenemos dos procedimientos o


formas: controlar si efectivamente el archivo está en nuestro disco o controlar el
valor de la variable $fichero: si tiene el valor 1, entonces la operación se ha
llevado a cabo; en cambio, si tiene el valor 0, ningún archivo se habrá bajado
del servidor ni aparecerá en nuestro disco.

8. Borrar fichero

ftp_delete($conexion,"$file")

La función ftp_delete borra del servidor FTP remoto el fichero especificado en


el parámetro "$file". Su sintaxis es:

ftp_delete(conexion,nombre del fichero del servidor remoto)

Si la operación puede llevarse a cabo, esta función devuelve True. En caso de


error, devuelve False.

9. Borrar directorio

ftp_rmdir($conexion,"$file"))

La función ftp_rmdir borra del servidor FTP remoto el directorio especificado


en el parámetro "$file". Su sintaxis es:

ftp_rmdir(conexion,nombre del directorio del servidor remoto)

Si la operación puede llevarse a cabo, esta función devuelve True. En caso de


error, devuelve False.

Complementaria de la función anterior es la función ftp_mkdir, que crea en el


servidor FTP remoto el directorio especificado. Su sintaxis es:

ftp_mkdir(conexion,nombre del directorio del servidor remoto)

Si la operación puede llevarse a cabo, esta función devuelve el nombre del


directorio creado. En caso de error, devuelve False.

10. Modificar nombre fichero

ftp_rename($conexion,"$file","$file2")

27
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

La función ftp_rename renombra en el servidor FTP remoto el fichero


especificado en el parámetro "$file" y le asigna el nombre indicado en el
parámetro "$file2". Su sintaxis es:

ftp_rename(conexion,nombre original de fichero,


nuevo nombre del fichero)

Si la operación puede llevarse a cabo, esta función devuelve True. En caso de


error, devuelve False.

11. Cambio de permisos de ficheros

ftp_chmod($conexion, $modo, $file)

La función ftp_chmod establece permisos en un archivo. Devuelve los nuevos


permisos del archivo en caso de éxito o FALSE en caso de error.

Además, podemos usar el comando similar:

ftp_site($conexion,"chmod $perms $file")

La función ftp_site permite enviar al servidor FTP remoto una orden o


comando FTP. Las órdenes o comandos FTP son usadas por el servidor para
realizar diferentes tareas administrativas dentro del sistema. La mayoría de
ellas sólo pueden ser ejecutadas por el administrador del sistema.

Con la orden FTP HELP, escrita detrás del símbolo ftp>, se puede obtener
ayuda sobre los comandos FTP disponibles. Por ejemplo, el comando WHO
permite obtener una lista de todos los usuarios conectados al servidor; KICK
nombre_de_usuario desconecta a un usuario del servidor; SETATTR
nombre_de_usuario nombre_del_atributo valor_del_atributo asigna
permisos a un usuario; chmod permisos_fichero, que hemos usado en la
instrucción del ejemplo, cambia los permisos sobre el fichero o el directorio
especificado.

Su sintaxis es:

ftp_site(conexion,comando FTP)

Si la operación puede llevarse a cabo, esta función devuelve True. En caso de


error, devuelve False.

12. Listar ficheros de un directorio

ftp_rawlist($conexion,"");

La función ftp_rawlist devuelve una lista detallada de ficheros del directorio


indicado. Su sintaxis es:

ftp_rawlist(conexion,nombre del directorio)

28
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

Esta función ejecuta el comando FTP LIST y devuelve el resultado como una
matriz. Cada elemento de esta matriz contiene una línea de texto con los datos
completos del directorio afectado. Si se quiere obtener la lista del directorio
actual, hay que poner comillas, como hemos hecho en este ejemplo del curso.
Si la operación no puede llevarse a cabo, se devuelve False.

Otras funciones para hacer FTP

Aunque no las hayamos usado en este ejemplo, veamos algunas otras, las más
importantes, que pueden ser necesarias para realizar las actividades que hay
que remitir al tutor en esta Unidad.

1. La función ftp_nlist es similar al comando dir del sistema operativo:


permite ver el nombre de los ficheros de un directorio. Se usa de la misma
forma que la función anterior ftp_rawlist. Devuelve también una matriz. En
cada uno de sus elementos se guarda un nombre de fichero de esa lista. Si no
se puede ejecutar, se devuelve False.

2. La función ftp_fput se usa para subir un fichero al servidor FTP remoto. Es


la contraria de ftp_fget. Hay que especificar como parámetros de la función el
identificador de la conexión, el nombre del archivo remoto, el puntero al nombre
del archivo local abierto y la modalidad de la transferencia, que puede ser
FTP_ASCII o FTP_BINARY.

La sintaxis de la función ftp_fput es:

ftp_fput(conexion, nombre fichero subido a servidor remoto,


identificador del puntero al fichero local, modalidad)

Por ejemplo, para subir al servidor el archivo local /tem/informa.txt y


almacenarlo en el servidor, suponiendo que estamos ya en el directorio donde
queremos copiarlo, con el nombre informacion.txt en modalidad ASCII,
escribiremos:

$fichero=ftp_fput($conexion,"informacion.txt",
"/tmp/informa.txt", FTP_ASCII);

3. La función ftp_size devuelve el tamaño del fichero especificado. Tiene esta


sintaxis:

ftp_size(conexion,nombre del fichero remoto)

Esta función, si se puede llevar a cabo, devuelve el tamaño del fichero. Si no se


puede, devuelve -1.

4. La función ftp_close, que se ha incluido a partir de la versión 4.2.0 de PHP,


cierra una conexión abierta con ftp_connect e inicializa los valores de
conexión. Su sintaxis es muy sencilla:

29
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

ftp_close(conexion)

Esta función es casi idéntica a ftp_quit, que realiza la misma operación, en


versiones anteriores de PHP. Tiene la misma sintaxis.

5. La función ftp_exec permite ejecutar un programa en el servidor FTP


remoto. Tiene la sintaxis siguiente:

ftp_exec(conexion,comando)

Envía una orden FTP EXEC al servidor FTP. Devuelve la salida de la ejecución
de la orden o False si no se ha podido realizar la operación.

6. La función ftp_mdtm devuelve la fecha del último cambio hecho en el fichero


especificado. Tiene la sintaxis siguiente:

ftp_mdtm(conexion,fichero remoto)

Esta función comprueba la fecha de la última modificación de un fichero y la


devuelve en formato de tiempo UNIX (timestamp). Si se produce algún error o
el fichero no existe, devuelve -1.

No dudes en acceder al Manual de PHP para obtener más información sobre


otras funciones FTP disponibles en PHP.

Aconsejamos a los alumnos y alumnas que estudien los tres scripts del
Ejemplo 6 detenidamente. Para resolver correctamente la actividad que hay
que enviar al tutor en esta Unidad es preciso asimilar y saber aplicar
eficazmente las funciones FTP estudiadas en este apartado.

Utilizando Eclipse PDT puedes abrir el proyecto Ejemplo 6 (Cliente FTP


1.2) de la Unidad 3. Estudia el código fuente y ejecútalo para mostrar en el
navegador el resultado de su interpretación.

Si ejecutas el Ejemplo 6 de la Unidad 3 verás que aparece la siguiente página:

Atención: en este programa hemos utilizado expresiones regulares para crear el


listado de ficheros, en la Unidad 5 estudiaremos en detalle cómo funcionan.

30
Curso Avanzado de PHP
Unidad 3: Configuración y Conectividad de PHP

Resumen

Hay que saber al final de esta unidad…

• Configurar las diferentes características y opciones


de PHP. Reconocer y asignar valores a las directivas
que integran el fichero de inicialización php.ini.

• Aplicar las funciones y procedimientos de PHP que


permiten hacer ping, conocer la ruta de acceso a un
servidor, saber la velocidad de una conexión y
optimizar el ancho de banda.

• Usar las funciones que permiten realizar a través de


la red las operaciones siguientes: comprobar registros
DNS, obtener el nombre de dominio o la dirección IP de
los servidores, obtener protocolos y servicios de
Internet y establecer conexiones entre máquinas
mediante Sockets.

• Servirse de las funciones de PHP que permiten


transferir archivos entre ordenadores a través de la
red usando el protocolo FTP.

31