PHPackages                             willkerms/nfs-e - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. [Utility &amp; Helpers](/categories/utility)
4. /
5. willkerms/nfs-e

ActiveLibrary[Utility &amp; Helpers](/categories/utility)

willkerms/nfs-e
===============

Nota Fiscal Eletronica de Servico

53524[1 issues](https://github.com/willkerms/NFSe/issues)[1 PRs](https://github.com/willkerms/NFSe/pulls)PHPCI failing

Since Feb 16Pushed 1mo ago3 watchersCompare

[ Source](https://github.com/willkerms/NFSe)[ Packagist](https://packagist.org/packages/willkerms/nfs-e)[ RSS](/packages/willkerms-nfs-e/feed)WikiDiscussions master Synced today

READMEChangelogDependenciesVersions (8)Used By (0)

willkerms/nfs-e
===============

[](#willkermsnfs-e)

Biblioteca PHP para emissão e gestão de **NFS-e (Nota Fiscal de Serviço Eletrônica)** no Brasil.

Cobre a assinatura digital dos XMLs (XML-DSig), a comunicação com os WebServices das prefeituras (SOAP ou cURL) e o parsing dos retornos. O destaque é a classe **`NFSeGenerico`**, um motor **dirigido por templates** capaz de falar com diversas prefeituras (padrões ABRASF e Nacional/DPS) **sem alterar o código-fonte** — basta apontar/editar um conjunto de templates XML e ajustar a configuração.

---

Índice
------

[](#índice)

- [Requisitos e instalação](#requisitos-e-instala%C3%A7%C3%A3o)
- [Conceitos](#conceitos)
- [Estrutura do projeto](#estrutura-do-projeto)
- [A classe base `NFSe`](#a-classe-base-nfse)
- [`NFSeGenerico` — o motor genérico](#nfsegenerico--o-motor-gen%C3%A9rico)
    - [Por que um motor por templates](#por-que-um-motor-por-templates)
    - [Construtor e configuração (`$aConfig`)](#construtor-e-configura%C3%A7%C3%A3o-aconfig)
    - [Certificado digital](#certificado-digital)
    - [O mini-engine de templates](#o-mini-engine-de-templates)
    - [Pacotes de templates (prefeituras)](#pacotes-de-templates-prefeituras)
    - [Operações disponíveis](#opera%C3%A7%C3%B5es-dispon%C3%ADveis)
    - [Modelo de objetos de entrada](#modelo-de-objetos-de-entrada)
    - [Formato do retorno](#formato-do-retorno)
    - [Como adicionar uma nova prefeitura](#como-adicionar-uma-nova-prefeitura)
- [Implementações legadas (Ginfes, ISSWeb, Sigep)](#implementa%C3%A7%C3%B5es-legadas-ginfes-issweb-sigep)
- [Exemplos completos](#exemplos-completos)
- [Licença e autoria](#licen%C3%A7a-e-autoria)

---

Requisitos e instalação
-----------------------

[](#requisitos-e-instalação)

RequisitoVersãoPHP`>= 5.5` (recomenda-se 7.4+; o padrão Nacional/DPS usa *union types*, que exigem **PHP 8.0+**)Extensões`openssl`, `soap`, `curl`, `dom`, `libxml`, `mbstring`, `iconv`Dependência[`willkerms/pqd`](https://packagist.org/packages/willkerms/pqd) (utilitários, inclui o engine de templates)```
composer require willkerms/nfs-e
```

Autoload PSR-4 (`NFSe\`) + classmap das pastas `generico/`, `sigep/`, `issweb/`, `ginfes/` (configurado no `composer.json`).

> A biblioteca usa a constante global `IS_DEVELOPMENT`. Quando `true`, o `SoapClient` é criado com `trace`/`exceptions` ativos e sem cache de WSDL. Defina-a no *bootstrap* da sua aplicação (`define('IS_DEVELOPMENT', false);`) antes de instanciar as classes.

---

Conceitos
---------

[](#conceitos)

A NFS-e é um documento municipal: **cada prefeitura** publica seu próprio WebService, layout de XML e regras. Historicamente, a maioria seguia o padrão **ABRASF** (com pequenas variações por cidade); a partir da reforma tributária surge o **padrão Nacional**, baseado no **DPS** (*Declaração de Prestação de Serviços*) e com os tributos **IBS/CBS**.

Esta biblioteca aborda os dois cenários:

- **Modelo por templates (`NFSeGenerico`)** — abstrai a montagem do XML e a comunicação. Indicado para integrar novas prefeituras rapidamente: você descreve o XML em um template e configura o transporte.
- **Implementações específicas legadas** (`ginfes/`, `issweb/`, `sigep/`) — classes "à mão" para padrões/cidades específicas, anteriores ao motor genérico.

Independentemente do caminho, o fluxo é sempre:

```
monta XML  →  assina (XML-DSig)  →  embrulha no envelope SOAP (se aplicável)  →  transmite  →  faz parsing do retorno

```

---

Estrutura do projeto
--------------------

[](#estrutura-do-projeto)

```
nfs-e/
├── NFSe.php              # Classe base: certificado, assinatura XML-DSig, SOAP/cURL
├── NFSeDocument.php      # DOMDocument com helper getValue()
├── NFSeElement.php       # DOMElement (registro de nó)
├── NFSeReturn.php        # Base de parsing de retorno (detecção de SOAP Fault)
├── generico/             # >>> Motor genérico (NFSeGenerico) + DTOs  Os métodos do **padrão Nacional** esperam chaves adicionais nesta lista, resolvidas no mesmo pacote: `cancelarNFSeEnvio`, `consultarLoteDpsEnvio`, `consultarNfseDpsEnvio`, `enviarLoteDpsEnvio`, além dos parciais usados na montagem do DPS — `documentoDocDedRed`, `itemPed`, `refNfse`, `documentoReeRepRes`.

#### `metodos` — configuração por operação

[](#metodos--configuração-por-operação)

Cada operação tem um sub-array. **Chaves comuns:**

ChaveDescrição`action`Nome da operação / `SOAPAction` chamada no WebService.`typeCommunication``'soap'` (default) ou `'curl'`.`actionSoapHeader``SOAPAction` enviado no cabeçalho, quando difere de `action`.`nameSpace`Prefixo de namespace usado na tag `` (ex.: `'ds:'`; vazio = sem prefixo).`tagSign`Tag cujo conteúdo é **assinado** digitalmente.`tagAppend`Tag sob a qual a `` gerada é **anexada**.`tagMap.return`Tag externa da resposta de onde o XML de retorno é extraído.`tagMap.*`Tags adicionais por operação: `tagResposta`, `respostaLote`, `respostaConsultaLote`.`signConsulta` / `signRps` / `signDps`Liga/desliga a assinatura nas consultas, nos RPS de lote ou nos DPS de lote.`returnType``'child'` (default) ou `'string'` (quando o payload vem como texto/CDATA e precisa ser reparseado).`returnReplace``['search'=>…, 'replace'=>…]` aplicado ao texto antes de reparsear (usado com `returnType = 'string'`).`replaceXmlSOAP`Substituições extras no envelope SOAP (prefeituras com mais de um `action`).`search` / `replace`Strings normalizadas no XML **antes de assinar** (evita invalidar a assinatura).`allowCancel`(cancelamento) `false` ⇒ não transmite e devolve um retorno simulado de "cancelado".`codCancelamento`(cancelamento) Código padrão (`1` = Erro na emissão).Defaults relevantes por operação:

Operação`action``tagSign``tagAppend``gerarNfse``gerarNfse``InfDeclaracaoPrestacaoServico``Rps``enviarLoteRps``RecepcionarLoteRps``LoteRps``EnviarLoteRpsEnvio``consultarNFSePorRps``consultarNfseRps``Pedido``ConsultarNfseRpsEnvio``consultarNFSePorDps``consultarNfseDps``Pedido``ConsultarNfseDpsEnvio``consultarLoteRps``ConsultarLoteRps`——`consultarUrlNfse``ConsultarUrlNfse``Pedido``ConsultarUrlNfseEnvio``cancelarNfse``cancelarNfse``InfPedidoCancelamento``Pedido`#### `fields` — transformações de campo (opcional)

[](#fields--transformações-de-campo-opcional)

Funções aplicadas a um campo antes de ele ir para o template (`applyFnField`). A chave é o nome do campo em *camelCase* (o placeholder `{@DataEmissao}` corresponde a `dataEmissao`):

```
'fields' => [
    'dataEmissao' => [
        'fn'   => 'substr',     // função PHP chamada sobre o valor
        'args' => [0, 10],      // argumentos extras (o valor do campo é sempre o 1º)
    ],
],
```

### Certificado digital

[](#certificado-digital)

Há dois jeitos de informar o certificado no `$aConfig`:

**1. Direto, a partir de um `.pfx`/`.p12`** — a biblioteca gera os PEMs temporários e os apaga no destrutor:

```
$aConfig['pfx']    = '/caminho/certificado.pfx';  // conteúdo carregado com file_get_contents internamente
$aConfig['pwdPFX'] = 'senha-do-certificado';
$aConfig['cnpj']   = '00000000000000';            // usado como prefixo do nome dos PEMs temporários
```

**2. Apontando PEMs já existentes:**

```
$aConfig['privKey'] = '/caminho/priKEY.pem';
$aConfig['pubKey']  = '/caminho/pubKEY.pem';
$aConfig['certKey'] = '/caminho/certKEY.pem';
```

### O mini-engine de templates

[](#o-mini-engine-de-templates)

Os templates são XML com dois tipos de marcação, resolvidos por `PQDUtil::procTplText`:

MarcaçãoSignificado`{@variavel}`Substituída pelo valor correspondente.`{@ifAlgo} … {@endifAlgo}`Bloco mantido se a condição for verdadeira; removido caso contrário.`{@ifAlgo} … {@elseAlgo} … {@endifAlgo}`Forma com *else*.As **variáveis** e as **condições** (`bool`) são preenchidas pela `NFSeGenerico` a partir dos objetos de entrada (ex.: decidir CPF × CNPJ pelo comprimento, incluir um bloco só quando o campo opcional existe, etc.). Quem escreve o template apenas posiciona os placeholders.

Exemplo (trecho de `Rps.xml`):

```

        {@ValorServicos}
        {@ifValorDeducoes}{@ValorDeducoes}{@endifValorDeducoes}
        {@ifAliquota}{@Aliquota}{@endifAliquota}

    ...

```

Envelope SOAP (`Soap.xml`) — recebe o XML já montado/assinado em `{@xml}` e a operação em `{@action}`:

```

      {@xml}

```

### Pacotes de templates (prefeituras)

[](#pacotes-de-templates-prefeituras)

Cada pasta em `templates/` é um pacote. Selecione com `templates.folder`. Já acompanham a biblioteca:

PacotePadrão / observação`abrasf-v2.4`Referência ABRASF 2.04 (RPS).`coplan-v1`, `coplan-br-v1`Provedor Coplan (ABRASF e DPS).`fiorilli-ro-v2-01`, `fiorilli-br-v1`Provedor Fiorilli (ABRASF e DPS).`notacontrol-go-v1`, `notacontrol-br-v1`Provedor NotaControl (ABRASF e DPS).`megasoft-go-v1`Provedor Megasoft.`prefGoiania-v1`Prefeitura de Goiânia.`saatri-ba-v2-01`Provedor Saatri.> Pacotes com sufixo `-br` contêm os templates do **padrão Nacional (DPS)**; os demais são variações **ABRASF (RPS)**.

### Operações disponíveis

[](#operações-disponíveis)

**Padrão ABRASF (RPS):**

MétodoParâmetroDescrição`gerarNfse(NFSeGenericoInfRps|NFSeGenericoInfDPS $oRps)`RPS ou DPSGera uma NFS-e a partir de um RPS (ABRASF) ou DPS (Nacional).`enviarLoteRps(array $aRps, NFSeGenericoLoteRps $oLote)`Lista de RPS + loteEnvia um lote de RPS.`consultarNFSePorRps(NFSeGenericoIdentificacaoRps $o)`Identificação do RPSConsulta a NFS-e correspondente a um RPS.`consultarLoteRps(NFSeGenericoConsultarLote $o)`ProtocoloConsulta um lote pelo protocolo.`consultarUrlNfse(NFSeGenericoConsultarUrlNfse $o)`FiltrosConsulta a URL pública / links da NFS-e.`cancelarNfse(NFSeGenericoCancelarNfseEnvio $o)`Dados do cancelamentoCancela uma NFS-e.**Padrão Nacional (DPS / IBS-CBS):**

MétodoParâmetroDescrição`gerarNfseEnvio(NFSeGenericoInfDPS $oDps)`DPSAtalho para `gerarNfse()` com um DPS.`enviarLoteDpsEnvio(array $aDps, $numeroLote)`Lista de DPSEnvia um lote de DPS.`consultarNfseDpsEnvio($numDPS, $serieDPS, $protocolo = null)`Nº/série do DPSConsulta NFS-e por DPS.`consultarNFSePorDps(NFSeGenericoConsultarNfseDps $o)`Identificação do DPSConsulta NFS-e por DPS (objeto).`consultarLoteDpsEnvio($protocolo)`ProtocoloConsulta lote de DPS pelo protocolo.`cancelarNFSeEnvio($chNFSe, $nPedRegEvento, $tpEvento = '101101', $xMotivo = null)`Chave + eventoCancela NFS-e por evento.**Utilitários:**

MétodoDescrição`getConfig($key = null, $default = null)`Lê a configuração efetiva (toda, ou uma chave específica).`getIsHomologacao()`Indica o ambiente atual.Todas as operações retornam o *array* produzido por `NFSeGenericoReturn` (ver abaixo).

### Modelo de objetos de entrada

[](#modelo-de-objetos-de-entrada)

**RPS (ABRASF)** — `NFSeGenericoInfRps` agrega os DTOs do serviço:

```
NFSeGenericoInfRps
├── IdentificacaoRps        (NFSeGenericoIdentificacaoRps: Numero, Serie, Tipo)
├── DataEmissao, Competencia, Status, NaturezaOperacao, OptanteSimplesNacional, ...
├── RpsSubstituido          (NFSeGenericoIdentificacaoRps)
├── Servico                 (NFSeGenericoServico)
│   ├── Valores             (NFSeGenericoValores: ValorServicos, Aliquota, ValorIss, ...)
│   ├── ItemListaServico, CodigoCnae, Discriminacao, CodigoMunicipio, IssRetido, ExigibilidadeISS, ...
├── Prestador               (NFSeGenericoPrestador: CpfCnpj, InscricaoMunicipal)
├── Tomador                 (NFSeGenericoTomador)
│   ├── IdentificacaoTomador (CpfCnpj, InscricaoMunicipal)
│   ├── RazaoSocial, Endereco (NFSeGenericoEndereco), Contato (NFSeGenericoContato)
├── IntermediarioServico    (NFSeGenericoIntermediarioServico)
├── ConstrucaoCivil         (NFSeGenericoConstrucaoCivil: CodigoObra, Art)
├── Evento                  (NFSeGenericoEvento)
└── aDeducoes[]             (NFSeGenericoDeducao)

```

**DPS (Nacional)** — `NFSe\generico\nfseNacional\NFSeGenericoInfDPS` agrega os grupos do padrão nacional:

```
NFSeGenericoInfDPS
├── tpAmb, dhEmi, verAplic, serie, nDPS, dCompet, tpEmit, cLocEmi, ...
├── subst    (NFSeGenericoSubstituicao)        # NFS-e substituída
├── prest    (NFSeGenericoPrest)               # prestador (+ regTrib)
├── toma     (NFSeGenericoToma)                # tomador
├── interm   (NFSeGenericoInterm)              # intermediário
├── serv     (NFSeGenericoServ)               # serviço (locPrest, cServ, comExt, obra, atvEvento, infoCompl)
├── valores  (NFSeGenericoDPSValores)         # valores, descontos, deduções, tributação municipal/federal
└── IBSCBS   (NFSeGenericoIBSCBS)             # grupo IBS/CBS (reforma tributária)

```

### Formato do retorno

[](#formato-do-retorno)

As operações devolvem *arrays* associativos. As mensagens vêm como objetos `NFSeGenericoMensagemRetorno` (`Codigo`, `Mensagem`, `Correcao`, `IdDPS`) e as notas como `NFSeGenericoInfNFSe` (`Numero`, `CodigoVerificacao`, `DataEmissao`, `Url`, `Servico`, `PrestadorServico`, `TomadorServico`, ...).

OperaçãoEstrutura do retorno`gerarNfse``['ListaMensagemRetorno' => [...], 'ListaNfse' => ['CompNfse' => [InfNFSe...], 'ListaMensagemAlertaRetorno' => [...]]]``enviarLoteRps``['NumeroLote', 'DataRecebimento', 'Protocolo', 'ListaNfse', 'ListaMensagemRetorno', 'ListaMensagemRetornoLote']``consultarNFSePorRps``['ListaMensagemRetorno' => [...], 'CompNfse' => InfNFSe]``consultarLoteRps``['Situacao', 'ListaNfse', 'ListaMensagemRetorno', 'ListaMensagemRetornoLote']``consultarUrlNfse``['ListaMensagemRetorno' => [...], 'ListaLinks' => [['NumeroNfse', 'CodigoVerificacao', 'Url', 'UrlAutenticidade'], ...]]``cancelarNfse``['ListaMensagemRetorno' => [...], 'RetCancelamento' => ['NfseCancelamento' => [...]]]`Regra prática: uma operação **deu certo** quando `ListaMensagemRetorno` está vazia e o bloco de dados esperado (`ListaNfse`, `CompNfse`, etc.) foi preenchido. SOAP *Faults* e respostas fora do formato esperado também são convertidos em entradas de `ListaMensagemRetorno`.

### Como adicionar uma nova prefeitura

[](#como-adicionar-uma-nova-prefeitura)

1. **Crie um pacote** em `templates//` (copie um pacote próximo como base).
2. **Ajuste os templates** (`Rps.xml`/`DPS.xml`, `GerarNfseEnvio.xml`, `Soap.xml`, consultas, cancelamento) para o layout exato da prefeitura — usando os placeholders `{@...}` e os blocos `{@if...}`.
3. **Monte o `$aConfig`** apontando `templates.folder` para o novo pacote, os `wsdl` de homologação/produção, o tipo de autenticação e os `metodos` (`action`, `tagSign`, `tagAppend`, `tagMap`, transporte).
4. Se a prefeitura exigir limpeza/assinatura especial, use `search`/`replace`, `signConsulta`, `returnType`/`returnReplace` e `replaceXmlSOAP`.

No melhor caso, **nenhuma linha de PHP** precisa ser escrita.

---

Implementações legadas (Ginfes, ISSWeb, Sigep)
----------------------------------------------

[](#implementações-legadas-ginfes-issweb-sigep)

Antes do motor genérico, cada padrão tinha uma classe própria (com seus DTOs `*InfRps`, `*Return`, etc.):

NamespaceClasseObservação`NFSe\ginfes``NFSeGinfes`Padrão Ginfes (cabeçalho/tipos v03).`NFSe\issweb``NFSeISSWeb`Padrão ISSWeb (ex.: Senador Canedo).`NFSe\sigep``NFSeSigep`Padrão Sigep (ex.: Senador Canedo).Elas continuam funcionais, mas **para novas integrações prefira `NFSeGenerico`**.

---

Exemplos completos
------------------

[](#exemplos-completos)

### Instanciando

[](#instanciando)

```
use NFSe\generico\NFSeGenerico;

$aConfig = [
    'cpfCnpj'      => '00000000000000',
    'insMunicipal' => '123456',
    'pfx'          => __DIR__ . '/cert/empresa.pfx',
    'pwdPFX'       => 'senha',
    'cnpj'         => '00000000000000',

    'templates'    => ['folder' => 'abrasf-v2.4'],

    'autenticacao' => ['type' => 'none'],

    'homologacao'  => ['wsdl' => 'https://homolog.prefeitura.gov.br/nfse?wsdl'],
    'producao'     => ['wsdl' => 'https://nfse.prefeitura.gov.br/nfse?wsdl'],
];

$oNFSe = new NFSeGenerico($aConfig, true); // true = homologação
```

### Gerando uma NFS-e (RPS / ABRASF)

[](#gerando-uma-nfs-e-rps--abrasf)

```
use NFSe\generico\NFSeGenericoInfRps;

$oRps = new NFSeGenericoInfRps();
$oRps->IdentificacaoRps->Numero = 1;
$oRps->IdentificacaoRps->Serie  = 'A';
$oRps->IdentificacaoRps->Tipo   = 1;
$oRps->DataEmissao              = date('Y-m-d');
$oRps->Competencia              = date('Y-m-d');

$oRps->Servico->Valores->ValorServicos = 100.00;
$oRps->Servico->Valores->Aliquota      = 0.05;
$oRps->Servico->ItemListaServico       = '0107';
$oRps->Servico->Discriminacao          = 'Serviços de consultoria';
$oRps->Servico->CodigoMunicipio        = '5208707';

$oRps->Prestador->CpfCnpj            = '00000000000000';
$oRps->Prestador->InscricaoMunicipal = '123456';

$oRps->Tomador->IdentificacaoTomador->CpfCnpj = '11111111111';
$oRps->Tomador->RazaoSocial                   = 'Cliente Exemplo';

$retorno = $oNFSe->gerarNfse($oRps);

if (empty($retorno['ListaMensagemRetorno'])) {
    $oNota = $retorno['ListaNfse']['CompNfse'][0];
    echo "NFS-e nº {$oNota->Numero} — {$oNota->Url}";
} else {
    foreach ($retorno['ListaMensagemRetorno'] as $msg) {
        echo "[{$msg->Codigo}] {$msg->Mensagem} — {$msg->Correcao}\n";
    }
}
```

### Gerando uma NFS-e (DPS / Nacional)

[](#gerando-uma-nfs-e-dps--nacional)

```
use NFSe\generico\NFSeGenerico;
use NFSe\generico\nfseNacional\NFSeGenericoInfDPS;

$oNotaNacional = new NFSeGenerico($aConfigNacional); // templates.folder de um pacote "-br"

$oDPS = new NFSeGenericoInfDPS();
$oDPS->tpAmb   = 2;            // 2 = homologação
$oDPS->dhEmi   = date('c');
$oDPS->serie   = 1;
$oDPS->nDPS    = 1;
$oDPS->dCompet = date('Ymd');
$oDPS->tpEmit  = 1;
$oDPS->cLocEmi = '5208707';
// ... preencher $oDPS->prest, ->toma, ->serv, ->valores, ->IBSCBS ...

$retorno = $oNotaNacional->gerarNfse($oDPS); // ou gerarNfseEnvio($oDPS)
```

### Cancelando

[](#cancelando)

```
use NFSe\generico\NFSeGenericoCancelarNfseEnvio;

$oCancelar = new NFSeGenericoCancelarNfseEnvio();
$oCancelar->Numero                = '123';
$oCancelar->CodigoVerificacao     = 'ABC123';
$oCancelar->CodigoMunicipio       = '5208707';
$oCancelar->CodigoCancelamento    = '1'; // 1 - Erro na emissão
$oCancelar->DescricaoCancelamento = 'Erro na emissão';

$retorno = $oNFSe->cancelarNfse($oCancelar);
```

Mais exemplos executáveis em `testes/` (ex.: `TesteNotaServicoNacional.php`).

---

Licença e autoria
-----------------

[](#licença-e-autoria)

- **Licença:** GPL-2.0+
- **Autor:** Willker Moraes Silva —
- Assinatura digital e manejo de certificados baseados no projeto [nfephp-org](https://github.com/nfephp-org).

###  Health Score

28

—

LowBetter than 51% of packages

Maintenance56

Moderate activity, may be stable

Popularity20

Limited adoption so far

Community15

Small or concentrated contributor base

Maturity19

Early-stage or recently created project

 Bus Factor1

Top contributor holds 55.5% of commits — single point of failure

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

### Community

Maintainers

![](https://www.gravatar.com/avatar/8d372c9a7fd7552ccba99ab753ff77ecd6f72ad9b5689e275231990c75c26278?d=identicon)[willkerms](/maintainers/willkerms)

---

Top Contributors

[![willkerms](https://avatars.githubusercontent.com/u/6119855?v=4)](https://github.com/willkerms "willkerms (61 commits)")[![norton-nap08](https://avatars.githubusercontent.com/u/98234071?v=4)](https://github.com/norton-nap08 "norton-nap08 (30 commits)")[![victorbenatti-lottus](https://avatars.githubusercontent.com/u/240781776?v=4)](https://github.com/victorbenatti-lottus "victorbenatti-lottus (18 commits)")[![felpsgus](https://avatars.githubusercontent.com/u/98331685?v=4)](https://github.com/felpsgus "felpsgus (1 commits)")

### Embed Badge

![Health badge](/badges/willkerms-nfs-e/health.svg)

```
[![Health](https://phpackages.com/badges/willkerms-nfs-e/health.svg)](https://phpackages.com/packages/willkerms-nfs-e)
```

###  Alternatives

[nativephp/php-bin

PHP binaries used by the NativePHP framework

138262.1k5](/packages/nativephp-php-bin)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
