Configuration & Environment (`.env`)
Settings in the root .env file control the framework's behavior globally. Under our
architecture, no monolithic App instantiation is required—all
configuration properties are parsed into static memory upon boot via Core\Config (`_core/Config.php`).
In production, running php cli.php optimize pre-compiles these settings directly into an OPcache-ready PHP array (`_core/cache/env.php`) for zero runtime parsing overhead.
# Application Profile & Ports
APP_NAME=LilaPHP
APP_ENV=production
APP_DEBUG=false
APP_URL=http://localhost:8080
HTTP_PORT=8080
PROD_HTTP_PORT=80
# Multi-Driver Database (Default: MySQL | Optional: SQLite)
DB_TYPE=mysql
DB_HOST=mysql
DB_PORT=3306
DB_NAME=lilaphp
DB_USER=root
DB_PASSWORD=secret
# For SQLite:
# DB_TYPE=sqlite
# DB_FILE=app/database/app.sqlite
# Dual-Tier Cache & Redis
REDIS_HOST=redis
REDIS_PORT=6379
REDIS_PASSWORD=
CACHE_DRIVER=auto # Tiered: APCu -> Redis -> File
DB_CACHE_DRIVER=file
# Universal AI Engine Configuration
AI_PROVIDER=deepseek
API_IA_KEY=
OPENAI_API_KEY=
GEMINI_API_KEY=
DEEPSEEK_API_KEY=
ANTHROPIC_API_KEY=
OLLAMA_BASE_URL=http://localhost:11434
# Security & DDoS Protection
APP_KEY="base64:..." # Generated via: php cli.php key:generate
CORS_ALLOWED_ORIGINS=*
RATE_LIMIT=200
RATE_LIMIT_WINDOW=60
LOG_ENABLED=false
DEBUG_LOGGING_ENABLED=false
Direct Execution Architecture
In traditional PHP frameworks, developers instantiate a monolithic object like
new App(['security' => ...]) on every single HTTP request. This approach creates
unnecessary CPU allocation, redundant configuration parsing, and dependency injection overhead.
LilaPHP's Paradigm: When Nginx dispatches a request (`/api/ping` or `/about`) to `public/index.php`, our ultra-lightweight bootstrap (`_core/bootstrap.php`) instantly wires all static helpers (`Response`, `View`, `Cache`, `Database`, `Validate`) into shared process memory via OPcache preloading (`app/preload.php`). Your physical endpoint (`app/routes/about.php` or `app/routes/api/ping.php`) executes immediately without class instantiation wrappers or middleware loops.
<?php
use Core\Response;
use Core\Validate;
$clean = Validate::assert($_REQUEST, ['email' => 'required|email']);
Response::json(['status' => 'success', 'data' => $clean]);
Core API Components (`_core/`)
LilaPHP provides high-speed static and singleton core utilities tailored specifically for JSON APIs, database pooling, background tasks, and anti-malware security.
`Core\Database` & `Core\Cache`
Database::getInstance() maintains an active, reusable PDO connection pool
across requests. Cache delivers dual-tier speed (`Cache::api()` for local APCu
RAM, and `Cache::db()` for distributed Redis).
use Core\Database;
use Core\Cache;
use Core\Response;
$items = Cache::api('active_items', function() {
$pdo = Database::getInstance();
$stmt = $pdo->query("SELECT * FROM items WHERE status = 'active'");
return $stmt->fetchAll();
}, 60);
Response::json(['items' => $items]);
`Core\View`
View::render() provides native PHP template rendering with layout wrapping (app/views/layout.php), partial components, tiered multi-driver caching, SEO metadata injection, and development hot reload.
use Core\View;
View::render('about', [
'team' => $teamMembers
], [
'title' => 'About Us — LilaPHP',
'cache' => 300
]);
`Core\Validate` & `Core\Response`
Validate::assert() inspects payload inputs (using
$_REQUEST['lang'] for localized error messages) and halts execution instantly
on invalid payloads. Response::json() outputs clean JSON with automated CORS
and HTTP status headers.
use Core\Validate;
use Core\Response;
$data = Validate::assert($_REQUEST, [
'username' => 'required|min:3',
'age' => 'required|numeric'
]);
Response::json(['status' => 'created', 'user' => $data], 201);
`Core\Upload` & `Core\Task`
Upload::save() provides anti-malware MIME scanning and blocks embedded PHP
scripts. Task::dispatch() pushes long-running jobs to background Redis queues
or OS execution threads without slowing down your API endpoints.
use Core\Upload;
use Core\Task;
$savedFile = Upload::save($_FILES['document'], null, ['application/pdf' => 'pdf']);
if ($savedFile) {
Task::dispatch('process_pdf_document', ['filename' => $savedFile]);
}