Fast, Secure & Scalable Streaming Integration
Use a Hosted Backend (proxy layer) with Composer to unify auth, token exchange & iframe embedding while minimizing key exposure.
Centralized proxy hides long‑term keys, enforces origin controls and enables unified rotation.
📦 Composer ReleaseInstall & update via Composer to avoid manual packaging.
🔒 Zero Key Exposure ⚡ Instant EmbedQuick Start
4 steps to minimum viable integration (MVI)
Create Backend
Configure hosted backend
The "Hosted Backend" page will automatically generate the corresponding backend endpoint and configuration for you. Simply follow the UI to create it, copy the generated endpoint, and use it in your server-side code.
- Go to "Hosted Backends" management page
- Click "New Backend"
- Enter meaningful label name (e.g. production-api)
- Copy the generated backend endpoint
Prepare user credentials (user_id / password)
Use the Console "Users" section to create or select an account and obtain its user_id and password for WLSDK::setup().
- In navigation click "Users" to open the list.
- Create or select an account and note its user_id in the detail view.
- Set or confirm the account password (store internally only).
- Use this user_id / password when initializing WLSDK::setup().
Install PHP SDK
Install WebLiveHub PHP SDK via Composer
composer require weblivehub/sdk
Initialize SDK Client + Stream Token Generation & Embed
Configure base SDK settings & dependencies
Use the configured SDK to integrate player & dynamic auth.
Integration Flow Overview
AUTH_USER_ID:Identifier used to authenticate with the backend or obtain a Token. It may be a viewer or a streamer depending on the selected hostLabel.AUTH_PASSWORD:The password or secret corresponding to AUTH_USER_ID. Store securely on the server; never hardcode in frontend or sample code.STREAMER_USER_ID:Streamer identifier (user_id).HOSTED_BACKEND_ENDPOINT:Hosted Backend endpoint URL (shown as a placeholder in examples; in practice configure via environment or server settings).
- Create hosted backend: obtain dedicated backend endpoint.
- Composer install:
composer require weblivehub/sdk-php - WLSDK::setup() config:
- set
hb_endpoint(backend URL from step 1) - provide
user_idandpassword(user auth)
- set
- Output iframe: single = iframe(); multiple/deferred = lazyIframe().
- Done: token & auth exchange handled internally.
Single Iframe Stream Embed
Use WLSDK::iframe() for a single stream; supports custom attributes.
<?php
// === Initialize SDK Client ===
// Include WebLiveHub SDK class
require_once __DIR__ . '/vendor/autoload.php';
use WebLiveHub\SDK\WLSDK;
// Initialize SDK configuration (must complete before first call)
WLSDK::setup([
'hb_endpoint' => getenv('WL_HOSTED_BACKEND_URL') ?: '<HOSTED_BACKEND_ENDPOINT>',
'user_id' => '<AUTH_USER_ID>',
'password' => '<AUTH_PASSWORD>'
]);
?><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>WebLiveHub Single Stream Example</title>
<style>
/* Set stream container styles */
#stream-container {
width: 800px;
height: 450px;
border: 1px solid #ccc;
display: block;
}
</style>
<?php
// Load official JS SDK (contains frontend logic needed for iframe/lazyIframe)
echo WLSDK::script();
?>
</head>
<body>
<?php
echo WLSDK::iframe([
'hostLabel' => 'connect', // Hosted Backend label (connect/live/live-client etc)
'streamer' => '<STREAMER_USER_ID>', // Target streamer's user_id
'attrs' => [ 'id' => 'stream-container', 'class' => 'wlh-stream', 'style' => 'border-radius:6px;' ]
]);
?>
</body>
</html>
Multiple Iframes Lazy Loading
Use WLSDK::lazyIframe() for multi‑stream display with lazy loading & responsive layout.
<?php
// === Initialize SDK Client ===
// Include WebLiveHub SDK class
include_once __DIR__.'/vendor/autoload.php';
use WebLiveHub\SDK\WLSDK;
// Initialize SDK configuration
WLSDK::setup([
'hb_endpoint' => getenv('WL_HOSTED_BACKEND_URL') ?: '<HOSTED_BACKEND_ENDPOINT>',
'user_id' => '<AUTH_USER_ID>',
'password' => '<AUTH_PASSWORD>',
]);
?><!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8" />
<title>Multi Stream Showcase</title>
<style>body{font-family:system-ui,Arial,sans-serif;margin:24px;background:#fafafa;} .grid{display:grid;gap:20px;grid-template-columns:repeat(auto-fill,minmax(340px,1fr));} .card{background:#fff;padding:12px;border:1px solid #ddd;border-radius:8px;box-shadow:0 2px 3px rgba(0,0,0,.05);} .card h2{font-size:15px;margin:0 0 8px;} </style>
<?php
// Load official JS SDK (contains frontend logic needed for iframe/lazyIframe)
echo WLSDK::script();
?>
</head>
<body>
<h1>Multiple Live Rooms</h1>
<!-- // === Stream token generation & embed === -->
<!-- // Generate multiple lazy-loaded stream players -->
<div class="grid">
<div class="card">
<h2>Streamer #1</h2>
<div>
<?php
// Lazy load (SDK auto-generates token & embeds)
echo WLSDK::lazyIframe([
'hostLabel' => 'connect', // Hosted Backend label
'streamer' => '<STREAMER_1_USER_ID>' // Streamer user_id
]);
?>
</div>
</div>
<div class="card">
<h2>Streamer #2</h2>
<div>
<?php
// Second stream (different streamer; SDK generates corresponding token)
echo WLSDK::lazyIframe([
'hostLabel' => 'connect', // Same hosted backend
'streamer' => '<STREAMER_2_USER_ID>' // Different streamer user_id
]);
?>
</div>
</div>
</div>
</body>
</html>
🌐 Multi-language integration (optional)
If your site offers multiple interface languages, you can pass a lang parameter when calling WLSDK to keep the player language consistent with the page. When not specified: WLSDK first reads the execution environment language (in the Console this is the current UI locale, default zh-Hant); if unavailable it falls back to English (en).
- Player supported language codes: en, ja, zh-Hant, zh-Hans, vi (Console UI currently supports: en, zh-Hant, es). If the environment language is not in the player list it automatically falls back to en.
- When calling WLSDK::iframe() or WLSDK::lazyIframe(), add lang => '
' to the parameter array.
Example: Set player language to Traditional Chinese
The following example shows specifying lang => 'zh-Hant' in a single iframe call; in practice you can use a dynamic variable.
<?php
// Example: specify the player language in the iframe call
echo WLSDK::iframe([
'hostLabel' => 'connect',
'streamer' => '<STREAMER_USER_ID>',
'lang' => 'zh-Hant',
'attrs' => [
'id' => 'stream-container',
'class' => 'wlh-stream',
'style' => 'border-radius:6px;'
]
]);
🔔 Listen to player events
The WLSDK-generated player is not just a static iframe; you can register frontend handlers for ready, ended, and page_unloading to integrate UI logic or logging.
- Recommended: bind events on the frontend with WLSDK_attachIframeEventsById(
, handlers). Output a named id in PHP, then bind using the same id in JS. - The same binding works for players created by WLSDK::iframe() and WLSDK::lazyIframe().
- ready: Player loaded and ready (fires when internal handshake begins).
- ended: Playback ended (live finished or VOD reached the end).
- page_unloading: Embedded page is unloading (tab close, refresh, or navigate away).
Example: Listen to ready / ended / page_unloading events
The example shows common event handling; a generic message hook is also provided to receive other message types (handler signature function(payload, type)).
<?php
// Example: bind events by element id (recommended)
echo WLSDK::iframe([
'hostLabel' => 'connect',
'streamer' => '<STREAMER_USER_ID>',
'attrs' => [
'id' => 'stream-with-events',
'class' => 'wlh-stream',
],
]);
?>
<script>
(function(){
WLSDK_attachIframeEventsById('stream-with-events',{
'ready': function(){ console.log('player ready'); },
'ended': function(){ console.log('playback ended'); },
'page_unloading': function(){ console.log('iframe page unloading'); },
});
})();
</script>
Handlers execute as plain JavaScript; avoid injecting unfiltered user input into strings to reduce XSS risk.
🏷️ What is hostLabel?
live = Host (broadcaster) view (publish / control).
live-client = Viewer side view (watch / interact).
connect = Test / generic connection & quick integration (default sample).
Add custom labels as needed; code passes only the label while backend resolves role/behavior.
- Frontend only supplies label; backend resolves role & node automatically.
| Label | Role | Free |
|---|---|---|
| live | host | YES |
| connect | host | YES |
| live-client | viewer | YES |
⚡ Advanced Features
-
Real‑time Analytics
Provides latency, request volume and error ratio overview (not a full report) to assist troubleshooting.
-
Vertical & Horizontal Scaling
Supports multi‑node / multi‑region deployment and edge/cache tiers for elastic scaling.
🔐 Security Notes
-
Long‑term Key Protection
All long-term keys remain on the server; the frontend only uses short-lived authorization results, avoiding storing raw secrets in the browser.
-
HTTPS & CORS Control
Use HTTPS in production and restrict allow_origins; avoid prolonged * usage.
-
Token Lifecycle
Lifecycle and renewal are managed by the platform backend automatically; typical integrations do not require an extra manual refresh flow.
WordPress Integration Guide
WebLiveHub Stream (block-first) documentation
This page focuses on the PHP SDK integration path. If you’re integrating with WordPress, use the dedicated guide:
WordPress Plugin Integration GuideTip: If you had bookmarks to #wordpress-plugin, update them to wordpress_integration_guide.html.