Manual de PHP

RECU-0256 (Recurso Manual)

Descripción

Introducción

PHP (acrónimo de PHP: Hypertext Preprocessor) es un lenguaje de código abierto muy popular especialmente adecuado para desarrollo web y que puede ser incrustado en HTML. En lugar de usar muchos comandos para mostrar HTML (como en C o Perl), páginas PHP contienen HTML con código incluido en el mismo que hace "algo" (en este caso, mostrar "Hola ¡soy un script PHP!). El código PHP está entre medio de etiquetas de comienzo y final especiales <?php y ?> que nos permitirán entrar y salir del "modo PHP".

Lo que distingue a PHP de algo lado-cliente como Javascript, es que el código es ejecutado en el servidor, generando HTML y enviándolo al cliente. El cliente recibirá los resultados de ejecutar el script, sin ninguna posibilidad de determinar qué código ha producido el resultado recibido. El servidor web puede ser incluso configurado para que procese todos los archivos HTML con PHP y entonces no hay manera que los usuarios puedan saber que tienes debajo de la manga.

Lo mejor de usar PHP es que es extremadamente simple para el principiante, pero a su vez, ofrece muchas características avanzadas para los programadores profesionales. No sienta miedo de leer la larga lista de características de PHP, en poco tiempo podrá empezar a escribir sus primeros scripts.La curva de aprendizaje del lenguaje es muy reducida.

Aunque el desarrollo de PHP está centrado en programación de scripts en lado-servidor, se puede utilizar para muchas otras cosas.

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, o enviar y recibir cookies. Y esto no es todo, se puede hacer mucho más.Existen principalmente tres campos en los que se usan scripts en PHP.

  • Scripts del lado-servidor. Este es el campo más tradicional y el principal foco de trabajo. Se necesitan tres cosas para que esto funcione. El intérprete PHP (CGI módulo), un servidor web y un navegador. Es necesario hacer funcionar el servidor, con PHP instalado. El resultado del programa PHP se puede obtener a través del navegador, conectándose con el servidor web.
  • Scripts en la línea de comandos. Puede crear un script PHP y correrlo 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. Consultar la sección Usos de PHP en la línea de comandos para más información.
  • 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. Si está interesado en PHP-GTK, puedes visitar las » páginas web del proyecto.

PHP puede ser utilizado en cualquiera de los principales sistemas operativos del mercado, incluyendo Linux, muchas variantes Unix (incluyendo HP-UX, Solaris y OpenBSD), Microsoft Windows, Mac OS X, RISC OS y probablemente alguno más. PHP soporta 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. PHP 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 indicara si mostrara los errores o los ocultara.+

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