Download the PHP package ultraembeddedlab/php-iot without Composer
On this page you can find all versions of the php package ultraembeddedlab/php-iot. It is possible to download/install these versions without Composer. Possible dependencies are resolved automatically.
Download ultraembeddedlab/php-iot
More information about ultraembeddedlab/php-iot
Files in ultraembeddedlab/php-iot
Package php-iot
Short Description Modern, production-grade MQTT 3.1.1 & 5 client for PHP 8.4+
License MIT
Homepage https://github.com/UltraEmbeddedLab/php-iot
Informations about the package php-iot
PHP IoT MQTT Client
Modern, production-grade MQTT 3.1.1 & 5.0 client for PHP 8.4+
Features
- Modern PHP 8.4+ with strict types and modern syntax
- MQTT 3.1.1 & 5.0 protocol support
- TLS 1.2+ & mutual TLS (mTLS) — TLS 1.0/1.1 refused by default (RFC 8996); typed
TlsOptionsfor client certificates, CA verification and ALPN - WebSocket transport (
ws://) with RFC 6455 framing —wss://is not functional yet, see Known Limitations - Auto-reconnect with exponential backoff and jitter
- QoS 0, 1, 2 with automatic resend on ACK timeout
- Session persistence for reliable message delivery
- Rate limiter (token bucket) to prevent broker flooding
- Offline message queue with automatic drain on reconnect
- Topic aliases (MQTT 5.0)
- Flow control (MQTT 5.0)
- Shared subscriptions (MQTT 5.0)
- Byte counters for traffic monitoring (
bytesSent()/bytesReceived()) - PSR-3 logging support
- PSR-14 event dispatcher support
Requirements
- PHP 8.4 or higher
ext-json(bundled with PHP and not removable since 8.0)ext-openssl— only for TLS (mqtts://,wss://). Plain TCP works without it.
No other extensions are needed: all I/O goes through PHP's stream functions.
Installation
Install via Composer:
Upgrading from
ultraembeddedlab/php-iot1.x? The package was renamed in 2.0 — the PHP namespace is unchanged, so nousestatement moves. See UPGRADE.md.
Quick Start
Simple Publish (Fire and Forget)
The easiest way to publish a message:
Publish with TLS and Authentication
Using MQTT 5.0
Subscribe to Topics
For more complex use cases, use the full client:
Long-Running Connection
Use the Mqtt::connect() method for sessions that need to publish multiple messages:
Configuration Options
Client Options
| Option | Type | Default | Description |
|---|---|---|---|
host |
string | required | MQTT broker hostname |
port |
int | 1883 |
Broker port. Not derived from TLS — pass 8883 yourself. (Easy\Mqtt::publish() auto-detects; Options does not.) |
version |
MqttVersion | V3_1_1 | MQTT protocol version |
clientId |
string | '' |
Client identifier. Empty means the broker assigns one, which MQTT 3.1.1 allows only with cleanSession: true. Easy\Mqtt generates one for you. |
keepAlive |
int | 60 | Keep alive interval in seconds (0–65535). A broker that sends Server Keep Alive in CONNACK overrides this. |
pingResponseTimeout |
float | 10.0 | How long to wait for a PINGRESP before treating the connection as dead and closing it |
cleanSession |
bool | true | Start with clean session |
username |
string | null | Authentication username |
password |
string | null | Authentication password |
will |
?WillOptions | null | Last Will and Testament |
autoReconnect |
bool | false | Reconnect with exponential backoff — see withAutoReconnect() |
offlineQueueSize |
int | 0 | Publishes buffered while disconnected, drained on reconnect (0 = off) |
rateLimiter |
?RateLimiter | null | Token-bucket throttle for outbound publishes |
sessionStore |
?SessionStoreInterface | null | Persist subscriptions across restarts (use with cleanSession: false) |
topicAliasMaximum |
int | 0 | MQTT 5 topic aliases to request (0 = disabled) |
receiveMaximum |
int | 65535 | MQTT 5 flow-control window |
ackTimeout |
float | 5.0 | Timeout (seconds) waiting for QoS 1/2 ACK before resend |
maxResendAttempts |
int | 3 | Max resend attempts for unacknowledged QoS 1/2 messages |
maximumPacketSize |
int | 16 MiB | Largest accepted inbound packet; also sent as MQTT 5 property 0x27 |
inboundQueueSize |
int | 1000 | Bound on the awaitMessage()/messages() queue (0 = unlimited) |
Publish Options
| Option | Type | Default | Description |
|---|---|---|---|
qos |
QoS | AtMostOnce | Quality of Service level |
retain |
bool | false | Retain message on broker |
properties |
array | null | MQTT 5.0 properties |
TLS Configuration
Simple TLS (server verification only):
withHost('other-broker')resets the port to 1883. When changing host on an existingOptions, pass both:withHost('other-broker', 8883).
Mutual TLS with client certificate (AWS IoT, Azure IoT Hub):
MQTT over port 443 with ALPN (when 8883 is blocked):
Self-signed certificates (development):
| TlsOptions Method | Description |
|---|---|
withCaFile(?string) |
CA certificate file for server verification |
withCaPath(?string) |
Directory of CA certificates |
withClientCertificate(?string, ?string, ?string) |
Client cert, key, and optional passphrase |
withAlpn(?string) |
ALPN protocol (e.g., 'mqtt' for port 443) |
withVerifyPeer(bool) |
Verify server certificate (default: true) |
withVerifyPeerName(bool) |
Verify server hostname (default: true) |
withAllowSelfSigned(bool) |
Allow self-signed certs (default: false) |
withPeerName(?string) |
Override peer name for SNI |
withSni(bool) |
Enable/disable SNI (default: true) |
withCryptoMethod(int) |
Override negotiated TLS versions (bitmask of STREAM_CRYPTO_METHOD_*_CLIENT) |
TLS 1.2 and 1.3 only, by default. PHP's own
STREAM_CRYPTO_METHOD_TLS_CLIENTstill enables TLS 1.0 and 1.1, which RFC 8996 marks MUST NOT and PCI-DSS prohibits. This client refuses them unless you widen the policy explicitly:Legacy
arraysyntax is still supported for backward compatibility:$options->withTls(['ssl' => ['verify_peer' => true]])
MQTT 5.0 Features
Topic Aliases
Topic aliases replace a repeated topic string with a two-byte integer. They are managed
automatically — request a budget on Options, then publish normally:
The broker's topic_alias_maximum in CONNACK overrides your request; if it advertises 0,
aliasing is disabled and publishes fall back to full topic strings.
Do not set the
topic_aliasproperty by hand onPublishOptions. Aliases are connection-scoped and negotiated — a hand-set value is either overwritten by the client or rejected by the broker with reason code 0x94 (Topic Alias Invalid).
Message Expiry
Set expiration time for messages:
User Properties
Attach custom metadata to messages:
Error Handling
Every error this library raises extends ScienceStories\Mqtt\Exception\MqttException,
which extends RuntimeException — so a single catch covers the whole surface.
| Exception | Raised when |
|---|---|
AuthenticationError |
The broker refused the credentials (CONNACK 4/5 on 3.1.1, 0x86/0x87 on MQTT 5) |
ServerError |
The broker is unavailable, busy, or shutting down |
QuotaExceeded |
A broker rate or quota limit was hit |
ProtocolError |
A malformed packet, an oversized packet, or an invalid local configuration |
Timeout |
No ACK or data arrived within the deadline |
TransportError |
Socket or TLS failure — connection refused, closed by peer, handshake failed |
connect() throws rather than returning a failed result, so a refused connection cannot
be mistaken for a live one:
A long-running loop should survive transient failures rather than dying on the first one:
With withAutoReconnect() enabled, loopOnce() re-establishes the connection and
re-subscribes on its own; it returns false while disconnected rather than throwing.
Known Limitations
Stated up front rather than discovered in production:
wss://does not work.WsTransportperforms the HTTP upgrade before TLS can be enabled, so onlyws://completes a handshake.ws://itself has no test coverage yet.- Inbound MQTT 5 topic aliases are not resolved. If a broker sends aliased PUBLISH
packets, the topic arrives empty. Leave
withTopicAliasMaximum()at 0 (the default). - Acknowledgement reason codes are not acted on. A PUBACK or SUBACK carrying a failure code is logged, not raised — a rejected subscription looks successful.
- The client is blocking. There is no ReactPHP/Amp adapter yet; run it in a dedicated process or worker.
- No Laravel or Symfony bridge yet.
See CHANGELOG.md for what changed and what is planned.
Documentation
- Upgrading from 1.x — what changed in 2.0 and how to migrate
- Backward Compatibility Promise — what semver covers here
- Roadmap — what is planned, and where help is wanted
Feature guides in docs/:
- Testing — unit-test your MQTT code with
InMemoryTransport, no broker needed - Flow Control — MQTT 5 receive-maximum and in-flight limits
- Session Persistence — surviving restarts with
cleanSession: false - Shared Subscriptions —
$share/load balancing across consumers - Topic Aliases — MQTT 5 bandwidth optimisation
- Server Disconnect — reacting to a broker-initiated DISCONNECT
Examples
Check the examples/ directory for complete working examples:
- Basic connect/publish/subscribe (MQTT 3.1.1 and 5.0)
- QoS 0, 1, 2 demonstrations
- mTLS with client certificates (
tls_mtls_example.php+ cert generation script) - Session persistence, shared subscriptions, topic aliases
- Flow control, server disconnect handling
Testing
Contributing
Contributions are welcome! Please see CONTRIBUTING.md for details.
License
PHP IoT MQTT Client is open-sourced software licensed under the MIT license.
Credits
Developed by Bogdan Gewald.
UltraEmbeddedLab is the publishing organisation for this package; copyright is held by Bogdan Gewald, as stated in LICENSE.md. Contributions are accepted under the Developer Certificate of Origin — inbound licence equals outbound licence, MIT. There is no copyright assignment and no CLA.
The PHP namespace is ScienceStories\Mqtt\ for historical reasons: the package was
originally published as science-stories/php-iot. It is unchanged for backwards
compatibility and is scheduled to be renamed in 3.0 with class_alias() shims — see
ROADMAP.md.
All versions of php-iot with dependencies
ext-sockets Version *
psr/log Version ^3.0.2
psr/event-dispatcher Version ^1.0