martes, 16 de septiembre de 2014

MSSQL vs sqlsrv

El controlador de SQL Server para PHP (también llamado el " sqlsrv conductor "para él es prefijo API) ha estado disponible desde julio de 2008, pero todavía a menudo ver el conductor" viejo "(el" mssql driver ") que se utiliza para conectarse a SQL Server desde scripts PHP. Muchos de los tutoriales que me encuentro y muchas de las preguntas que veo en los foros indico que muchas personas siguen utilizando el driver mssql a pesar de que ya no está bajo desarrollo activo . En este post quiero empezar a mirar algunas de las diferencias entre los dos drivers y tal vez obtener una comprensión de por qué el driver mssql sigue siendo utilizado (aunque tengo algunas buenas conjeturas). Hay un montón de puntos de comparación entre los mssql y SQLSRV conductores. Voy a romper mi comparación en dos puestos, centrándose en las diferencias de alto nivel en este post y luego sumerjo en una comparación API en el próximo post.

Voy a empezar por decir lo obvio: los mssql y SQLSRV conductores no son una y la misma. Lo sentimos, pero en realidad creo que necesitaba ser declarado explícitamente. Seguramente me estoy recogiendo las liendres, pero a menudo ver mssql y sqlsrv utilizan indistintamente, o al menos eso es lo que creo que veo. Tal vez la gente está utilizando mssql como una forma abreviada de Microsoft SQL Server y no el propio controlador (o tal vez estoy confundido fácilmente), pero la confusión hace que me pregunto si las personas son realmente conscientes de las diferencias clave:

  • El driver sqlsrv está construida, mantenida, y soporte de Microsoft. Ha habido dos versiones del controlador (v1.0 y v1.1), así como actualizaciones acumulativas para liberar mejoras. Las diferentes versiones de los archivos binarios (dependiendo de la versión de PHP está ejecutando) están disponibles aquí: controlador de SQL Server para PHP 1.1 . El código fuente está disponible en CodePlex en http://sqlsrvphp.codeplex.com/ . 
  • El driver mssql es un controlador integrado en la comunidad. No estoy seguro de cuánto tiempo hace que este controlador se actualiza o se mantiene como una extensión oficial de PHP, pero a partir de la liberación de PHP 5.3 , ya no está disponible con PECL . Una búsqueda rápida en internet aparecen pocos lugares para descargar el mssql conductor, pero ninguno de los que he encontrado indican que el conductor se mantiene activa.

Las tecnologías subyacentes para los dos pilotos son diferentes. (Ver diagrama 1.)

o    El sqlsrv conductor se basa en ODBC, que se mantiene activa por Microsoft y proporciona acceso a las características de las últimas versiones de SQL Server.

o    El mssql conductor se basa en DB Lib (es decir, que requiere ntwdblib.dll ) si está ejecutando PHP en Windows. DB Lib ya no es compatible con Microsoft
 
o    Si está ejecutando PHP en Linux, el mssql controlador está integrado en FreeTDS .

Este último punto nos lleva a una última diferencia importante: el mssql conductor hace proporcionar conectividad a SQL Server desde Linux . Dicho esto, parece que Microsoft está considerando el soporte ODBC en plataformas que no son de Microsoft, lo que equivale al apoyo a la sqlsrv controlador de Linux. Ver uno de mis posts anteriores para obtener más información: Conexion de Linux a SQL


Esas son las diferencias de alto nivel entre el mssql y SQLSRV controladores .Si está utilizando el mssql controlador en Windows, estaría interesado en comprender por qué (en contraposición a la sqlsrv conductor).

domingo, 7 de septiembre de 2014

Uso del memory limit en php

La forma más usual de ejecutar un script PHP es mediante algún navegador aunque también se puede ejecutar por shell. Ambos se ven afectados por el tiempo de ejecución del script. Además, dependiendo del servidor desde el que lo ejecutamos, tenemos que tener en cuenta la cantidad de memoria que vamos a usar. Y aún tenemos más cosas... No todos los tipos de error están configurados para mostrarse. Puede que el servidor tenga configurado mostrar sólo los errores importantes y los que él considera sólo alertas no nos van a aparecer... 
En éste artículo voy a intentar explicar tres instrucciones muy útiles para controlar la ejecución de un script PHP: set_time_limit(), ini_set('memory_limit') y el error_reporting().

El límite de tiempo de proceso de un script php
Todo script PHP ocupa un tiempo de proceso del servidor al ejecutarse. Ése tiempo por defecto es 30 segundos, pero puede configurarse otro valor en la variable max_execution_time en el archivo de configuración (php.ini). El problema es que si no tienes el servidor en casa no será tan fácil acceder a ésa variable, pues los hostings acostumbran a fijar ellos un tiempo prudencial y no tienes acceso para configurar nada.
Pero podemos fijar un tiempo límite distinto al que venga por defecto usando la instrucción set_time_limit(). Esta función la debemos incluir al principio del script y acepta un parámetro numérico con el que indicaremos el número de segundos que debe esperar. Por ejemplo podemos usar:

PHP:
set_time_limit(300);

Con ésto definiremos que espere 5 minutos (60 secs * 5 min = 300 secs). 
También podemos definir que no haya tiempo límite:

PHP:
set_time_limit(0);

Aunque no es nada aconsejable, pues si el script contiene algun error o realiza alguna llamada externa que pueda tener dificultades, el servidor nunca lo detendrá.
Pero aún hay más. Realmente lo que hace ésta instrucción es resetear el contador de tiempo de proceso a zero y instaurar un nuevo límite. Si tenemos el límite de tiempo por defecto a 30 segundos y llamamos a set_time_limit(30) cuando llevamos 25 segundos de ejecución, en total el script podrá tardar 55 segundos (25 secs + 30 secs = 55 secs).
Por último, esta función no se ejecutará en un entorno dónde el PHP se esté ejecutando en modo seguro, forma en que muchos hostings baratos ejecutan los scripts por compartir muchos usuarios en el mismo servidor.
Podéis encontrar más información en el manual online de PHP: set_time_limit().

Límite de memoria usado por un script

Al igual que el tiempo de proceso, hay definido un límite de memoria en el archivo de configuración bajo la variable memory_limit, pero tampoco tendremos acceso a éste en un hosting normal. Además, en los hostings acostumbran a configurar un límite de memoria bastante bajo, como por ejemplo DreamHost y Arsys que lo tienen a 8 MegaBytes.
El problema es que con el uso de objetos y clases en PHP y varios requires enlazados ése límite es rápidamente sobrepasado. Además, si estamos trabajando con un script que maneja gran cantidad de datos, 8 megas es realmente poco.
De todas formas tenemos una función que varía ciertas variables iniciales y, gracias a ella, podemos ajustar el límite de memoria del script actual al valor que necesitemos: el ini_set(). Ésta función varía el parámetro especificado sólo durante la ejecución del mismo, y al acabar restaurará el valor por defecto. Para aumentar el límite de memoria a 64 MB debemos usar la función de la siguiente manera:


PHP:
ini_set('memory_limit','64M');

Con ésto al principio del script estaremos setando el límite de memoria a 64 para el script actual. Se debe tener especial cuidado en la M que sigue al 64, que especifica que la unidad es MegaBytes. Si no la ponemos, se va a tomar como Bytes, y éso es tan poco que puede que PHP no tenga suficiente memoria ni para mostrar un error de exceso de memoria