
Desde o início de seu tempo, o PHP é famoso (e criticado) por oferecer suporte à integração com uma série de bibliotecas, bem como com praticamente todos os DBMSs do mercado. No entanto, devido a algumas razões estranhas, ele não suportava bancos de dados hierárquicos em globais.
Globais são estruturas para armazenar informações hierárquicas. Eles lembram um pouco o banco de dados "chave -> valor", com a única diferença de que a chave pode ter vários níveis:
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"
Neste exemplo, a linguagem ObjectScript incorporada no global
^ inn , que é armazenada no disco rígido (indicado pelo ícone ^ na frente do nome global), armazena informações em vários níveis.
Naturalmente, para trabalhar com globais do PHP, precisaremos de novas funções que serão adicionadas pelo módulo PHP, que serão discutidas abaixo.
Globals suportam muitas funções para trabalhar com hierarquia: ignorando chaves em cada nível separadamente, excluindo, copiando e colando árvores inteiras e nós individuais. Bem, assim como qualquer bom banco de dados de transações ACID. Tudo isso acontece com extrema rapidez (cerca de 10
5 a 10
6 operações de inserção por segundo no hardware comum), por dois motivos:
- Globals são uma abstração de nível inferior ao SQL,
- As bases globais estão em produção há décadas e, durante esse período, conseguiram lamber seu código e otimizá-lo completamente.
Mais sobre globais na série de artigos “Globals - espadas-pedreiros para armazenamento de dados”:
As árvores Parte 1As árvores Parte 2Matrizes esparsas. Parte 3Neste mundo, os globais encontraram seu principal local de aplicação em sistemas de armazenamento de informações pouco estruturadas e esparsas, como: médicos, dados pessoais, bancos, etc.
Eu amo PHP (e desenvolvo isso) e queria brincar com os globais. Não havia módulo finalizado. Escrevi para a InterSystems pedindo para criá-lo. A espera não levou a nada e, no final, nós (juntamente com meu aluno de graduação) fizemos o módulo. A InterSystems patrocinou o desenvolvimento como parte de uma concessão educacional.
De maneira geral, o InterSystems IRIS é um DBMS de vários modelos, portanto, do PHP, você pode trabalhar com ele através do ODBC usando SQL, mas eu estava interessado em globais, e não havia esse conector.
Portanto, o módulo está disponível para o PHP 7.x (testado sob 7.0-7.2). Atualmente, ele só pode funcionar com o InterSystems IRIS e Caché instalado no mesmo host.
Página do módulo no OpenExchange (um catálogo de projetos e complementos para desenvolvedores no InterSystems IRIS e Caché).
Há uma seção de discussão útil na qual as pessoas compartilham suas experiências de uso.
Faça o download aqui:
https://github.com/intersystems-community/php_ext_iris
Faça o download do repositório na linha de comando:
git clone https://github.com/intersystems-community/php_ext_iris
Instruções para instalar o módulo em inglês e russo.Funções do módulo:
Se você quiser jogar com o módulo, então:
Especialmente para usuários do Habr, um Dockerfile foi criado para criar a imagem. git clone https://github.com/intersystems-community/php_ext_iris cd php_ext_iris/iris docker-compose build docker-compose up -d
Testando a página de demonstração no
localhost: 52080 no navegador.
Os arquivos PHP que podem ser editados e reproduzidos com eles estão na pasta php / demo e serão montados dentro do contêiner.
Para testar o IRIS, use o nome de usuário
admin , a senha é
SYS .
Para inserir as configurações do IRIS, use o seguinte URL:
http: // localhost: 52773 / csp / sys / UtilHome.cspPara entrar no console IRIS deste contêiner, use o comando:
docker exec -it iris_iris_1 iris session IRIS
Especialmente para usuários de Habr e InterSystems Caché, a virtualka com módulo php foi levantada. Para auto-instalação do módulo no InterSystems Caché- Tenha Linux. Eu testei no Ubuntu, no Windows o módulo também deve ser construído, mas não o testei.
- Baixe a versão gratuita:
- Instale o módulo cach.so no PHP de acordo com as instruções .
No contêiner do docker do meu computador pessoal (AMD FX-9370 @ 4700Mhz 32GB, LVM, SATA SSD), por diversão, fiz dois testes primitivos sobre a velocidade de inserção de novos valores no banco de dados.
- A inserção de 1 milhão de novos elementos no global levou 1,81 segundo ou 552 mil inserções por segundo.
- A atualização de um valor no mesmo 1.000.000 vezes global levou 1,98 segundos ou 505K atualizações por segundo. Um fato interessante é que ocorre a inserção do que a atualização. Aparentemente, isso é uma consequência da otimização inicial do banco de dados para inserção rápida.
É claro que esses testes não podem ser precisos e úteis, pois são primitivos, feitos em um contêiner. Em um hardware mais poderoso com um sistema de disco SSD PCIe, é possível obter dezenas de milhões de inserções por segundo.
O que pode ser concluído e o estado atual
- Você pode adicionar funções úteis para trabalhar com transações (você ainda pode usá-las através do iris_exec).
- A função de retornar toda a estrutura do global não é implementada para que o PHP não ignore o global.
- A função de salvar a matriz PHP como uma subárvore não está implementada.
- O acesso às variáveis locais do banco de dados não está implementado. Somente através do iris_exec, embora seja melhor através do iris_set.
- Não implementado ignorando o global em profundidade na direção oposta.
- O acesso ao banco de dados através do objeto usando métodos (semelhantes às funções atuais) não é implementado.
O módulo atual provavelmente ainda não está pronto para produção: não houve testes para altas cargas e vazamentos de memória. No entanto, se alguém precisar, entre em contato comigo (Sergey Kamenev updates@mail.ru).
Conclusão
Por um longo tempo, os mundos do PHP e as bases hierárquicas em globais praticamente não se cruzaram, embora os globais proporcionem funcionalidade forte e rápida em tipos de dados específicos (médicos, pessoais).
Espero que este módulo sirva de incentivo para experimentos de programadores PHP com globais e programadores ObjectScript para o desenvolvimento simples de interfaces da Web em PHP.
PS Obrigado por sua atenção!