miércoles, 25 de agosto de 2010

Uso de librerías estándar en PHP

Una de las bases sobre las que se asienta el software libre es la de la compartición y reutilización de código. En el desarrollo de nuestros proyectos, antes de pensar en programar alguna funcionalidad, deberíamos investigar si esta ya existe y si es posible incorporarla a nuestro trabajo, bien directamente tal y como está, o bien introduciendo modificaciones y así extender y mejorar lo que ya está hecho. Es altamente probable que las librerías que ya existan hagan lo que pretendemos de manera mucho más eficiente que del modo que nosotros mismos pudiésemos alcanzar; es lógico, la mayoría de esas librerías tienen un desarrollo en el que se puede haber implicado un amplio equipo de desarrolladores y además suelen estar ampliamente probadas y depuradas, lo que, en definitiva, nos ahorrará bastante tiempo de trabajo y de problemas, a pesar que tengamos que emplear algún tiempo inicial de aprendizaje.

Para incorporar estas librerías estándar en nuestros proyectos php, lo mejor es instalarlas en el sistema mediante el paquete correspondiente. Usualmente se ubicarán en diferentes directorios dentro de usr/share/php, si estamos hablando de sistemas Linux. A la hora de invocarlas en el código de nuestro proyecto php mediante instrucciones tipo include o require_once deberemos indicar el fichero con la ruta, relativa o absoluta, para llegar hasta él. Esto puede ser engorroso y fuente de errores, así que lo mejor es incluir las rutas de las librerías que utilicemos en la directiva include_path del fichero php.ini (necesitamos reiniciar el servidor web), de ese modo únicamente indicaremos el nombre de la librería en los comandos include. El formato de la directiva include_path es el siguiente:


include_path "(ruta1):(ruta2):(ruta n)"

martes, 24 de agosto de 2010

Distintas configuraciones del fichero php.ini

Resulta interesante seguir las recomendaciones acerca de la configuración de algunas directivas del fichero php.ini dependiendo del uso al que esté destinado el servidor; desarrollo o producción. Con estas sencillas operaciones podemos facilitar la depuración y detección de problemas en el primer caso, y optimizar el rendimiento en el segundo.

allow_call_time_pass_reference
  • Valor por defecto: On
  • Valor en desarrollo: Off
  • Valor en producción: Off

display_errors
  • Valor por defecto: On
  • Valor en desarrollo: On
  • Valor en producción: Off

display_startup_errors
  • Valor por defecto: Off
  • Valor en desarrollo: On
  • Valor en producción: Off

error_reporting
  • Valor por defecto: E_ALL & ~E_NOTICE
  • Valor en desarrollo: E_ALL | E_STRICT
  • Valor en producción: E_ALL & ~E_DEPRECATED

html_errors
  • Valor por defecto: On
  • Valor en desarrollo: On
  • Valor en producción: Off

log_errors
  • Valor por defecto: Off
  • Valor en desarrollo: On
  • Valor en producción: On

magic_quotes_gpc
  • Valor por defecto: On
  • Valor en desarrollo: Off
  • Valor en producción: Off

max_input_time
  • Valor por defecto: -1 (Unlimited)
  • Valor en desarrollo: 60 (60 seconds)
  • Valor en producción: 60 (60 seconds)

output_buffering
  • Valor por defecto: Off
  • Valor en desarrollo: 4096
  • Valor en producción: 4096

register_argc_argv
  • Valor por defecto: On
  • Valor en desarrollo: Off
  • Valor en producción: Off

register_long_arrays
  • Valor por defecto: On
  • Valor en desarrollo: Off
  • Valor en producción: Off

request_order
  • Valor por defecto: None
  • Valor en desarrollo: "GP"
  • Valor en producción: "GP"

session.bug_compat_42
  • Valor por defecto: On
  • Valor en desarrollo: On
  • Valor en producción: Off

session.bug_compat_warn
  • Valor por defecto: On
  • Valor en desarrollo: On
  • Valor en producción: Off

session.gc_divisor
  • Valor por defecto: 100
  • Valor en desarrollo: 1000
  • Valor en producción: 1000

session.hash_bits_per_character
  • Valor por defecto: 4
  • Valor en desarrollo: 5
  • Valor en producción: 5

short_open_tag
  • Valor por defecto: On
  • Valor en desarrollo: Off
  • Valor en producción: Off

track_errors
  • Valor por defecto: Off
  • Valor en desarrollo: On
  • Valor en producción: Off

url_rewriter.tags
  • Valor por defecto: "a=href,area=href,frame=src,form=,fieldset="
  • Valor en desarrollo: "a=href,area=href,frame=src,input=src,form=fakeentry"
  • Valor en producción: "a=href,area=href,frame=src,input=src,form=fakeentry"

variables_order
  • Valor por defecto: "EGPCS"
  • Valor en desarrollo: "GPCS"
  • Valor en producción: "GPCS"

jueves, 19 de agosto de 2010

Instalación de Zend Debugger

Interesante vídeo explicativo del proceso de instalación de Zend Debugger, según artículo aparecido en desarrolloweb.com



NOTA IMPORTANTE: La cláusula zend_extension varía según la plataforma, siendo zend_extension_ts para windows y zend_extension para Linux y Mac.
ZendDebugger no se lleva bien con otras extensiones, como puede ser las propias de ZendStudio o XDebug, si no podemos prescindir de estas, lo mejor es asegurarnos que la extensión de ZendDebugger se cargue en primer lugar.

martes, 17 de agosto de 2010

Definir nuevos índices para atributos en openLDAP

Interesante artículo encontrado en tuxjm.net

Utilidades openLDAP

Las siguientes utilidades se instalan junto al servidor openLDAP.

  • slapacl Comprueba el acceso a una lista de atributos. Se utiliza para verificar el funcionamiento de las ACL, listas de control de acceso, definidas en el fichero de configuración de openLDAP, slapd.conf.
  • slapadd Inserta entradas directamente a la base de datos de openLDAP mediante fichero LDIF.
  • slapauth Comprueba el servicio de autenticación para una lista de IDs .
  • slapcat Vuelca el contenido de la base de datos de openLDAP en un fichero LDIF.
  • slapdn Comprueba la validez de los DN basándose en los esquemas definidos para el servidor openLDAP.
  • slapindex Re-indexa la entradas en una base de datos LDAP.
  • slappasswd Utilidad para manejar contraseñas. Puede utilizarse para generar las cadenas cifradas de contraseñas.
  • slaptest Comprobación del fichero de configuración LDAP slapd.conf

Como respaldar y restaurar una base de datos LDAP

Interesante y muy útil artículo encontrado en tuxjm.net

Como respaldar y restaurar una base de datos de OpenLDAP

Como alternativa, según experiencia personal, también es interesante trabajar directamente con los ficheros donde se almacena físicamente la base de datos de openLDAP. La localización de estos ficheros podemos conocerla consultando el fichero de configuración de ldap, slapd.conf, siendo indicado por la directiva directory. Los pasos a seguir serían:


  1. Parar el servicio ldap.
  2. Copiar ficheros.
  3. Establecer el usuario y grupo openldap como propietarios del directorio que contiene los ficheros.
  4. Arrancar servicio ldap.
  5. Comprobar con el comando ldapsearch.

FileZilla

Una herramienta muy útil para el intercambio remoto de fichero es FileZilla, que además es libre y compatible con las principales plataformas.

Entre sus opciones está la de poder conectar con servidores que requieran certificado. La manera de configurarlo es la siguiente:

  1. Editar -> Opciones... -> SFTP
  2. Se añade el fichero de certificado. Si el fichero tiene a su vez clave, se nos avisa que deberá ser convertido en un formato sin clave, compatible con FileZilla, para ello se nos requerirá dicha clave.
  3. Aceptar
  4. Archivo -> Gestor de sitios -> Nuevo sitio.
  5. Especificamos el URI del servidor
  6. Tipo de conexión SFTP - SSH File Transport Protocol.
  7. Modo de acceso Normal.
  8. usuario / contraseña de conexión.

miércoles, 11 de agosto de 2010

Clase Net_LDAP2_Util

Utilidades.

Resumen de los métodos públicos que proporciona. Para ampliar información, acceder a la página oficial de PEAR

  • (constructor)
  • asc2hex32 Convierte carácteres ASCII
  • canonical_dn transforma DN a forma canónica.
  • escape_dn_value
  • escape_filter_value
  • hex2asc
  • ldap_explode_dn
  • split_attribute_string Transforma en array el par atributo=valor.
  • split_rdn_multival Transforma un rdn multivaluado en array.
  • unescape_dn_value
  • unescape_filter_value

Clase Net_LDAP2_Search

Conjunto de resultados de una búsqueda LDAP.

Resumen de los métodos públicos que proporciona. Para ampliar información, acceder a la página oficial de PEAR

  • (constructor)
  • (destructor)
  • as_struct Devuelves entradas como matriz.
  • count Número de entradas resultantes de una búsqueda.
  • current Devuelve el elemento actual.
  • done Cierra un resultado de búsqueda.
  • entries Devuelve un array de objetos de entrada.
  • getErrorCode Obtiene el código de error devuelto en una búsqueda.
  • key Devuelve el identificador (DN) del elemento actual.
  • next Apunta hacia el siguiente elemento.
  • popEntry Recuperar la siguiente entrada del resultado de una búsqueda, pero empezando a partir de la última entrada.
  • pop_entry Alias de popEntry.
  • rewind Apunta al primer elemento.
  • setLink Establece enlace al descriptor LDAP.
  • setSearch Establece el descriptor de los objetos de búsqueda.
  • shiftEntry Obtiene la siguiente entrada del resultado de búsqueda.
  • shift_entry Alias de shiftEntry.
  • sizeLimitExceeded Indica si la búsqueda se excedió en tamaño.
  • sorted Ordena entradas.
  • sorted_as_struct Ordena entradas.
  • valid Comprueba si hay elemento válido después de las llamadas rewind o next.

Clase Net_LDAP2_Schema

Carga un esquema LDAP y proporciona información.

Resumen de los métodos públicos que proporciona. Para ampliar información, acceder a la página oficial de PEAR


  • fetch Obtiene el esquema de una conexión LDAP.
  • get Obtiene una entrada determinada.
  • getAll Obtiene un array de entradas de un determinado tipo.
  • isBinary Indica cuando la sintaxis de un atributo es binaria o no.
  • may Busca los atributos opcionales de un determinado ObjectClass.
  • must Busca los atributos requeridos de un determinado ObjectClass.
  • parse Analiza esquemas.
  • superclass Obtiene el nombre(s) de la(s) inmediata(s) superclase(s).

Clase Net_LDAP2_RootDSE

Obtiene al entrada rootDSe de un servidor LDAP.

Resumen de los métodos públicos que proporciona. Para ampliar información, acceder a la página oficial de PEAR

  • fetch Obtiene el objeto RootDSE desde una conexión LDAP.
  • getValue Obtiene el valor de un atributo.
  • get_value Alias de getValue.
  • supportedControl Determina si el control es soportado.
  • supportedExtension Determina si la extensión es soportada.
  • supportedSASLMechanism Determina si se soporta SASL.
  • supportedVersion Determina si la versión es soportada.
  • supported_control Alias de supportedControl.
  • supported_extension Alias de supportedExtension.
  • supported_ssasl_mechanism Alias de supportedSSASLMechanism.
  • supported_version Alias de supportedVersion.

martes, 10 de agosto de 2010

Clase Net_LDAP2_LDIF

Manejo de ficheros LDIF.

Resumen de los métodos públicos que proporciona. Para ampliar información, acceder a la página oficial de PEAR

  • (constructor)
  • current_entry Devuelve el actual objeto Net_LDAP2_Entry.
  • current_lines Devuelve las líneas que ha generado el actual Net_LDAP2_Entry.
  • done Limpia.
  • eof Devuelve el valor True cuando se alcanza el final de fichero.
  • error Indica el último mensaje de error, si es que se ha producido algún error.
  • error_lines Indica las líneas donde se han encontrado errores.
  • handle Retorna el manejador del objeto Net_LDAP2_LDIF utilizado para escritura o lectura.
  • next_lines Retorna las líneas que van a ser generadas por el objeto Net_LDAP2_LDIF.
  • parseLines Analiza las lineas LDIF de una entrada de un objeto Net_LDAP2_Entry.
  • read_entry Lee una entrada del fichero LDIF y la devuelve en un objeto Net_LDAP2_Entry.
  • version Obtiene o define la versión LDIF.
  • write_entry Escribe entradas en el fichero LDIF.
  • write_version Escribe la versión LDIF.

Clase Net_LDAP2_Filter

Sirve para representar un filtro de LDAP.

Resumen de los métodos públicos que proporciona. Para ampliar información, acceder a la página oficial de PEAR

  • (constructor)
  • asString Obtiene una representación de la cadena del filtro.
  • as_string Alias de asString.
  • combine Combina dos o más filtros mediante un operador lógico.
  • create Crea un nuevo filtro.
  • escape (desfasado)
  • parse convierte una cadena con un filtro en un objeto Net_LDAP2_Filter.
  • printMe (sólo se mantien por compatibilidad con la interface perl. En php no tiene sentido).

Clase Net_LDAP2_Error

Se utiliza para manejar los mensajes de error de LDAP.

Resumen de los métodos públicos que proporciona. Para ampliar información, acceder a la página oficial de PEAR

  • (constructor)

Clase Net_LDAP2_Entry

Describe una entrada del directorio.
Resumen de los métodos públicos que proporciona. Para ampliar información, acceder a la página oficial de PEAR

  • (constructor)
  • add Inserta el valor de un nuevo atributo o un nuevo valor para un atributo existente.
  • attributes Obtiene un array con los nombres de atributos.
  • createConnected Crea un objeto de la clase Net_LDAP2_Entry independientemente del descriptor.
  • createExisting Crea un objeto de la clase Net_LDAP2_Entry de una entrada ya existente.
  • createFresh Crea una nueva entrada que posteriormente puede ser insertada en el directorio.
  • currentDN Devuelve el valor original de DN.
  • delete Elimina un atributo en conjunto, un valor de atributo o la entrada entera.
  • dn Obtiene el Distinguished Name (DN) de una entrada.
  • exists Indica si un atributo existe o no.
  • getChanges Devuelve los cambios que se van a realizar en un atributo una vez que se llame a update().
  • getLDAP Obtiene una referencia al objeto LDAP de la entrada.
  • getValue Obtiene el valor de un determinado atributo.
  • getValues Obtiene los valores de todos los atributos.
  • get_value Alias de getValue
  • isNew Indica si la entrada se considera como nueva (no existente en el directorio).
  • markAsNew Marca la entrada como nueva o como existente.
  • move Mueve o renombra la entrada.
  • pregMatch Aplica una expresión regular sobre un atributo (que puede ser multivaluado).
  • preg_match Alias de pregMatch.
  • replace Reemplaza atributos o sus valores.
  • setLDAP Establece una referencia al objeto LDAP de la entrada.
  • update Actualiza la entrada en el directorio.
  • willBeDeleted Indica si la entrada será eliminada cuando se ejecute update().
  • willBeMoved Indica si la entrada será movida o renombrada cuando se ejecute update().

Clase Net_LDAP2

Esta clase nos permite manejar servidores LDAP.

Resumen de los métodos públicos que proporciona. Para ampliar información, acceder a la página oficial de PEAR

  • (Constructor)
  • (Destructor)
  • add inserta una nueva entrada en el directorio.
  • bind
  • checkLDAPExtension Comprueba si están cargadas las extensiones LDAP de PHP.
  • connect
  • copy Copia una entrada en una nueva localización.
  • delete Borra una entrada del directorio.
  • disconnect alias de done(), cierra la conexión con el servidor LDAP.
  • dnExists comprueba si un DN existe en el direcotorio.
  • done cierra la conexión con LDAP.
  • errorMessage devuelve una cadena con el mensaje de error para un código de error LDAP.
  • getEntry Obtiene una entrada LDAP a partir de su DN.
  • getLDAPVersion Devuelve la versión de LDAP utilizada en la conexión.
  • getLink Devuelve el descriptor de la conexión.
  • getOption Devuelve el valor de una opción de LDAP.
  • getVersion Devuelve la versión de la clase Net_LDAP2.
  • modify Modifica una entrada directamente sobre el servidor LDAP.
  • move Renombra o mueve una entrada.
  • registerSchemaCache Habilita/desabilita la persistencia en el caché de esquema (schema).
  • rootDse obtiene un objeto rootDSe.
  • root_dse alias de rootDse.
  • schema Obtiene un objeto schema.
  • search Lanza una operación de búsqueda en LDAP.
  • setLDAPVersion Establece la versión LDAP a utilizar en la conexión.
  • setOption Establece el valor de una opción de conexión a LDAP.
  • startTLS Permite una conexión encriptada.
  • start_tls alias de startTLS.
  • utf8Decode Decodifica, si es necesario, los atributos dados.
  • utf8Encode Codifica, si es necesario, los atributos dados.

PEAR: El paquete Net_LDAP2

El paquete Net_LDAP2 nos proporciona una capa que se sitúa por encima de las funciones de manejo de LDAP que trae el PHP, proveyendo de las clases necesarias para manejar con facilidad servidores LDAP. Con esas clases es posible:

- Conectar, buscar entradas y utilizar filtros.

- Soporte de conexiones mediante TLS y versión 3 de LDAP

- Creación, modificación y borrado de entradas.

- Manejo de esquemas (schemas)

lunes, 9 de agosto de 2010

Breve introducción a PEAR

PEAR es un entorno de desarrollo y sistema de distribución de componentes de código PHP. Esta gran biblioteca se estructura en paquetes, abarcando cada uno un ámbito específico. Por ejemplo, el paquete Net_ldap2 proporciona los objetos para la manipulación de entradas LDAP.

El gestor de paquetes de PEAR ya viene integrado en la versión 5 de PHP. Dicho gestor de paquetes se puede invocar desde la línea de comandos

$ pear

Dispone de múltiples opciones que nos permitirán instalar y actualizar paquetes, consultar configuraciones, etc...

Para utilizar PEAR los scrips se invocan mediante require_once(). Para ello debemos asegurarnos que la directiva include_path de PHP incluya el php_dir de PEAR. ¿Cómo nos aseguramos de eso? Pues con las siguientes comprobaciones:

1. ¿Dónde están instalados los archivos php de PEAR?

$ pear config-get php_dir

El directorio resultante debe contener el fichero System.php

2. ¿Cual es el archivo de configuración que utiliza PHP?

$ php --ini
Configuration File (php.ini) Path: /etc/php5/cli
Loaded Configuration File: /etc/php5/cli/php.ini
Scan for additional .ini files in: /etc/php5/cli/conf.d
Additional .ini files parsed: /etc/php5/cli/conf.d/ldap.ini,
/etc/php5/cli/conf.d/pdo.ini,
/etc/php5/cli/conf.d/xdebug.ini

Una buena práctica es crear un fichero phpinfo.php que llame a la función phpinfo(). Dicho fichero lo guardamos en la carpeta de publicación web y lo invocamos mediante un navegador con http://localhost/phpinfo.php, con lo cual nos mostrará la configuración completa del php instalado. La ubicación de el fichero de configuración php.ini vendrá indicado como Loaded Configuration File.

3. Podemos crear otro fichero php, alojado en el mismo lugar que phpinfo.php que nos sirva para comprobar la instalación de PEAR. Este fichero php debe tener las siguientes instrucciones:


require_once 'System.php';
var_dump(class_exists('System'));


Si el resultado al invocarlo desde un navegador web es


bool(true)


significará que todo está correcto. Sin embargo, si aparece algo parecido a


Warning: require_once(System.php): failed to open stream:
No such file or directory in /path/to/check_pear.php on line 2


es que hay algún problema y será necesario revisar la ruta del fichero incluido.
Si en cambio, lo que nos muestra el navegador es una página en blanco, es posible que el servidor web esté configurado para no mostrar los warnings y mensajes de error.