PHPackages                             php-opcua/opcua-client-ext-transport-pubsub - 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. php-opcua/opcua-client-ext-transport-pubsub

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

php-opcua/opcua-client-ext-transport-pubsub
===========================================

OPC UA PubSub Subscriber for PHP — UDP + UADP + JSON, extends opcua-client

v4.4.0(today)00MITPHPPHP ^8.2CI passing

Since Jun 9Pushed todayCompare

[ Source](https://github.com/php-opcua/opcua-client-ext-transport-pubsub)[ Packagist](https://packagist.org/packages/php-opcua/opcua-client-ext-transport-pubsub)[ Docs](https://github.com/php-opcua/opcua-client-ext-transport-pubsub)[ RSS](/packages/php-opcua-opcua-client-ext-transport-pubsub/feed)WikiDiscussions master Synced today

READMEChangelogDependencies (5)Versions (2)Used By (0)

**OPC UA PubSub Subscriber for PHP**
====================================

[](#opc-ua-pubsub-subscriber-for-php)

    ![OPC UA PubSub Subscriber for PHP](assets/logo-light.svg)

 [![Tests](https://camo.githubusercontent.com/cfd45f4dda22008f8cf1fa29c73db88c78faadc888e448a9366ca182f4d2d769/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f7068702d6f706375612f6f706375612d636c69656e742d6578742d7472616e73706f72742d7075627375622f74657374732e796d6c3f6272616e63683d6d6173746572266c6162656c3d7465737473267374796c653d666c61742d737175617265)](https://github.com/php-opcua/opcua-client-ext-transport-pubsub/actions/workflows/tests.yml) [![Coverage](https://camo.githubusercontent.com/175148f623f6231e4a91f8b58d23e5dae0d0da79c5a8679f60d4d0c5073354c0/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636f762f632f6769746875622f7068702d6f706375612f6f706375612d636c69656e742d6578742d7472616e73706f72742d7075627375623f7374796c653d666c61742d737175617265266c6f676f3d636f6465636f76)](https://codecov.io/gh/php-opcua/opcua-client-ext-transport-pubsub) [![Latest Version](https://camo.githubusercontent.com/7d6467f5a3e43c8352008ee3b779a6f6eadda7b5c71e243dd9279e7b93f3f268/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f7068702d6f706375612f6f706375612d636c69656e742d6578742d7472616e73706f72742d7075627375623f7374796c653d666c61742d737175617265266c6162656c3d7061636b6167697374)](https://packagist.org/packages/php-opcua/opcua-client-ext-transport-pubsub) [![PHP Version](https://camo.githubusercontent.com/d8bfb5d81a7c7dab8f7c8b764f07fc59944db818e880550eae2a631d1c841609/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f7068702d6f706375612f6f706375612d636c69656e742d6578742d7472616e73706f72742d7075627375623f7374796c653d666c61742d737175617265)](https://packagist.org/packages/php-opcua/opcua-client-ext-transport-pubsub) [![License](https://camo.githubusercontent.com/ed9338b809b8c8d144a05b12736ca2228dabadbd62d99d6cd5716fdb5130c1c9/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f7068702d6f706375612f6f706375612d636c69656e742d6578742d7472616e73706f72742d7075627375623f7374796c653d666c61742d737175617265)](LICENSE)

 [![Linux](https://camo.githubusercontent.com/88a96af546255df6414fb878e65861f03abd9cd7c69fe0c652b32d10e1dc2b84/68747470733a2f2f637573746f6d2d69636f6e2d6261646765732e64656d6f6c61622e636f6d2f62616467652f4c696e75782de29c932d3265613434663f7374796c653d666c61742d737175617265266c6f676f3d6c696e7578266c6f676f436f6c6f723d7768697465)](https://camo.githubusercontent.com/88a96af546255df6414fb878e65861f03abd9cd7c69fe0c652b32d10e1dc2b84/68747470733a2f2f637573746f6d2d69636f6e2d6261646765732e64656d6f6c61622e636f6d2f62616467652f4c696e75782de29c932d3265613434663f7374796c653d666c61742d737175617265266c6f676f3d6c696e7578266c6f676f436f6c6f723d7768697465) [![macOS](https://camo.githubusercontent.com/9abd62edee5c8e38df116839daa54deb7e5b2054d4bcb856529f5cd92ada8b74/68747470733a2f2f637573746f6d2d69636f6e2d6261646765732e64656d6f6c61622e636f6d2f62616467652f6d61634f532de29c932d3265613434663f7374796c653d666c61742d737175617265266c6f676f3d6170706c65266c6f676f436f6c6f723d7768697465)](https://camo.githubusercontent.com/9abd62edee5c8e38df116839daa54deb7e5b2054d4bcb856529f5cd92ada8b74/68747470733a2f2f637573746f6d2d69636f6e2d6261646765732e64656d6f6c61622e636f6d2f62616467652f6d61634f532de29c932d3265613434663f7374796c653d666c61742d737175617265266c6f676f3d6170706c65266c6f676f436f6c6f723d7768697465) [![Windows](https://camo.githubusercontent.com/67b9f3090b3bbef27712496e616a0a0f0ead78d1a3a092a80b74df716dda8a6b/68747470733a2f2f637573746f6d2d69636f6e2d6261646765732e64656d6f6c61622e636f6d2f62616467652f57696e646f77732de29c932d3265613434663f7374796c653d666c61742d737175617265266c6f676f3d77696e646f77733131266c6f676f436f6c6f723d7768697465)](https://camo.githubusercontent.com/67b9f3090b3bbef27712496e616a0a0f0ead78d1a3a092a80b74df716dda8a6b/68747470733a2f2f637573746f6d2d69636f6e2d6261646765732e64656d6f6c61622e636f6d2f62616467652f57696e646f77732de29c932d3265613434663f7374796c653d666c61742d737175617265266c6f676f3d77696e646f77733131266c6f676f436f6c6f723d7768697465)

---

Subscribe to OPC UA PubSub streams directly from PHP — UDP unicast or multicast, UADP and JSON payloads, group-key security — without any C/C++ extensions, HTTP gateways, or middleware in between.

This package extends [`php-opcua/opcua-client`](https://github.com/php-opcua/opcua-client) with the OPC UA [Part 14 — PubSub](https://reference.opcfoundation.org/Core/Part14/v105/docs/) Subscriber role. The core client stays unchanged; installing this extension only adds the `PhpOpcua\Client\ExtTransportPubSub\*` namespace. Same zero-dependency philosophy, same PSR-3 / PSR-14 integration, same cross-platform support.

**What you can do with it:**

- **Listen** to PubSub NetworkMessages over UDP unicast or multicast
- **Decode** UADP binary and JSON payloads into typed DataSetMessages with named fields
- **Verify and decrypt** signed and encrypted PubSub streams using pre-shared group keys or a Security Key Service
- **Configure readers** by `(publisherId, writerGroupId, dataSetWriterId)` and let the kernel demux incoming traffic
- **React in real time** via PSR-14 events or plain callbacks on every decoded field

All this with `ext-sockets` as the only extension beyond the core's `ext-openssl`, and PHP 8.2 through 8.5 supported on Linux, macOS, and Windows.

> **Note:** PubSub is a fire-and-forget broadcast paradigm, not a session-oriented protocol. A long-running worker process (ReactPHP, Symfony Messenger, Laravel queue worker, Artisan command, systemd unit) is the natural place to run a `Subscriber`. Short-lived PHP requests cannot sustain a meaningful subscription window.

### Ships as an extension, not as a replacement

[](#ships-as-an-extension-not-as-a-replacement)

The core `php-opcua/opcua-client` is a tight, zero-dependency library focused on client/server OPC UA. PubSub has a different runtime model (event loop vs request/response), a different wire protocol (UADP), and different security (pre-shared group keys vs per-session asymmetric handshake). Bundling it into the core would inflate the base install for the 95% of users who only need read/write/browse/subscribe.

This package is purely additive. Nothing in the core changes when you `composer require` it.

---

Quick Start
-----------

[](#quick-start)

```
composer require php-opcua/opcua-client-ext-transport-pubsub
```

```
use PhpOpcua\Client\ExtTransportPubSub\SubscriberBuilder;
use PhpOpcua\Client\ExtTransportPubSub\Types\DataSetMessage;
use PhpOpcua\Client\ExtTransportPubSub\Types\DataSetMetaData;
use PhpOpcua\Client\ExtTransportPubSub\Types\DataSetReaderConfig;

$metadata = DataSetMetaData::fromJsonFile('/etc/opcua/line1.json');

$subscriber = SubscriberBuilder::create()
    ->onDataSetMessage(function (DataSetMessage $msg) {
        foreach ($msg->fields as $field) {
            echo "{$field->name} = {$field->getScalar()}\n";
        }
    })
    ->listenUdp(
        endpoint: 'opc.udp://239.0.0.1:4840',
        readers: [
            new DataSetReaderConfig(
                publisherId: 100,
                writerGroupId: 1,
                dataSetWriterId: 1,
                dataSetMetaData: $metadata,
            ),
        ],
    );

$subscriber->run();
```

That's it. Build, configure one reader, block on `run()`. Press Ctrl-C (or call `stop()` from a signal handler) to exit cleanly.

> **Tip:** Prefer `poll(timeoutMs: 500)` over `run()` when you have your own event loop (ReactPHP, Amp, custom). It returns the batch of decoded `DataSetMessage` objects from this tick without blocking past the timeout.

See It in Action
----------------

[](#see-it-in-action)

### Listen on unicast UDP

[](#listen-on-unicast-udp)

```
$subscriber = SubscriberBuilder::create()
    ->listenUdp(
        endpoint: 'opc.udp://192.168.1.50:4840',
        readers: [$reader],
    );
```

### Tune the UDP socket

[](#tune-the-udp-socket)

```
use PhpOpcua\Client\ExtTransportPubSub\Transport\UdpOptions;

$subscriber = SubscriberBuilder::create()
    ->listenUdp(
        endpoint: 'opc.udp://239.0.0.1:4840',
        transport: new UdpOptions(
            interface: '0.0.0.0',
            receiveBufferSize: 131072,
            ttl: 8,
            reuseAddress: true,
        ),
        readers: [$reader],
    );
```

### Decode JSON payloads

[](#decode-json-payloads)

```
$subscriber = SubscriberBuilder::create()
    ->useJson()
    ->listenUdp(
        endpoint: 'opc.udp://239.0.0.1:4840',
        readers: [$reader],
    );
```

### Load metadata from JSON, XML, or a live server

[](#load-metadata-from-json-xml-or-a-live-server)

```
use PhpOpcua\Client\ExtTransportPubSub\Types\DataSetMetaData;

// From a JSON config file
$metadata = DataSetMetaData::fromJsonFile('/etc/opcua/line1.json');

// From an OPC UA DataSetMetaDataType XML file
$metadata = DataSetMetaData::fromXmlFile('/etc/opcua/line1.xml');

// From a running server via the classic opcua-client
$metadata = DataSetMetaData::fetchFromServer($client, 'ns=2;s=PDS/Line1/Metadata');
```

### Secure the stream with pre-shared keys

[](#secure-the-stream-with-pre-shared-keys)

```
use PhpOpcua\Client\ExtTransportPubSub\Security\PubSubSecurityMode;
use PhpOpcua\Client\ExtTransportPubSub\Security\PubSubSecurityOptions;
use PhpOpcua\Client\ExtTransportPubSub\Security\StaticGroupKeyProvider;

$subscriber = SubscriberBuilder::create()
    ->listenUdp(
        endpoint: 'opc.udp://239.0.0.1:4840',
        security: new PubSubSecurityOptions(
            mode: PubSubSecurityMode::SignAndEncrypt,
            keyProvider: new StaticGroupKeyProvider(
                signingKey: hex2bin($_ENV['PUBSUB_SIGN']),
                encryptingKey: hex2bin($_ENV['PUBSUB_ENC']),
                keyNonce: hex2bin($_ENV['PUBSUB_NONCE']),
            ),
        ),
        readers: [$reader],
    );
```

### Rotate keys from a Security Key Service

[](#rotate-keys-from-a-security-key-service)

```
use PhpOpcua\Client\ClientBuilder;
use PhpOpcua\Client\ExtTransportPubSub\Security\SksGroupKeyProvider;

$client = ClientBuilder::create()->connect('opc.tcp://sks.example.com:4840');

$provider = new SksGroupKeyProvider($client, securityGroupId: 'line1-ops');
$provider->refresh();

$subscriber = SubscriberBuilder::create()
    ->listenUdp(
        endpoint: 'opc.udp://239.0.0.1:4840',
        security: new PubSubSecurityOptions(PubSubSecurityMode::SignAndEncrypt, $provider),
        readers: [$reader],
    );
```

### Poll instead of run

[](#poll-instead-of-run)

```
while (! $shouldStop) {
    foreach ($subscriber->poll(timeoutMs: 250) as $msg) {
        handle($msg);
    }
    doOtherWork();
}
```

### Graceful shutdown from a signal handler

[](#graceful-shutdown-from-a-signal-handler)

```
pcntl_async_signals(true);
pcntl_signal(SIGTERM, fn () => $subscriber->stop());
pcntl_signal(SIGINT, fn () => $subscriber->stop());

$subscriber->run();
```

### Receive PSR-14 events for every step

[](#receive-psr-14-events-for-every-step)

```
use PhpOpcua\Client\ExtTransportPubSub\Event\DataSetFieldReceived;
use PhpOpcua\Client\ExtTransportPubSub\Event\MessageDecodeError;
use PhpOpcua\Client\ExtTransportPubSub\Event\SecurityValidationFailed;

$subscriber = SubscriberBuilder::create()
    ->setEventDispatcher($yourDispatcher)
    ->listenUdp(/* ... */);
```

Listeners fire for `NetworkMessageReceived`, `DataSetMessageReceived`, `DataSetFieldReceived`, `MessageDecodeError`, `SecurityValidationFailed`, `TransportOpened`, `TransportClosed`, and `TransportError`. Zero overhead when no dispatcher is configured.

### Add structured logging

[](#add-structured-logging)

```
use Monolog\Logger;
use Monolog\Handler\StreamHandler;

$logger = new Logger('pubsub');
$logger->pushHandler(new StreamHandler('php://stderr', Logger::DEBUG));

$subscriber = SubscriberBuilder::create()
    ->setLogger($logger)
    ->listenUdp(/* ... */);
```

Any [PSR-3](https://www.php-fig.org/psr/psr-3/) logger works. Without one, logging is silently disabled.

### Plug in your own transport

[](#plug-in-your-own-transport)

```
use PhpOpcua\Client\ExtTransportPubSub\Transport\PubSubTransportInterface;

class MyKafkaTransport implements PubSubTransportInterface { /* ... */ }

$subscriber = SubscriberBuilder::create()
    ->listenOn(
        transports: [new MyKafkaTransport(/* ... */)],
        readers: [$reader],
    );
```

The `PubSubTransportInterface` contract is the extension point that keeps the subscriber agnostic to the underlying transport. External packages like `php-opcua/opcua-client-ext-mqtt` plug in by implementing this interface.

Why This Package?
-----------------

[](#why-this-package)

- **Zero runtime dependencies beyond the core** — `ext-sockets` plus the core's `ext-openssl`. Optional PSR-3 logging and PSR-14 events via any compatible implementation.
- **PHP 8.2+** — runs on any modern PHP.
- **Native UADP binary** — speaks the OPC UA binary PubSub encoding directly over UDP. No translation layer.
- **UDP unicast and multicast** — IGMP group join with `MCAST_JOIN_GROUP` plus legacy `IP_ADD_MEMBERSHIP` fallback. TTL, buffer size, and `SO_REUSEADDR` exposed as first-class options.
- **JSON codec included** — the reversible form from Part 14 §7.2, round-trippable without external metadata.
- **Group-key security** — HMAC-SHA256 signing and AES-256-CBC encryption handled in pure PHP via `ext-openssl`. Pre-shared keys or live rotation from a Security Key Service.
- **Metadata any way you like** — PHP arrays, JSON files, `DataSetMetaDataType` XML exports, or a live read from the publishing server.
- **Typed everywhere** — every DTO uses `public readonly` properties. No arrays, no magic.
- **Cross-platform** — tested on Linux, macOS, and Windows across PHP 8.2–8.5. No FFI, no COM, no platform-specific APIs beyond `ext-sockets`.
- **Does not modify the core** — `ClientBuilder`, `Client`, `ClientKernel`, `OpcUaClientInterface` are untouched.

Features
--------

[](#features)

FeatureWhat it does**UDP Transport**Unicast and IPv4 multicast with `MCAST_JOIN_GROUP` (legacy fallback), `SO_REUSEADDR`, non-blocking sockets, `socket_select` timeout**UADP Codec**Binary PubSub encoding — PublisherId (Byte/UInt16/UInt32/UInt64/String), GroupHeader, PayloadHeader with multiple DataSetMessages, Variant / RawData / DataValue field encodings**JSON Codec**Reversible JSON encoding from Part 14 §7.2 (encode + decode, no external metadata required)**Subscriber Runtime**Event loop over N transports, demux by `(publisherId, writerGroupId, dataSetWriterId)`, blocking `run()` and non-blocking `poll()`**Security**Sign (HMAC-SHA256) and SignAndEncrypt (AES-256-CBC) with pre-shared keys via `StaticGroupKeyProvider` or SKS-backed rotation via `SksGroupKeyProvider`**Metadata Loaders**`DataSetMetaData::fromArray()`, `fromJsonFile()`, `fromXmlFile()`, `fromXmlString()`, `fromBinary()`, `fetchFromServer()`**PSR-14 Events**`NetworkMessageReceived`, `DataSetMessageReceived`, `DataSetFieldReceived`, `MessageDecodeError`, `SecurityValidationFailed`, `TransportOpened`, `TransportClosed`, `TransportError`**PSR-3 Logging**Any PSR-3 logger plugs in. `NullLogger` by default.**Pluggable Transports**`PubSubTransportInterface` is the stable hook point for third-party transports (e.g. MQTT)**Module System**`PubSubModule` base class lets you extend the kernel with custom behaviour (telemetry, alarm forwarding, ...)**Typed DTOs**`public readonly` properties everywhere — `NetworkMessage`, `DataSetMessage`, `DataSetField`, `FieldMetaData`, `DataSetMetaData`, `DataSetReaderConfig`, `UdpOptions`, `ReceivedPayload`, `PubSubSecurityOptions`Documentation
-------------

[](#documentation)

Full docs live under [`docs/`](docs/index.md) (published at ).

DocumentCovers[Overview](docs/overview.md)What it is, when to use it, what ships[Quick start](docs/getting-started/quick-start.md)Reader + callback + listen, in three steps[How it works](docs/concepts/how-it-works.md)The transport → codec → security → kernel pipeline[Encodings](docs/concepts/encodings.md)UADP and JSON, field encodings[Subscriber &amp; builder](docs/api/subscriber.md)Builder, `run()` / `poll()` / `stop()`, lifecycle[Transports](docs/api/transports.md)UDP configuration, multicast, custom transports[Readers &amp; metadata](docs/api/readers-and-metadata.md)`DataSetReaderConfig`, loading `DataSetMetaData`[Modules](docs/api/modules.md) / [Events](docs/api/events.md)Custom kernel hooks; the 8 PSR-14 events[Group-key security](docs/security/overview.md)Sign, SignAndEncrypt, static keys, SKS rotation[Testing](docs/testing/overview.md) · [Exceptions](docs/reference/exceptions.md)Fake transport + dispatcher; error referenceTesting
-------

[](#testing)

Run `./vendor/bin/pest` after `composer install`. Unit tests cover codec round-trips, UDP loopback send/receive, kernel demux, security unwrap, metadata loaders, and SKS key fetching. CI runs on PHP 8.2, 8.3, 8.4, and 8.5 across Linux, macOS, and Windows via GitHub Actions.

```
./vendor/bin/pest                                          # everything
./vendor/bin/pest tests/Unit/                              # unit only
./vendor/bin/pest tests/Integration/ --group=integration   # integration only
```

Ecosystem
---------

[](#ecosystem)

PackageDescription[opcua-client](https://github.com/php-opcua/opcua-client)Pure PHP OPC UA client (required)[opcua-client-ext-transport-pubsub](https://github.com/php-opcua/opcua-client-ext-transport-pubsub)OPC UA PubSub Subscriber (this package)[opcua-client-nodeset](https://github.com/php-opcua/opcua-client-nodeset)Pre-generated PHP types from OPC Foundation companion specifications[opcua-session-manager](https://github.com/php-opcua/opcua-session-manager)Daemon-based session persistence for the classic client[laravel-opcua](https://github.com/php-opcua/laravel-opcua)Laravel integration for the classic client[opcua-cli](https://github.com/php-opcua/opcua-cli)CLI tool — browse, read, write, watch, manage certificatesCommunity
---------

[](#community)

Have questions, ideas, or want to share what you've built? Join the [GitHub Discussions](https://github.com/php-opcua/opcua-client-ext-transport-pubsub/discussions).

**Connected a PubSub-capable device?** We're collecting a community-driven list of tested publishers. Share your experience — even a one-liner like "open62541 1.4, UDP multicast, works fine" helps other users know what to expect.

AI-Ready
--------

[](#ai-ready)

This package ships with machine-readable documentation designed for AI coding assistants (Claude, Cursor, Copilot, ChatGPT, and others). Feed these files to your AI so it knows how to use the library correctly:

FilePurpose[`llms.txt`](llms.txt)Compact project summary — architecture, key classes, API signatures[`llms-full.txt`](llms-full.txt)Comprehensive technical reference — every class, DTO, encoding detail[`llms-skills.md`](llms-skills.md)Task-oriented recipes — step-by-step instructions for common tasks**How to use:** copy the files you need into your project's AI configuration directory. The files are located in `vendor/php-opcua/opcua-client-ext-transport-pubsub/` after `composer install`.

- **Claude Code**: reference per-session with `--add-file vendor/php-opcua/opcua-client-ext-transport-pubsub/llms-skills.md`
- **Cursor**: copy into your project's rules directory — `cp vendor/php-opcua/opcua-client-ext-transport-pubsub/llms-skills.md .cursor/rules/opcua-pubsub.md`
- **GitHub Copilot**: copy or append into `.github/copilot-instructions.md`
- **Other tools**: paste the content into your system prompt or project knowledge base

Roadmap
-------

[](#roadmap)

See [ROADMAP.md](ROADMAP.md) for what's coming next.

Contributing
------------

[](#contributing)

Contributions welcome — see [CONTRIBUTING.md](CONTRIBUTING.md).

Changelog
---------

[](#changelog)

See [CHANGELOG.md](CHANGELOG.md).

License
-------

[](#license)

[MIT](LICENSE)

###  Health Score

39

—

LowBetter than 84% of packages

Maintenance100

Actively maintained with recent releases

Popularity0

Limited adoption so far

Community6

Small or concentrated contributor base

Maturity45

Maturing project, gaining track record

 Bus Factor1

Top contributor holds 100% 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.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

0d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/fb72ba5d2c05eec08d9556c0007f17a7d657d5187de1025a4a0525ace4ac8000?d=identicon)[GianfriAur](/maintainers/GianfriAur)

---

Top Contributors

[![GianfriAur](https://avatars.githubusercontent.com/u/16904504?v=4)](https://github.com/GianfriAur "GianfriAur (8 commits)")

---

Tags

subscriberpubsubudpmulticastpublish-subscribeopcuaopc-uaindustrialIIoTindustry-4.0uadp

###  Code Quality

TestsPest

Code StylePHP CS Fixer

### Embed Badge

![Health badge](/badges/php-opcua-opcua-client-ext-transport-pubsub/health.svg)

```
[![Health](https://phpackages.com/badges/php-opcua-opcua-client-ext-transport-pubsub/health.svg)](https://phpackages.com/packages/php-opcua-opcua-client-ext-transport-pubsub)
```

###  Alternatives

[symfony/symfony

The Symfony PHP framework

31.4k86.9M2.2k](/packages/symfony-symfony)[phpro/soap-client

A general purpose SoapClient library

8895.9M52](/packages/phpro-soap-client)[symfony/mailer

Helps sending emails

1.6k394.6M1.3k](/packages/symfony-mailer)[web-auth/webauthn-lib

FIDO2/Webauthn Support For PHP

1237.8M117](/packages/web-auth-webauthn-lib)[web-auth/webauthn-framework

FIDO2/Webauthn library for PHP and Symfony Bundle.

51090.8k2](/packages/web-auth-webauthn-framework)[cognesy/instructor-php

The complete AI toolkit for PHP: unified LLM API, structured outputs, agents, and coding agent control

317117.1k1](/packages/cognesy-instructor-php)

PHPackages © 2026

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