nfephp-org / nfephp

PROJETO DEPRECATED use sped-nfe
https://github.com/nfephp-org/sped-nfe
Other
693 stars 688 forks source link

Otimização nas chamadas de funções que pedem o caminho do XML como parâmetro #808

Closed JulianoAmaralChaves closed 8 years ago

JulianoAmaralChaves commented 8 years ago

Olá

Me deparei com uma situação que acredito possa ser melhorada, a situação é a seguinte:

após a chamada da função "sefazEnviaLote()" preciso acrescentar o protocolo no XML para poder imprimir o DANFe, a questão é que a função "addProtocolo()" pede os CAMINHOS do XMLs da NF-e e do protocolo, e é este o ponto, reescrevi a função "addProtocolo()" com o nome de "addProtocoloXML()" e ao invés de pedir os caminhos como parâmetro, a função pede o próprio XML, desta forma não preciso manipular os arquivos em disco e posso fazer todo o procedimento da seguinte forma:

$toolsNFe->sefazEnviaLote($xml, $tpAmb, $idLote, $resposta, $indSinc, $flagZip);

$protXML = $toolsNFe->sefazConsultaRecibo($resposta['nRec'], $tpAmb);

$nfeXML = $toolsNFe->addProtocoloXML($xml, $protXML , false);

Assim eu posso gravar a variavel $nfeXML no banco de dados sendo o XML da NF-e já com o protocolo

essa não é a unica função que pede o CAMINHO como parâmetro, acredito que passar o XML torna mais pratico

Obs.: A nova função "addProtocoloXML()" é uma cópia da função original "addProtocolo()" onde alterei apenas a forma de carregar os XMLs de:

$docnfe->loadXMLFile($pathNFefile); $docprot->loadXMLFile($pathProtfile);

para

$docnfe->loadXMLString($nfeXML); $docprot->loadXMLString($protXML);

caso exista uma outra forma melhor também de se fazer sem a necessidade de ficar gravando e lendo arquivos do disco seria bem vinda

rspadim commented 8 years ago

algo do tipo if(file_exists($nfeXML)) -> loadxmlfile else -> loadxmlstring

robmachado commented 8 years ago

Sim ... é bem possível fazer isso !! não quer propor um "PULL REQUEST" ?

JulianoAmaralChaves commented 8 years ago

Eu não sei muito como propor um "PULL REQUEST", mas acho que consegui, pelo menos foi o que aparentou ter acontecido, caso não tenha conseguido e alguém puder me orientar com faz para criar uma "PULL REQUEST" ficarei grato

tonicospinelli commented 8 years ago

@JulianoAmaralChaves é exatamente o que fez! 👍 PR #809

tonicospinelli commented 8 years ago

@JulianoAmaralChaves só ajustar a identação do código (para seguir o mesmo padrão do que já usamos), como você ainda precisa ajustar, pode colocar no comentário do commit: fix #809

isso fará com que após seu PR seja merged, fecha essa issue 😉

chinnonsantos commented 8 years ago

@JulianoAmaralChaves Isso foi bem inteligente, parabéns, com certeza e bem mais rápido ler variável do quer um I/O no disco para ler o arquivo, considerando que praticamente qualquer aplicação que for utilizar a API vai fazer uso de BD.

Mas particularmente nesse seu código, você esqueceu de considerar o "Tempo médio de resposta do serviço (tMed)" retornado na consulta de Recibo, provavelmente em seu teste não deu falha por que na maior parte do tempo o valor é de 1s (ainda mais se o ambiente for Homologação), mas se ocorrer da WebService esta congestionada e esse tMed for de 5s por exemplo, seu código não vai conseguir protocolar e imprimir a Danfe, e se sua aplicação executar novamente o código vai reenviar o lote e receber um novo recibo, e se esse recibo ainda estiver com tMed alto, não vai conseguir protocolar e imprimir a Danfe novamente é isso se repete até o tMed abaixar para 1s.

sugiro (nesse seu código especifico...) colocar um sleep(tMed) após o envio do lote, evitando assim que a sua consulta de recibo seja mais rápida que a fila de processamento dos servidores da SEFAZ.

Obs: é claro que você vai precisar extrair o valor tMed do XML e só assim informar no parâmetro os segundos...

tonicospinelli commented 8 years ago

@chinnonsantos discordo da sua colocação sobre o sleep, pois essa biblioteca não deveria fazer este tipo de tratamento (isso pode ser facilmente resolvido com rotinas de cron ou fila)

a meu ver, sleep é um recurso que nunca deveria ser usado para este tipo de rotina, é mais seguro seguimentar a comunicação ou fazer isso de forma encadeada (tipo, já gerei a nfe e agora posso protocolar)

@robmachado estou falando besteira?

robmachado commented 8 years ago

Não Antonio sua colocação está CORRETISSIMA Não existe nenhum local em toda a API que poderia ser usado um comando sleep() !! Não podem existir invocações ou chamadas concatenadas em uma API isso é tarefa do APLICATIVO que usar a API.

chinnonsantos commented 8 years ago

Linha 12 do meu comentário => 'sugiro (nesse seu código especifico...)...'

é obvio que isso é uma página de teste com todos os métodos para emitir a NF-e em sequência, ninguém colocar isso em produção... e logicamente ninguém vai fazer um Pull Request disso também... ¬¬'

robmachado commented 8 years ago

Isso já está incluso no método addProtocol() podendo receber como parametro tanto um arquivo como uma string com o xml.