lunes, 23 de diciembre de 2013

PHP: Diferencias y Similitudes entre Require e Include


Al realizar desarrollos en PHP es común encontrarse con las funciones require() e include(), estas funciones permite agregar en el script donde se insertan todo el contenido de otro script.
Estas funciones son muy útiles para agregar archivos con funciones comunes a varios scripts o para permitir que el código quede más ordenado. Por ejemplo, se crea una función para verificar si un RUT es válido y esta función se utiliza en diez script diferentes, en lugar de escribir 10 funciones, se puede crear un script que contenga la función y luego se agrega el archivo en los script donde se van a utilizar.

Script con la función valida_rut.

valida_rut.php

<?php
function valida_rut($in_rut){
.
.
.
}
?>

Utilización de la función require().

utiliza_valida_rut.php

<?php
require(“ruta/valida_rut.php”);
$rut = '13478217-2';
valida_rut($rut);
?>

Utilización de la función include().

utiliza_valida_rut.php

<?php
include(“ruta/valida_rut.php”);
$rut = '13478217-2';
valida_rut($rut);
?>

Estas dos funciones parecieran hacer lo mismo, pero tienen una importante diferencia, como lo dice su nombre la primera función (require) requiere que el archivo exista para agregar el archivo, si el archivo no existe el código presentará un error “PHP Fatal error” y la ejecución del código se detendrá. La segunda función (include) incluye el archivo, pero si este archivo no existe enviará un error de tipo “Warning” lo cual permitirá que el código se siga ejecutando.

Cuando se utiliza la función require() o include(), es como si ambos script quedarán convertidos en uno solo, por lo tanto el script padre (quien utiliza la función require o include) y script hijo (quien es insertado a través de la función require(“archivo.php”) o include(“archivo.php”)) tienen acceso a cualquier función que este en cualquiera de los dos archivos, así como a las funciones que existan en otros script que han sido agregados tanto en el padre como en el hijo a través de la función require o include. Esto puede presentar inconvenientes, por ejemplo si tanto el padre como el hijo agregan un script llamada repetido.php, todo el código contenido en repetido.php quedará duplicado, lo cual puede acarrear problemas de variables duplicadas o funciones duplicadas, por este motivo se debe tener especial cuidado en la utilización de estas funciones. Para evitar este tipo de problemas yo evito que los archivos hijos utilicen las funciones require e include, pero si las agregas con cuidado, verificando que un archivo padre y uno hijo no contengan los mismos script no existe ningún problema.

Una opción para evitar el problema de agregar dos veces el mismo script es utilizar las funciones require_once o include_once. Estas funciones trabajan igual que las anteriores con la única diferencia que evalúan si el archivo ha sido agregado anteriormente y si este es el caso no lo vuelen a incluir, sin embargo estas funciones son más pesadas y consumen más recursos lo que implica que deben ser utilizadas solo cuando sea necesario.

Otro punto que se debe tener en cuenta a la hora de utilizar las funciones require e include es la utilización de variables de sesión. Cuando se inicia una sesión que previamente estaba iniciada se presenta un error de tipo “Notice”, es posible que al utilizar require o include se inicie una sesión en el archivo padre y luego en el archivo hijo, lo cual provocará el error antes mencionado. Con un error de tipo “Notice” se puede continuar con la ejecución del código, pero es importante mencionar que esto puede hacer más tediosa la búsqueda de errores del sistema, porque el log de errores crece mucho más por este tipo de errores ocultando los errores más graves que pueden perjudicar la correcta ejecución del sistema.

Referencias:
"Gracias, por compartir tus conocimientos"

jueves, 7 de noviembre de 2013

Linux: Copiar contenido de un directorio, excluyendo algunos archivos


Uno de los comandos más utilizados en la consola de Linux es cp que nos permite copiar un archivo o directorio en otra ubicación. Al tratar de copiar el contenido de un directorio, necesitaba dejar fuera de esta copia varios archivos que por su tamaño no podían ser copiados a la nueva ubicación, después de investigar en la web encontré el modo de realizar esta operación utilizando el comando cp. A continuación se detallan el modo de realizar esta operación.

cp directorio_o/!(archivo.txt) directorio_d: copia todos los archivos que están en el directorio directorio_o menos el archivo archivo.txt al directorio directorio_d.

cp directorio_o/!(archivo_1.txt|archivo_2.txt) directorio_d: copia todos los archivos que están en el directorio directorio_o menos los archivos archivo_1.txt y archivo_2.txt al directorio directorio_d. Esto permite excluir de la copia todos los archivos que el usuario considere necesarios, para agregar más archivos solo debe agregar un nuevo pipe “|” seguido por el nombre del siguiente archivo que se desea excluir.

cp -r directorio_o/!(directorio_e) directorio_d: copia todo el contenido del directorio directorio_o menos el directorio directorio_e al directorio directorio_d. Esta copia incluye otros directorio que existan en directorio_o porque se agrega el argumento -r que indica que la copia sea recursiva, es decir, que si existen otros directorios dentro del directorio origen también sean incluidos en la copia.

Se debe mencionar que la opción del pipe “|” que permite excluir más de un archivo, también puede ser utilizada para excluir más de un directorio o excluir directorios y archivos juntos en la misma operación, como se puede observar a continuación.

cp -r directorio_o/!(directorio_e1|directorio_e2) directorio_d: copiar todo el contenido del directorio directorio_o menos los directorios directorio_e1 y directorio_e2 al directorio directorio_d.

cp -r directorio_o/!(archivo_1.txt|archivo_2.txt|directorio_e1|directorio_e2) directorio_d: copiar todo el contenido del directorio directorio_o menos archivo_1.txt, archivo_2.txt, directorio_e1 y directorio_e2 al directorio_d.

"Gracias, por compartir tus conocimientos"