Manual de PHP

RECU-0256 (Recurso Manual)

Descripción

PHP (acrónimo de PHP: Hypertext Preprocessor) es un lenguaje de código abierto muy popular, especialmente adecuado para desarrollo web, que puede ser incrustado en HTML. En lugar de usar muchos comandos para mostrar HTML, el código PHP es incluido en el HTML para añadir funcionalidad. Éste código se incluye mediante las etiquetas <?php y ?>.

Lo que distingue a PHP de tecnologías como Javascript es que el código es ejecutado en el servidor, generando el HTML y enviándolo al cliente. El cliente recibirá los resultados de ejecutar el script sin la posibilidad de determinar qué código ha producido el resultado. El servidor web puede ser configurado para que procese todos los archivos HTML como PHP, impidiendo a los usuarios ver el código que produce la página.

La curva de aprendizaje de PHP es muy reducida debido a que el lenguaje es bastante simple. Esta característica no impide que pueda ofrecer numerosa funcionalidad avanzada para programadores con más experiencia.

Características

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, enviar y recibir cookies, etc.. Existen principalmente tres campos en los que se usan scripts en PHP.

  • Scripts del lado del servidor: Este es el campo más tradicional y el principal foco de trabajo. Se necesitan tres elementos para que funcione. El intérprete PHP (CGI módulo), un servidor web y un navegador. El resultado del programa PHP se obtiene a través del navegador, siempre y cuando el servidor web esté ejecutándose.
  • Scripts en la línea de comandos: Puede crear un script PHP y ejecutarlo sin necesidad de un 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 Unix 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.

Puede ser utilizado en la mayoría de los sistemas operativos del mercado, incluyendo Linux, muchas variantes Unix (incluyendo HP-UX, Solaris y OpenBSD), Microsoft Windows, Mac OS X, RISC OS.

Es soportado por 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.

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.

Ejemplos

A continuación vamos a ver una ejemplo detallado del manejo de errores dentro de PHP

Se pueden encontrar múltiples ejemplos de desarrollo en PHP. A continuación vamos a desarrollar un ejemplo para el manejo de errores en PHP5. Dentro del lenguaje disponemos de una función (set_error_handler()) que nos facilita la posibilidad de crear un log de errores donde poder enmascarar los mismos. A continuación tenemos la clase que nos permite manejar los errores y poder mostrarlos a voluntad, así como crear logs cuando lo creamos necesario.

class error{   
var $_contexto;
   var $codigo;
   function error($contexto,$error){
      $this->_contexto =& $contexto;
      $GLOBALS['_OBJETO_CONTEXTO'] =& $this->_contexto;
      $this->activo($error);
}

Al crear la clase, capturaremos el contexto (que sera el error reportado por PHP) para luego asignarlo a una variable propia de la clase para manejarla mas adelante. Así mismo crearemos una variable global con el contexto y verificaremos con una función propietaria si la clase esta activa o no para mostrar errores. La variable $error es una variable definida por el usuario que nos indicará si mostrará los errores o los ocultará.

function activo(){
switch(func_num_args()){
    case 1: $this->_activo = func_get_arg(0); $this->iniciar(); break;
       case 0: return $this->_activo;
    }
}

Si mostramos los errores, comenzamos con la función iniciar(). Con esta función podremos crear ,con la ayuda de la variable $contexto (donde esta el error), un manejador de errores propio. Es la encargada de capturar el error y enviarlo hacia otra clase separado por NUMERO de error predefinido por PHP, MENSAJE del error, ARCHIVO donde se produjo el error, LINEA donde se produjo el error en el archivo y por ultimo el MENSAJE o CONTEXTO del error. Con estas variables tipo String separadas podremos crear mas adelante un estilo para mostrarlas.

function iniciar(){        
if(!function_exists('adm_error')){
        function adm_error($numero, $mensaje, $archivo, $linea, $contexto, $retorna=false){
            $objContexto =& $GLOBALS['_OBJETO_CONTEXTO'];
            $objContexto->inicializar($numero, $mensaje, $archivo, $linea, $contexto);
            if($retorna)
                return $objContexto->leer();
            else
                print $objContexto->leer();
        }
    }
    if(!function_exists('errorFatal')){
    function errorFatal($buffer){
            $buffer_temporal = $buffer;
            $texto = strip_tags($buffer_temporal);
            if(preg_match('/Parse error X: (.+) in (.+)? on line (\d+)/', $texto, $c))
                return adm_error(E_USER_ERROR, $c[1], $c[2], $c[3], "", true);
            if(preg_match('/Fatal error X: (.+) in (.+)? on line (\d+)/', $texto, $c))
                return adm_error(E_USER_ERROR, $c[1], $c[2], $c[3], "", true);
            return $buffer;
        }
    }       
if( $this->activo() ){
        error_reporting(0);
        ob_start('errorFatal');
        set_error_handler('adm_error');
    }
else
        error_reporting(0);
   }

   function exception_handler($exception) {
       echo "Uncaught exception: " , $exception->getMessage(), "\n";
   }
}

A continuación mostramos la clase Contexto, que recibe los parámetros de la clase Error y los muestra mediante un formato predefinido, ademas de crear un LOG en archivos de texto separados por tipo de errores. _ERRORDETALLE y _LOGS son variables globales definidas por el usuario, esto nos ayuda a no mostrar los detalles del error (como archivo y código) una vez que este en producción el sistema, así mismo a controlar la creación de los logs.

class Contexto
{
    var $_numero = "";
    var $_mensaje = "";
    var $_Estilo = "";
    var $_Imagen = "";
    var $_lineas = 5;
    var $_noticiaEstilo = "style='font-style:italic;font-size:11px;font-family:Arial, Helvetica, sans-serif;margin:5px;color:#000000;padding: 5px;width: 90%;display:block;background-color:#FFFFCC;border: solid 1px #CFCFCF;'";
    var $_noticiaImagen = "<img src='noticia.gif' align='left' hspace='5'>";
    var $_alertaEstilo = "style='font-style:italic;font-size:11px;font-family:Arial, Helvetica, sans-serif;margin:5px;color:#000000;padding: 5px;width: 90%;display:block;background-color:#FDDAD8;border: solid 1px #CFCFCF;'";
    var $_alertaImagen = "<img src='alerta.gif' align='left' hspace='5'>";
    var $_codigoEstilo = "style='width: 90%;background-color: #F1F1F1;margin: 5px;border: solid 1px #CFCFCF;display:block;'";

    function inicializar($numero, $mensaje, $archivo, $linea, $contexto)
    {
       $errorlevels = array(2048=>'Runtime Notice',2047=>'Runtime Notice',1024=>'User Notice',512=>'User Warning',256=>'User Error',128=>'Compile Warning',64=>'Compile Error',32=>'Core Warning',16=>'Core Error',8=>'Notice',4=>'Parsing Error',2=>'Warning',1=>'Error');
       $this->_Estilo=(($numero==2048)or($numero==2047)or($numero==1024)or($numero==8))?$this->_noticiaEstilo:$this->_alertaEstilo;
       $this->_Imagen=(($numero==2048)or($numero==2047)or($numero==1024)or($numero==8))?str_replace('HOSTZOD',_HOSTZOD,$this->_noticiaImagen):str_replace('HOSTZOD',_HOSTZOD,$this->_alertaImagen);
       $this->_Imagen=(_ERRORDETALLE)?$this->_Imagen:substr($this->_Imagen,0,(strlen($this->_Imagen)-1)).' width="23" height="21" style="position:relative;top:-3px">';
       $this->_mensaje = "<pre><div ".$this->_Estilo.">".$this->_Imagen."<b>".$errorlevels[$numero].":</b> ";
       $this->_mensaje.=(_ERRORDETALLE)?"$mensaje<br><b>Archivo:</b> ".substr($archivo,strrpos($archivo, "\\")+1,strlen($archivo))."<br><b>Línea:</b> $linea<br></div><div ".$this->_codigoEstilo.">".$this->obtenerContexto($archivo, (int) $linea)."</div></pre>":date("ymdHis")."</div></pre>";
       if(_LOGS){error_log(date("YmdHis")."|".$_SERVER['HTTP_X_FORWARDED_FOR']."|$mensaje|".substr($archivo,strrpos($archivo, "\\")+1,strlen($archivo))."|$linea\r\n",3,"error".str_replace(" ", "",$errorlevels[$numero]).".log");}
    }

    function leer(){
       return $this->_mensaje;
    }

    function obtenerContexto($archivo, $linea){
        if (!file_exists($archivo)) {
            return "El contexto no puede mostrarse - ($archivo) no existe";
        } elseif ((!is_int($linea)) OR ($linea <= 0)) {
            return "El contexto no puede mostrarse - ($linea) es un número inválido de linea";
        } else {
            $codigo = file( $archivo);
            $lineas = count($codigo);
            $inicio = $linea - $this->_lineas;
            $fin = $linea + $this->_lineas;
            if ($inicio < 0) $inicio = 0;
            if ($fin >= $lineas) $fin = $lineas;
            $largo_fin= strlen($fin) + 2;
            for ($i = $inicio; $i < $fin; $i++){
               $color=($i==$linea-1?"red; font-weight:bold":"black");
               $salida[] = "<span style='color: $color'>".($i+1).str_repeat(" ", $largo_fin - strlen($i)).htmlentities($codigo[$i]).'</span>';
            }
            return trim(join("", $salida));
        }
    }
}

Para modificar el estilo solo debe modificar las variables $_noticiaEstilo, $_noticiaImagen, $_alertaEstilo y $_alertaImagen. Los archivos de logs se ubicaran en la misma carpeta. Para usar la función simplemente incluimos el archivo y usamos la sentencia: $error = new error( new Contexto );

Contenidos relacionados