
Desde el comienzo de su tiempo, PHP ha sido famoso (y criticado) por apoyar la integración con una gran cantidad de bibliotecas, así como con casi todos los DBMS en el mercado. Sin embargo, debido a algunas razones extrañas, no admitía bases de datos jerárquicas en globales.
Los globales son estructuras para almacenar información jerárquica. De alguna manera recuerdan la base de datos "clave -> valor", con la única diferencia de que la clave puede ser multinivel:
Set ^inn("1234567890", "city") = "Moscow" Set ^inn("1234567890", "city", "street") = "Req Square" Set ^inn("1234567890", "city", "street", "house") = 1 Set ^inn("1234567890", "year") = 1970 Set ^inn("1234567890", "name", "first") = "Vladimir" Set ^inn("1234567890", "name", "last") = "Ivanov"
En este ejemplo, el lenguaje ObjectScript incorporado en el
^ inn global, que se almacena en el disco duro (indicado por el icono ^ delante del nombre global), almacena información de varios niveles.
Naturalmente, para trabajar con globales de PHP necesitaremos nuevas funciones que serán agregadas por el módulo PHP, que se discutirán a continuación.
Globals admite muchas funciones para trabajar con la jerarquía: omitir las claves en cada nivel por separado, eliminar, copiar y pegar árboles completos y nodos individuales. Bueno, así como cualquier buena base de datos de transacciones ACID. Todo esto sucede extremadamente rápido (aproximadamente 10
5 -10
6 operaciones de inserción por segundo en hardware normal), por dos razones:
- Los globales son una abstracción de nivel más bajo que SQL,
- Las bases globales han estado en producción durante décadas y durante este tiempo lograron lamer su código y optimizarlo a fondo.
Más información sobre los globales en la serie de artículos "Globales - Espadas-Masones para el almacenamiento de datos":
Los arboles. Parte 1Los arboles. Parte 2Matrices dispersas. Parte 3En este mundo, los globales han encontrado su lugar principal de aplicación en sistemas de almacenamiento de información escasa y poco estructurada, como: datos médicos, personales, bancarios, etc.
Me encanta PHP (y desarrollarlo) y quería jugar con los globales. No había un módulo terminado. Escribí a InterSystems pidiéndome que lo creara. La espera no condujo a nada, y al final nosotros (yo, junto con mi estudiante graduado) hicimos el módulo nosotros mismos. InterSystems patrocinó el desarrollo como parte de una subvención educativa.
En términos generales, InterSystems IRIS es un DBMS multimodelo, por lo que desde PHP puede trabajar con él a través de ODBC utilizando SQL, pero estaba interesado en los globales y no existía ese conector.
Entonces, el módulo está disponible para PHP 7.x (probado bajo 7.0-7.2). Actualmente, solo puede funcionar con InterSystems IRIS y Caché instalados en el mismo host.
Página del módulo en OpenExchange (un catálogo de proyectos y complementos para desarrolladores en InterSystems IRIS y Caché).
Hay una sección útil DISCUSS en la que las personas comparten sus experiencias de uso.
Descargue aquí:
https://github.com/intersystems-community/php_ext_iris
Descargue el repositorio desde la línea de comandos:
git clone https://github.com/intersystems-community/php_ext_iris
Instrucciones para instalar el módulo en inglés y ruso.Funciones del módulo:
Si quieres jugar con el módulo tú mismo, entonces:
Especialmente para los usuarios de Habr, se creó un Dockerfile para construir la imagen. git clone https://github.com/intersystems-community/php_ext_iris cd php_ext_iris/iris docker-compose build docker-compose up -d
Prueba de la página de demostración en
localhost: 52080 en el navegador.
Los archivos PHP que se pueden editar y reproducir con ellos están en la carpeta php / demo y se montarán dentro del contenedor.
Para probar IRIS, use el
administrador de inicio de sesión, la contraseña es
SYS .
Para ingresar la configuración de IRIS, use la siguiente URL:
http: // localhost: 52773 / csp / sys / UtilHome.cspPara ingresar a la consola IRIS de este contenedor, use el comando:
docker exec -it iris_iris_1 iris session IRIS
Especialmente para los usuarios de Habr e InterSystems Caché, se levantó la virtualka con módulo php. Para la autoinstalación del módulo en InterSystems Caché- Tener Linux Probé en Ubuntu, en Windows el módulo también debería estar construido, pero no lo probé.
- Descargue la versión gratuita:
- Instale el módulo cach.so en PHP de acuerdo con las instrucciones .
En el contenedor docker de mi computadora personal (AMD FX-9370 @ 4700Mhz 32GB, LVM, SATA SSD), por diversión, hice dos pruebas primitivas sobre la velocidad de inserción de nuevos valores en la base de datos.
- La inserción de 1 millón de elementos nuevos en el global tomó 1.81 segundos o 552K inserciones por segundo.
- Actualizar un valor en el mismo global 1,000,000 de veces tomó 1.98 segundos o 505K actualizaciones por segundo. Un hecho interesante es que ocurre la inserción que la actualización. Aparentemente, esto es una consecuencia de la optimización inicial de la base de datos para una inserción rápida.
Está claro que estas pruebas no pueden afirmar que sean precisas y útiles, ya que son primitivas, hechas en un contenedor. En hardware más potente con un sistema de disco SSD PCIe, se pueden lograr decenas de millones de inserciones por segundo.
Qué se puede completar y el estado actual
- Puede agregar funciones útiles para trabajar con transacciones (aún puede usarlas a través de iris_exec).
- La función de devolver toda la estructura de lo global no está implementada para que PHP no pase por alto lo global.
- La función de guardar la matriz PHP como un subárbol no está implementada.
- El acceso a las variables locales de la base de datos no está implementado. Solo a través de iris_exec, aunque es mejor a través de iris_set.
- No implementado sin pasar por lo global en profundidad en la dirección opuesta.
- No se implementa el acceso a la base de datos a través del objeto utilizando métodos (similares a las funciones actuales).
El módulo actual probablemente aún no esté listo para la producción: no hubo pruebas de cargas altas y pérdidas de memoria. Sin embargo, si alguien lo necesita, contácteme (Sergey Kamenev updates@mail.ru).
Conclusión
Durante mucho tiempo, los mundos de PHP y las bases jerárquicas de los globales prácticamente no se cruzan, aunque los globales proporcionan una funcionalidad fuerte y rápida en tipos de datos específicos (médicos, personales).
Espero que este módulo sirva como un ímpetu para los experimentos de programadores PHP con programadores globales y ObjectScript para el desarrollo simple de interfaces web en PHP.
PD: ¡Gracias por su atención!