Ir para conteúdo
  • Cadastre-se

dev botao

ACBRLIBNFE com PHP 7.4 + FFI


Ver Solução Respondido por Leandro Cavalieri,
  • Este tópico foi criado há 1641 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Olá,

Estamos tentando utilizar a ACBRLIbNFE com a nova classe FFI da versao 7.4 PHP.
 

<?php

$ffi = FFI::cdef('int (NFE_Nome)(const char* sNome, int* esTamanho);', './libacbrnfe64.so');

$nomeBuffer = FFI::new('char[11]');
$nomeTamanhoLength = FFI::new('int');
$nomeTamanhoLength->cdata = 11;

$retorno = $ffi->NFE_Nome($nomeBuffer, FFI::addr($nomeTamanhoLength));

var_dump($retorno);
var_dump($nomeBuffer);

Após a execução do código, a variável $retorno tem o valor -1, e a variável $nomeBuffer está assim:
 

class FFI\CData#2 (11) {
  public ${0} =>
  string(1) "\000"
  public ${1} =>
  string(1) "\000"
  public ${2} =>
  string(1) "\000"
  public ${3} =>
  string(1) "\000"
  public ${4} =>
  string(1) "\000"
  public ${5} =>
  string(1) "\000"
  public ${6} =>
  string(1) "\000"
  public ${7} =>
  string(1) "\000"
  public ${8} =>
  string(1) "\000"
  public ${9} =>
  string(1) "\000"
  public ${10} =>
  string(1) "\000"
}

Alguém pode dar alguma ajuda para executar corretamente esse trecho de código?

Att. 

Postado

Olá Rafael Dias,

Obrigado pelo retorno, tenho algumas questões para serem vistas. como por exemplo:

Quando executo o código em C ele executa normalmente, sem precisar chamar o método NFE_Inicializar, como no exemplo abaixo:
 

#include <iostream>
#include <dlfcn.h>
#include "acbr.h"

#define BUFFER_LEN 15

int main(int argc, char *argv[]) {
    void *lib = dlopen("./libacbrnfe64.so", RTLD_LAZY);

    auto nomeFunction = (NFE_Nome) dlsym(lib, "NFE_Nome");

    char bufferNome[BUFFER_LEN];
    int bufferNomeLength = BUFFER_LEN;

    int retornoNome = nomeFunction(bufferNome, &bufferNomeLength);

    printf("%i - %s\n", retornoNome, bufferNome);

    return 0;
}

 

Postado

so que nesse caso ele tenta inicializar a lib e criar o ini de configuração no path da lib senão tiver permissão para criar arquivo la vai dar erro.

Sem falar que -1 é erro de lib não inicializada.

ErrLibNaoInicializada = -1;

 

  • Solution
Postado

Olá!

Consegui fazer funcionar, obrigado!

Uma questão que notei durante os testes da biblioteca, é que a versão compilada que baixei aqui do site não funcionou de primeira no PHP, ele me retornava um erro estranho. Postei uma pergunta no StackOverflow e quem estava me respondendo lá teve um trabalhão para descobrir o que estava acontecendo, mas conseguimos resolver o problema. Aparentemente, no momento que a biblioteca para Linux foi compilada pelo Lazarus, ele adiciona como a primeira dependência a lib /lib64/ld-linux-x86-64.so.2, e ela exporta uma versão do calloc que não limpa a memória corretamente. A solução que consegui foi adicionar a opção -Cn para omitir a fase de linkagem da biblioteca pelo FPC. Então, editei o arquivo link.res e lá pra baixo no arquivo removi a linha onde estava escrito INPUT(/lib64/ld-linux-x86-64.so.2) e executei o script ppas.sh. Aí ele me gerou o arquivo .so linkado corretamente, só então consegui usar ele no PHP.

Não sei os detalhes corretamente, pois não sou dev nem Pascal nem C, mas os detalhes do problema podem ser encontrados aqui, aqui e aqui.

Essa é uma correção que pode ser feita no projeto para todos as pessoas que baixarem tenham essa versão linkada corretamente, pode ser algum outro problema, ou terei que compilar manualmente minha versão aqui sempre que houver atualizações na ACBRLibNFe?

Att.

  • Curtir 1
  • Obrigado 1
  • 3 meses depois ...
  • Administradores
Postado

Boa tarde.

Relativo a analise desta situação, tivemos este parecer de nosso especialista nas libs @Rafael Dias

Citar

 

O problema é no compiladora hora da linkagem adiciona uma dll chamada ld-linux-x86-64.so.2 quem tem erro em uma função chamada calloc e por isso tem erro no php.

A solução seria usar um linux que tenha esta dll corrigida se houver ou fazer uma compilação sem linkagem editar manualmente o res e ai continuar a compilação

Não temos no momento solução pratica para isso

 

Também foi observado que houveram correções no PFC que resolvem esta situação, porém ainda não estão em release, mas é algo que podemos esperar que em breve possa ser liberado.

https://bugs.freepascal.org/view.php?id=36706

Att.

Consultora SAC ACBr

Juliana Tamizou

Gerente de Projetos ACBr / Diretora de Marketing AFRAC
Ajude o Projeto ACBr crescer - Seja Pro

Projeto ACBr     Telefone:(15) 2105-0750 WhatsApp(15)99790-2976.  Discord

Projeto ACBr - A maior comunidade Open Source de Automação Comercial do Brasil


Participe de nosso canal no Discord e fique ainda mais próximo da Comunidade !!

×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.