PHPackages                             php-opcua/symfony-opcua - 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/symfony-opcua

ActiveSymfony-bundle[Utility &amp; Helpers](/categories/utility)

php-opcua/symfony-opcua
=======================

Symfony integration for OPC UA client with optional session manager support

v4.3.0(3w ago)02MITPHPPHP ^8.2CI passing

Since Apr 14Pushed 1w ago1 watchersCompare

[ Source](https://github.com/php-opcua/symfony-opcua)[ Packagist](https://packagist.org/packages/php-opcua/symfony-opcua)[ RSS](/packages/php-opcua-symfony-opcua/feed)WikiDiscussions master Synced 1w ago

READMEChangelog (3)Dependencies (12)Versions (4)Used By (0)

**OPC UA Symfony Bundle**
=========================

[](#opc-ua-symfony-bundle)

    ![OPC UA Symfony Bundle](assets/logo-light.svg)

 [![Tests](https://camo.githubusercontent.com/a55689a6e36bac323b80830afa285c18258bbebf50e7896553ff74884f072931/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f616374696f6e732f776f726b666c6f772f7374617475732f7068702d6f706375612f73796d666f6e792d6f706375612f74657374732e796d6c3f6272616e63683d6d6173746572266c6162656c3d7465737473267374796c653d666c61742d737175617265)](https://github.com/php-opcua/symfony-opcua/actions/workflows/tests.yml) [![Coverage](https://camo.githubusercontent.com/377b315c01bfb47498367897c43b9a89483197cc7dbb0121a4327ba4d5b3c8a7/68747470733a2f2f696d672e736869656c64732e696f2f636f6465636f762f632f6769746875622f7068702d6f706375612f73796d666f6e792d6f706375613f7374796c653d666c61742d737175617265266c6f676f3d636f6465636f76)](https://codecov.io/gh/php-opcua/symfony-opcua) [![Latest Version](https://camo.githubusercontent.com/a63365eeca55a60844162587de128f88ebfd591d61b24070c58ef57dff13f82c/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f762f7068702d6f706375612f73796d666f6e792d6f706375613f7374796c653d666c61742d737175617265266c6162656c3d7061636b6167697374)](https://packagist.org/packages/php-opcua/symfony-opcua) [![PHP Version](https://camo.githubusercontent.com/daaf127b55acb1fc0da5709d51376b7e641901602041e52c2c1e5fb1a83f09d2/68747470733a2f2f696d672e736869656c64732e696f2f7061636b61676973742f7068702d762f7068702d6f706375612f73796d666f6e792d6f706375613f7374796c653d666c61742d737175617265)](https://packagist.org/packages/php-opcua/symfony-opcua) [![Symfony Version](https://camo.githubusercontent.com/f68fc1339398bc3a652bc0d296f2b611419b38308a04f10efbdc1d4e87b99eae/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73796d666f6e792d372e332532307c253230372e342532307c253230382e302d626c61636b3f7374796c653d666c61742d737175617265266c6f676f3d73796d666f6e79)](https://camo.githubusercontent.com/f68fc1339398bc3a652bc0d296f2b611419b38308a04f10efbdc1d4e87b99eae/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f73796d666f6e792d372e332532307c253230372e342532307c253230382e302d626c61636b3f7374796c653d666c61742d737175617265266c6f676f3d73796d666f6e79) [![License](https://camo.githubusercontent.com/8b4a6ebb2569c959238fb16c8ef2b878ea20e10a8ffd2849ed8015ad0e4a2452/68747470733a2f2f696d672e736869656c64732e696f2f6769746875622f6c6963656e73652f7068702d6f706375612f73796d666f6e792d6f706375613f7374796c653d666c61742d737175617265)](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)

---

Symfony integration for [OPC UA](https://opcfoundation.org/about/opc-technologies/opc-ua/) built on [`opcua-client`](https://github.com/php-opcua/opcua-client) and [`opcua-session-manager`](https://github.com/php-opcua/opcua-session-manager). Connect your Symfony app to PLCs, SCADA systems, sensors, and IoT devices with a familiar developer experience: YAML-based semantic configuration, autowirable services, named connections, and a console command for the optional session manager daemon.

**What you get:**

- **Dependency injection** — autowire `OpcuaManager` or `OpcUaClientInterface` anywhere in your application
- **Named connections** — define multiple OPC UA servers and switch between them, just like Doctrine connections
- **Transparent session management** — when the daemon is running, connections persist across HTTP requests; when it's not, direct per-request connections with zero code changes
- **Symfony-native logging and caching** — your Monolog channel and cache pool are automatically injected into every OPC UA client
- **All OPC UA operations** — browse, read, write, method calls, subscriptions, events, history, path resolution, type discovery
- **PSR-14 events** — 47 dispatched events covering every OPC UA operation for observability and extensibility
- **Auto-publish** — daemon monitors subscriptions automatically and dispatches PSR-14 events to your Symfony listeners — no manual publish loop
- **Auto-connect** — define subscriptions in YAML config per connection and the daemon sets them up at startup
- **Trust store** — certificate trust management with configurable policies and auto-accept modes
- **Write auto-detection** — omit the type parameter and let the client detect the correct OPC UA type automatically

> **Note:** This bundle wraps the full [opcua-client](https://github.com/php-opcua/opcua-client) API with Symfony conventions. For the underlying protocol details, types, and advanced features, see the [client documentation](https://github.com/php-opcua/opcua-client/tree/master/doc).

### Tested against the OPC UA reference implementation

[](#tested-against-the-opc-ua-reference-implementation)

The underlying [opcua-client](https://github.com/php-opcua/opcua-client) is integration-tested against **[UA-.NETStandard](https://github.com/OPCFoundation/UA-.NETStandard)** — the **reference implementation** maintained by the OPC Foundation, the organization that defines the OPC UA specification. This is the same stack used by major industrial vendors to certify their products.

This Symfony bundle is additionally integration-tested via [uanetstandard-test-suite](https://github.com/php-opcua/uanetstandard-test-suite) in both direct and managed (daemon) modes, ensuring full compatibility across all connection strategies. Like [opcua-client](https://github.com/php-opcua/opcua-client) and [opcua-session-manager](https://github.com/php-opcua/opcua-session-manager), unit tests run cross-OS — **Linux, macOS, and Windows** across PHP 8.2–8.5 × Symfony 7.3 / 7.4 / 8.0 — on every push. Integration tests stay on Linux (Docker-hosted OPC UA servers).

### Runs on Linux, macOS, and Windows

[](#runs-on-linux-macos-and-windows)

The session manager IPC auto-selects the right transport per platform — zero app-side changes.

PlatformDefault transportEndpoint URILinux / macOSUnix-domain socket`unix:///var/opcua-session-manager.sock` (scheme-less paths are accepted too)WindowsTCP loopback`tcp://127.0.0.1:9990`Under `php_opcua_symfony_opcua.session_manager.socket_path` you can set either a `unix://`, a `tcp://127.0.0.1:` (loopback-only — non-loopback hosts are refused on both client and daemon sides), or a scheme-less path (= `unix://`, backwards-compatible with pre-v4.2.0 configs). For Windows deployments either set the value explicitly to `tcp://127.0.0.1:9990` or rely on `TransportFactory::defaultEndpoint()` in your bootstrap.

Requirements
------------

[](#requirements)

DependencyVersionPHP&gt;= 8.2ext-openssl\*Symfony7.3, 7.4, 8.0+> **Symfony 6.4 / 7.0 / 7.1 / 7.2:** the bundle source code is compatible with these versions and will install correctly, but they are **not tested in CI** due to a transitive dependency constraint in Pest 3. If you use one of these versions and encounter any issue, please [open a bug report](https://github.com/php-opcua/symfony-opcua/issues/new?template=bug_report.md) — we will evaluate and fix on a case-by-case basis. See [ROADMAP.md](ROADMAP.md#ci-testing-on-symfony-64--70--71--72) for the full rationale.

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

[](#quick-start)

```
composer require php-opcua/symfony-opcua
```

```
# config/packages/php_opcua_symfony_opcua.yaml
php_opcua_symfony_opcua:
    connections:
        default:
            endpoint: '%env(OPCUA_ENDPOINT)%'
```

```
use PhpOpcua\SymfonyOpcua\OpcuaManager;

class PlcController
{
    public function __construct(private readonly OpcuaManager $opcua) {}

    public function index(): Response
    {
        $client = $this->opcua->connect();
        $value = $client->read('i=2259');
        echo $value->getValue(); // 0 = Running
        $client->disconnect();
    }
}
```

That's it. Autowire, YAML config, connect, read. Everything else is optional.

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

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

### Browse the address space

[](#browse-the-address-space)

```
$client = $this->opcua->connect();

$refs = $client->browse('i=85'); // Objects folder
foreach ($refs as $ref) {
    echo "{$ref->displayName} ({$ref->nodeId})\n";
}

$client->disconnect();
```

### Read multiple values with fluent builder

[](#read-multiple-values-with-fluent-builder)

```
$client = $this->opcua->connect();

$results = $client->readMulti()
    ->node('i=2259')->value()
    ->node('ns=2;i=1001')->displayName()
    ->execute();

foreach ($results as $dv) {
    echo $dv->getValue() . "\n";
}

$client->disconnect();
```

### Write to a PLC

[](#write-to-a-plc)

```
use PhpOpcua\Client\Types\BuiltinType;

$client = $this->opcua->connect();
$client->write('ns=2;i=1001', 42, BuiltinType::Int32);

// Or let the client auto-detect the type
$client->write('ns=2;i=1001', 42);

$client->disconnect();
```

### Call a method on the server

[](#call-a-method-on-the-server)

```
use PhpOpcua\Client\Types\Variant;
use PhpOpcua\Client\Types\BuiltinType;

$client = $this->opcua->connect();

$result = $client->call(
    'i=2253',   // Server object
    'i=11492',  // Method
    [new Variant(BuiltinType::UInt32, 1)],
);

echo $result->statusCode;               // 0
echo $result->outputArguments[0]->value; // [1001, 1002, ...]

$client->disconnect();
```

### Subscribe to data changes

[](#subscribe-to-data-changes)

```
$client = $this->opcua->connect();

$sub = $client->createSubscription(publishingInterval: 500.0);
$client->createMonitoredItems($sub->subscriptionId, [
    ['nodeId' => 'ns=2;i=1001'],
]);

$response = $client->publish();
foreach ($response->notifications as $notif) {
    echo $notif['dataValue']->getValue() . "\n";
}

$client->deleteSubscription($sub->subscriptionId);
$client->disconnect();
```

### Auto-publish — no manual publish loop

[](#auto-publish--no-manual-publish-loop)

With `auto_publish` enabled, the daemon handles subscriptions automatically. Just register Symfony event listeners:

```
# config/packages/php_opcua_symfony_opcua.yaml
php_opcua_symfony_opcua:
    session_manager:
        auto_publish: true

    connections:
        plc-1:
            endpoint: 'opc.tcp://192.168.1.10:4840'
            auto_connect: true
            subscriptions:
                - publishing_interval: 500.0
                  monitored_items:
                      - { node_id: 'ns=2;s=Temperature', client_handle: 1 }
```

```
use PhpOpcua\Client\Event\DataChangeReceived;
use Symfony\Component\EventDispatcher\Attribute\AsEventListener;

#[AsEventListener]
class StoreSensorReading
{
    public function __invoke(DataChangeReceived $e): void
    {
        // Store $e->dataValue->getValue() with $e->clientHandle
    }
}
```

```
php bin/console opcua:session  # connects, subscribes, publishes — all automatic
```

### Switch connections

[](#switch-connections)

```
// Named connection from config
$client = $this->opcua->connect('plc-line-1');
$value = $client->read('ns=2;i=1001');
$this->opcua->disconnect('plc-line-1');

// Ad-hoc connection at runtime
$client = $this->opcua->connectTo('opc.tcp://10.0.0.50:4840', [
    'username' => 'operator',
    'password' => 'secret',
], as: 'temp-plc');

$this->opcua->disconnectAll();
```

### Inject the default connection directly

[](#inject-the-default-connection-directly)

```
use PhpOpcua\Client\OpcUaClientInterface;

class PlcService
{
    public function __construct(private readonly OpcUaClientInterface $client) {}

    public function readServerState(): int
    {
        return $this->client->read('i=2259')->getValue();
    }
}
```

### Test without a real server

[](#test-without-a-real-server)

```
use PhpOpcua\Client\Testing\MockClient;
use PhpOpcua\Client\Types\DataValue;

$mock = MockClient::create()
    ->onRead('i=2259', fn() => DataValue::ofInt32(0));

// Inject into OpcuaManager via DI or reflection
$value = $mock->read('i=2259');
echo $value->getValue(); // 0
echo $mock->callCount('read'); // 1
```

Features
--------

[](#features)

FeatureWhat it does**Autowiring**Inject `OpcuaManager` or `OpcUaClientInterface` (default connection) anywhere via constructor injection**Named Connections**Define multiple servers in YAML config, switch with `$opcua->connection('plc-2')`**Ad-hoc Connections**`$opcua->connectTo('opc.tcp://...')` for endpoints not in config**Session Manager**Console command `php bin/console opcua:session` for daemon-based session persistence**Transparent Fallback**Daemon available? ManagedClient. Not available? Direct Client. Zero code changes**String NodeIds**`'i=2259'`, `'ns=2;s=MyNode'` everywhere a `NodeId` is accepted**Fluent Builder API**`readMulti()`, `writeMulti()`, `createMonitoredItems()`, `translateBrowsePaths()` chain**PSR-3 Logging**Monolog channel injected automatically via `log_channel` config**PSR-14 Events**47 dispatched events covering every OPC UA operation for observability and extensibility**PSR-16 Caching**Symfony cache pool wrapped as PSR-16 and injected automatically. Per-call `useCache` on browse ops**Write Auto-Detection**`write('ns=2;i=1001', 42)` — omit the type and the client detects it automatically**Read Metadata Cache**Cached node metadata avoids redundant reads; refresh on demand with `read($nodeId, refresh: true)`**Trust Store**`FileTrustStore` with configurable `TrustPolicy`, auto-accept modes, and certificate management**Type Discovery**`discoverDataTypes()` auto-detects custom server structures**Auto-Publish**Daemon auto-publishes for sessions with subscriptions, dispatches PSR-14 events to Symfony listeners**Auto-Connect**Per-connection `auto_connect` with declarative `subscriptions` config — daemon sets up monitoring on startup**Subscription Management**`createMonitoredItems()`, `modifyMonitoredItems()`, `setTriggering()`, `transferSubscriptions()`**MockClient**Test without a server — register handlers, assert calls**Timeout &amp; Retry**Per-connection `timeout`, `auto_retry` via YAML config**Auto-Batching**`readMulti`/`writeMulti` transparently split when exceeding server limits**Recursive Browse**`browseAll()`, `browseRecursive()` with depth control and cycle detection**Path Resolution**`resolveNodeId('/Objects/Server/ServerStatus')`**Security**10 policies (RSA + ECC), 3 auth modes, auto-generated certs, certificate trust management**History Read**Raw, processed, and at-time historical queries**Typed Returns**All service responses return `public readonly` DTOs> **ECC disclaimer:** ECC security policies (`ECC_nistP256`, `ECC_nistP384`, `ECC_brainpoolP256r1`, `ECC_brainpoolP384r1`) are fully implemented and tested against the OPC Foundation's UA-.NETStandard reference stack. However, no commercial OPC UA vendor supports ECC endpoints yet. When using ECC, client certificates are auto-generated if `client_certificate`/`client_key` are omitted, and username/password authentication uses the `EccEncryptedSecret` protocol automatically.

Documentation
-------------

[](#documentation)

Full documentation is available in [`docs/`](docs/index.md). Highlights:

SectionCovers**Getting started** — [Overview](docs/overview.md) · [Installation](docs/getting-started/installation.md) · [Quick start](docs/getting-started/quick-start.md) · [How symfony-opcua fits](docs/getting-started/how-symfony-opcua-fits.md) · [Upgrading](docs/getting-started/upgrading.md)Concepts, install, first connection**Configuration** — [Bundle YAML](docs/configuration/bundle-yaml.md) · [Connections](docs/configuration/connections.md) · [Environment variables](docs/configuration/environment-variables.md) · [Security](docs/configuration/security.md) · [Session manager](docs/configuration/session-manager.md) · [Parameters &amp; overrides](docs/configuration/parameters-and-overrides.md)YAML, env, named connections**Using the client** — [Manager vs interface](docs/using-the-client/manager-vs-interface.md) · [Named connections](docs/using-the-client/named-connections.md) · [Ad-hoc connections](docs/using-the-client/ad-hoc-connections.md) · [Connection lifecycle](docs/using-the-client/connection-lifecycle.md) · [Using builders](docs/using-the-client/using-builders.md)Manager service, DI, lifecycle**Operations** — [Reading](docs/operations/reading.md) · [Writing](docs/operations/writing.md) · [Browsing](docs/operations/browsing.md) · [Method calls](docs/operations/method-calls.md) · [Subscriptions](docs/operations/subscriptions.md) · [History](docs/operations/history.md)Read/write, browse, subscribe, history**Session manager** — [Overview](docs/session-manager/overview.md) · [Starting the daemon](docs/session-manager/starting-the-daemon.md) · [Auto-publish](docs/session-manager/auto-publish.md) · [Production supervisor](docs/session-manager/production-supervisor.md) · [Monitoring](docs/session-manager/monitoring-the-daemon.md)Persistent sessions via daemon**Events** — [Overview](docs/events/overview.md) · [Connection events](docs/events/connection-events.md) · [Data events](docs/events/data-events.md) · [Alarm events](docs/events/alarm-events.md) · [Async listeners with Messenger](docs/events/async-listeners-with-messenger.md)PSR-14 + Symfony EventDispatcher**Observability** — [Logging](docs/observability/logging.md) · [Caching](docs/observability/caching.md) · [Debugging](docs/observability/debugging.md) · [Profiler &amp; data collectors](docs/observability/profiler-and-data-collectors.md)Logs, cache, profiler**Security** — [Policies &amp; modes](docs/security/policies-and-modes.md) · [Credentials](docs/security/credentials.md) · [Certificates](docs/security/certificates.md) · [Trust store](docs/security/trust-store.md)Security policies, certs, trust**Testing** — [PHPUnit &amp; Pest setup](docs/testing/phpunit-and-pest-setup.md) · [Mocking the manager](docs/testing/mocking-the-manager.md) · [Using MockClient](docs/testing/using-mock-client.md) · [Kernel tests](docs/testing/kernel-tests.md)Unit + kernel tests**Integrations** — [Messenger](docs/integrations/messenger.md) · [Mercure](docs/integrations/mercure.md) · [Doctrine](docs/integrations/doctrine.md) · [Twig](docs/integrations/twig.md) · [Console &amp; scheduler](docs/integrations/console-and-scheduler.md) · [Notifier](docs/integrations/notifier.md)Symfony ecosystem**Reference** — [OpcuaManager API](docs/reference/opcua-manager-api.md) · [Bundle services](docs/reference/bundle-services.md) · [Console commands](docs/reference/console-commands.md) · [Exceptions](docs/reference/exceptions.md)Public API**Recipes** — [Persistent tag history](docs/recipes/persistent-tag-history.md) · [Alarm routing](docs/recipes/alarm-routing.md) · [Mercure dashboard](docs/recipes/mercure-realtime-dashboard.md) · [Multi-plant tenant](docs/recipes/multi-plant-tenant.md) · [Companion specs](docs/recipes/using-companion-specs.md) · [Dev with Docker](docs/recipes/dev-with-docker.md) · [Production deployment](docs/recipes/production-deployment.md)Task-oriented walkthroughsTesting
-------

[](#testing)

144+ unit tests with **99%+ code coverage**. Integration tests run against [uanetstandard-test-suite](https://github.com/php-opcua/uanetstandard-test-suite) — a Docker-based OPC UA environment built on the OPC Foundation's UA-.NETStandard reference implementation — in both direct and managed (daemon) modes.

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

Ecosystem
---------

[](#ecosystem)

PackageDescription[opcua-client](https://github.com/php-opcua/opcua-client)Pure PHP OPC UA client[opcua-cli](https://github.com/php-opcua/opcua-cli)CLI tool — browse, read, write, watch, discover endpoints, manage certificates, generate code from NodeSet2.xml[opcua-session-manager](https://github.com/php-opcua/opcua-session-manager)Daemon-based session persistence across PHP requests. Keeps OPC UA connections alive between short-lived PHP processes via a ReactPHP daemon and Unix sockets.[opcua-client-nodeset](https://github.com/php-opcua/opcua-client-nodeset)Pre-generated PHP types from 51 OPC Foundation companion specifications (DI, Robotics, Machinery, MachineTool, ISA-95, CNC, MTConnect, and more). 807 PHP files — NodeId constants, enums, typed DTOs, codecs, registrars with automatic dependency resolution.[laravel-opcua](https://github.com/php-opcua/laravel-opcua)Laravel integration — service provider, facade, config[symfony-opcua](https://github.com/php-opcua/symfony-opcua)Symfony integration — bundle, autowiring, YAML config (this package)[uanetstandard-test-suite](https://github.com/php-opcua/uanetstandard-test-suite)Docker-based OPC UA test servers (UA-.NETStandard) for integration testingCommunity
---------

[](#community)

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

**Connected a PLC, SCADA system, or OPC UA server?** We're building a community-driven list of tested hardware and software. Share your experience in [Tested Hardware &amp; Software](https://github.com/php-opcua/symfony-opcua/discussions/categories/tested-hardware-software) — even a one-liner like "Siemens S7-1500, works fine" helps other users know what to expect.

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

[](#contributing)

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

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, autowiring, configuration, session manager. Optimized for LLM context windows with minimal token usage.[`llms-full.txt`](llms-full.txt)Comprehensive technical reference — every config key, method, DTO, event, trust store, managed client. For deep dives and complex questions.[`llms-skills.md`](llms-skills.md)Task-oriented recipes — step-by-step instructions for common tasks (install, read, write, browse, named connections, session manager, security, testing, events). Written so an AI can generate correct, production-ready code from a user's intent.**How to use:** copy the files you need into your project's AI configuration directory. The files are located in `vendor/php-opcua/symfony-opcua/` after `composer install`.

- **Claude Code**: reference per-session with `--add-file vendor/php-opcua/symfony-opcua/llms-skills.md`
- **Cursor**: copy into your project's rules directory — `cp vendor/php-opcua/symfony-opcua/llms-skills.md .cursor/rules/symfony-opcua.md`
- **GitHub Copilot**: copy or append the content into your project's `.github/copilot-instructions.md` file (create the file and directory if they don't exist). Copilot reads this file automatically for project-specific context
- **Other tools**: paste the content into your system prompt, project knowledge base, or context configuration

Versioning
----------

[](#versioning)

This package follows the same version numbering as [`php-opcua/opcua-client`](https://github.com/php-opcua/opcua-client). Each release of `symfony-opcua` is aligned with the corresponding release of the client library to ensure full compatibility.

Changelog
---------

[](#changelog)

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

License
-------

[](#license)

[MIT](LICENSE)

###  Health Score

41

—

FairBetter than 87% of packages

Maintenance97

Actively maintained with recent releases

Popularity3

Limited adoption so far

Community7

Small or concentrated contributor base

Maturity48

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

Every ~17 days

Total

3

Last Release

23d 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 (15 commits)")

---

Tags

opc-uaopc-ua-clientsymfonysymfony-bundle

###  Code Quality

TestsPest

### Embed Badge

![Health badge](/badges/php-opcua-symfony-opcua/health.svg)

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

###  Alternatives

[easycorp/easyadmin-bundle

Admin generator for Symfony applications

4.3k17.5M370](/packages/easycorp-easyadmin-bundle)[shopware/core

Shopware platform is the core for all Shopware ecommerce products.

585.4M506](/packages/shopware-core)

PHPackages © 2026

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