PHP: Error JSON

Se tiene un servidor con PHP 5.5 (por temas de incompatibilidad de las aplicaciones no se puede hacer un upgrade mayor a PHP 5.6).

Se agrego un campo de tipo JSON a una tabla que se encuentra en una base de datos MySQL.

Repentinamente se tiene algunos mensajes de error:

  • Commands out of sync; you can’t run this command now.
  • Warning: mysql_query(): Unknown type 245 sent by the server. Please send a report to the developers in …

La causa:

Existe un error de compatibilidad de campos de tipo JSON hasta la versión de PHP 5.5.38

Las soluciones:

  • Cambiar el tipo del campo JSON por TEXT.
  • Realizar un upgrade a la version PHP 5.6

Apache: KeepAlive On

apache_logo

Un caso de estudio

El servidor

  • Centos 6.
  • Apache.
  • PHP 5.6

Los clientes

  • MAC OS.
  • Windows.

El problema:

Se tiene una aplicacion en PHP sin frameworks mas que uno que otro generador, tablas, formularios, etc.

Cuando dos clientes (en la misma red) con SO MAC OS intentan ingresar a la aplicacion, esta responde correctamente al primer cliente pero con el segundo, se bloquea, y se pone tremendamente lenta, no se corta solo que la carga se pone demasiada lenta. Para los clientes Windows funciona correctamente

Despues de hacer varias pruebas en los clientes, desactivando caches, definiendo DNSs, probando con el TTFB, etc. Se intuye que el problema esta en el servidor.

Revisando la configuracion de Apache, se observa que el parametro KeepAlive  (la misma aplicacion corre en varios servidores y todos los servidores tienen la misma configuracion), se encuentra desactivado, se procede a encender la opcion y… funciona, todo solucionado.

KeepAlive Off

Captura de pantalla 2018-02-19 a las 22.31.45.png

KeepAlive On

Captura de pantalla 2018-02-19 a las 22.33.41.png

 

Ruby on Rails: Simple Form, remover opción nula

Explicando un poco lo que sucede, si bien se tiene una colección de registro en un arreglo por ejemplo:

options = ["option1", "option2", "option3"].

Luego se genera el elemento en la vista:

= f.input :options_selected, as: :select, include_blank: false, collection: options, input_html: {multiple: true}

Si los elementos seleccionados son option1 y option3, la manera en que se almacena es:

["", "option1", "option3"]

Aun cuando se incluyo la opción include_blank se tiene un elemento nulo. Para solucionar esto es necesario agregar una opción mas, include_hidden, y el elemento seria:

= f.input :options_selected, as: :select, include_blank: false, include_hidden: false, collection: options, input_html: {multiple: true}

Y cuando se guarden las mismas opciones se almacenara sin el elemento nulo:

["option1", "option3"]

Tips: Ajustar las horas (PHP, MySQL, Servidor)

time

Este es un punto que la mayoría pasa por alto, en el mejor de los casos se configura la sección de timezones en PHP y ahí termina el asunto.

Para que no existan discrepancias en los registros es necesario sincronizar los tres aspectos,  ya que cada uno maneja su propio registro de tiempo.

  • PHP
  • MySQL
  • El Servidor.

El Servidor

En primer lugar para saber la fecha y la zona horaria en la que se encuentra el servidor ejecutamos lo siguiente en la consola:

date

Dependiendo del SO la manera de cambiar la fecha y zona horaria varia (no mucho) pero una herramienta útil es usar NTP (Network Time Protocol) para definir este aspecto, la mayoría por no decir todos los SO y sus respectivas distribuciones tienen paquetes para su instalación y uso.

PHP

Para ver la fecha actual se maneja la función date, por ejemplo:

<?php
    echo date('D M j G:i:s T Y');
?>

*Pero ojo que la función date devolvería la fecha del cliente y no del servidor.

Para definir la zona horaria se modifica el archivo php.ini en la directriz timezones:

...
date.timezone = America/New_York
...

MySQL

En primer lugar verificar la zona horaria y fecha en la que se encuentra MySQL, mediante una consulta:

SELECT NOW();

Y finalmente definir la fecha:

SET GLOBAL time_zone = America/New_York;

Mas info: MySQL Server Time Zone Support