Fonctions PHP
OxPHP enregistre ses fonctions via l'extension oxphp_sapi, qui se charge automatiquement pour chaque script PHP exécuté par le serveur. Aucune directive extension= ni aucun chargement manuel n'est requis. Chaque fonction listée ici est disponible dès la première ligne de votre code PHP.
Table des matières
- oxphp_http_request()
- oxphp_superglobals_enabled()
- oxphp_request_id()
- oxphp_worker_id()
- oxphp_server_info()
- oxphp_finish_request()
- oxphp_is_worker()
- oxphp_worker()
- oxphp_is_streaming()
- oxphp_stream_flush()
- oxphp_sleep()
- oxphp_usleep()
- oxphp_async()
- oxphp_async_await()
- oxphp_async_await_all()
- oxphp_async_await_race()
- oxphp_async_await_any()
- oxphp_register_decorator()
- oxphp_apm_trace()
- oxphp_apm_start()
- oxphp_apm_end()
- oxphp_apm_attribute()
- oxphp_apm_event()
- oxphp_apm_error()
- oxphp_apm_status()
- oxphp_apm_trace_id()
- oxphp_apm_span_id()
- oxphp_apm_header()
- OxPHP\Profile\is_active()
- OxPHP\Profile\start()
- OxPHP\Profile\stop()
- OxPHP\Profile\pause()
- OxPHP\Profile\resume()
- OxPHP\Profile\mark()
- OxPHP\Profile\metric()
- Classes et interfaces
- Exceptions
oxphp_http_request()
oxphp_http_request(): \OxPHP\Http\RequestRenvoie l'objet requête de la requête HTTP courante. L'objet fournit un accès typé à la méthode HTTP, à l'URI, aux paramètres de requête, au corps analysé, aux en-têtes, aux cookies, aux fichiers téléversés, à l'IP du client et au timing de la requête.
Renvoie : une instance \OxPHP\Http\Request adossée aux données de requête du thread worker PHP courant.
Lève : une exception de l'espace de noms OxPHP\Http\Exception lorsqu'elle est appelée en dehors d'une requête active :
| Exception | Situation |
|---|---|
\OxPHP\Http\Exception\WorkerIdleException |
Mode worker, entre deux requêtes |
\OxPHP\Http\Exception\AsyncContextException |
À l'intérieur d'un callback oxphp_async() |
\OxPHP\Http\Exception\NoActiveRequestException |
Tout autre contexte sans requête active |
Dans le code normal de traitement des requêtes, aucune gestion d'exception n'est requise.
Exemple :
<?php
$request = oxphp_http_request();
$method = $request->method(); // "POST"
$path = $request->path(); // "/api/users"
$email = $request->payload('email'); // from JSON or form body
$token = $request->header('Authorization');
$theme = $request->cookie('theme', 'light');Pour la référence complète de l'interface, consultez la documentation HTTP Request API.
oxphp_superglobals_enabled()
oxphp_superglobals_enabled(): boolIndique si le remplissage des superglobales est activé pour cette instance de serveur. La valeur reflète la variable d'environnement SUPERGLOBALS_ENABLED et ne change pas pendant la durée de vie du serveur.
Lorsqu'elle vaut false, $_GET, $_POST, $_COOKIE, $_FILES et $_SERVER sont des tableaux vides. L'API objet HTTP (oxphp_http_request()), php://input et les fonctions de session PHP ne sont pas affectés.
Renvoie : true lorsque SUPERGLOBALS_ENABLED vaut true (la valeur par défaut), false sinon.
Exemple :
<?php
if (oxphp_superglobals_enabled()) {
$query = $_GET['page'] ?? 1;
} else {
$query = oxphp_http_request()->query('page', 1);
}oxphp_request_id()
oxphp_request_id(): stringRenvoie l'identifiant unique de la requête courante. Il s'agit de la même valeur envoyée dans l'en-tête de réponse X-Request-ID. Si le client envoie un en-tête X-Request-ID, OxPHP le transmet tel quel au lieu d'en générer un nouveau.
Renvoie : une chaîne hexadécimale de 20 caractères lorsque OxPHP génère l'ID (par exemple "67890abc12341a2b0042"). Lorsque le client envoie un en-tête X-Request-ID, cette valeur est renvoyée telle quelle (1 à 64 caractères, alphanumériques plus -, _, .).
Exemple :
<?php
$id = oxphp_request_id();
error_log("[$id] Processing order #1234");
// Propagate the ID to downstream services
header("X-Correlation-ID: $id");oxphp_worker_id()
oxphp_worker_id(): intRenvoie l'indice à base zéro du thread worker PHP qui traite la requête courante. Les indices de worker vont de 0 à PHP_WORKERS - 1.
Renvoie : un entier identifiant le thread worker courant.
Exemple :
<?php
$workerId = oxphp_worker_id();
// Use per-worker temp files to avoid collisions
$tmp = "/tmp/worker_{$workerId}_buffer.dat";
error_log("Worker $workerId handling request");oxphp_server_info()
oxphp_server_info(): arrayRenvoie un tableau associatif contenant les métadonnées du serveur et de la requête.
Renvoie : un tableau avec les clés suivantes :
| Clé | Type | Description |
|---|---|---|
version |
string |
Version du serveur (par exemple "0.10.0") |
worker_id |
int |
Même valeur que oxphp_worker_id() |
request_time |
float |
Horodatage Unix avec précision à la microseconde au moment où la requête a démarré |
worker_mode |
bool |
Indique si le processus courant s'exécute en mode worker |
Exemple :
<?php
$info = oxphp_server_info();
// [
// "version" => "0.10.0",
// "worker_id" => 3,
// "request_time" => 1738800000.123456,
// "worker_mode" => true,
// ]
$elapsed = microtime(true) - $info['request_time'];
echo "Processing took {$elapsed}s so far";oxphp_finish_request()
oxphp_finish_request(): boolVide la réponse vers le client et poursuit l'exécution PHP en arrière-plan. Le client reçoit immédiatement la réponse HTTP complète ; le script continue de s'exécuter jusqu'à ce qu'il se termine naturellement. C'est l'équivalent OxPHP de fastcgi_finish_request() dans PHP-FPM.
Renvoie : true en cas de succès, false si déjà appelée pour cette requête.
Le thread worker PHP reste occupé jusqu'à la fin du script. Gardez le travail d'arrière-plan court ou déchargez les traitements lourds vers une file d'attente.
Exemple :
<?php
http_response_code(202);
echo json_encode(['status' => 'accepted']);
oxphp_finish_request();
// The client already has its 202 response; continue working
send_notification_email($user);
update_analytics($event);oxphp_is_worker()
oxphp_is_worker(): boolIndique si le serveur s'exécute en mode worker. Le mode worker s'active lorsque WORKER_MODE_ENABLED=true.
Renvoie : true en mode worker, false en mode traditionnel.
Exemple :
<?php
if (oxphp_is_worker()) {
// Reuse persistent connections across requests
$db = $GLOBALS['db'] ??= new PDO($dsn);
} else {
// Traditional mode: create a new connection per request
$db = new PDO($dsn);
}oxphp_worker()
oxphp_worker(callable $handler): boolEntre dans la boucle persistante du mode worker. OxPHP appelle $handler une fois pour chaque requête HTTP entrante. Entre deux requêtes, une réinitialisation légère efface l'état propre à la requête — tampons de sortie, en-têtes et superglobales — sans détruire le tas PHP, de sorte que toute variable déclarée en dehors du handler persiste d'une requête à l'autre.
Paramètres :
$handler— Appelé une fois par requête. Le handler ne reçoit aucun argument. Utilisez les superglobales ($_SERVER,$_GET,$_POST, etc.) ouoxphp_http_request()à l'intérieur du handler pour accéder aux données de la requête.
Renvoie : true lors d'un arrêt gracieux, false si vous n'êtes pas en mode worker.
La boucle worker se termine dès que l'une des conditions suivantes est remplie :
- Le serveur s'arrête gracieusement
- Le handler lève 3 exceptions non interceptées ou erreurs fatales consécutives
- Le worker dépasse
WORKER_MAX_MEMORY_MIB - L'application appelle
Worker::scheduleExit()
oxphp_worker() ne fonctionne qu'en mode worker (WORKER_MODE_ENABLED=true). En mode traditionnel, elle consigne un avertissement et renvoie false.
Exemple :
<?php
// worker.php — runs once per worker process lifetime
// Bootstrap: executed once on startup
require __DIR__ . '/vendor/autoload.php';
$app = new App();
// Handle requests in a loop
oxphp_worker(function () use ($app) {
$app->handle();
});
// Code after oxphp_worker() runs during shutdown
$app->terminate();oxphp_is_streaming()
oxphp_is_streaming(): boolIndique si la requête courante est en mode streaming. Le mode streaming s'active au premier appel à oxphp_stream_flush() ou automatiquement lorsque PHP définit Content-Type: text/event-stream.
Renvoie : true si le mode streaming est actif, false sinon.
Exemple :
<?php
if (oxphp_is_streaming()) {
echo "data: " . json_encode($event) . "\n\n";
oxphp_stream_flush();
} else {
echo json_encode($allData);
}oxphp_stream_flush()
oxphp_stream_flush(): boolActive le mode streaming et vide toute sortie mise en tampon vers le client sous forme de chunk HTTP. Au premier appel, les en-têtes HTTP sont envoyés immédiatement et le streaming commence. Chaque appel suivant vide la sortie écrite depuis le dernier vidage.
Renvoie : true en cas de succès, false si oxphp_finish_request() a déjà été appelée.
Le mode streaming s'active aussi automatiquement lorsque PHP définit Content-Type: text/event-stream. Dans ce cas, vous pouvez utiliser la fonction native flush() de PHP, mais appelez d'abord ob_end_flush() pour contourner la couche de mise en tampon de sortie de PHP.
Exemple :
<?php
header('Content-Type: text/event-stream');
header('Cache-Control: no-cache');
for ($i = 0; $i < 10; $i++) {
echo "id: $i\n";
echo "data: " . json_encode(['counter' => $i]) . "\n\n";
oxphp_stream_flush();
oxphp_sleep(1.0); // use oxphp_sleep instead of sleep — does not block the worker in fiber mode
}oxphp_sleep()
oxphp_sleep(float $seconds): voidMet en pause pendant la durée spécifiée. À l'intérieur d'un handler du mode worker s'exécutant dans une Fiber, cet appel est coopératif — il suspend la Fiber courante afin que d'autres requêtes puissent être traitées pendant l'attente. En dehors d'une Fiber, il retombe sur un usleep() bloquant standard.
Paramètres :
$seconds— Durée de la pause en secondes. Les valeurs fractionnaires sont acceptées (par exemple0.5pour 500 millisecondes). Les valeurs de0ou moins retournent immédiatement.
Renvoie : void
Exemple :
<?php
oxphp_worker(function () {
// In worker mode with fiber multiplexing:
// this suspends the fiber rather than blocking the thread
oxphp_sleep(1.0);
echo json_encode(['done' => true]);
});oxphp_usleep()
oxphp_usleep(int $microseconds): voidMet en pause pendant le nombre de microsecondes spécifié. Comme oxphp_sleep(), cet appel est coopératif à l'intérieur d'une Fiber et retombe sinon sur un usleep() bloquant.
Paramètres :
$microseconds— Durée de la pause en microsecondes. Les valeurs de0ou moins retournent immédiatement.
Renvoie : void
Exemple :
<?php
oxphp_worker(function () {
// Poll for a condition every 100ms without blocking other requests
while (!$condition_met()) {
oxphp_usleep(100_000);
}
echo "ready";
});oxphp_async()
oxphp_async(Closure $closure, mixed ...$args): intDistribue une closure pour exécution sur un thread worker asynchrone dédié et renvoie immédiatement un ID de promesse. L'appelant poursuit son exécution sans attendre la fin de la closure. Utilisez oxphp_async_await() pour récupérer le résultat.
Paramètres :
$closure— UneClosuredéfinie par l'utilisateur à exécuter sur un thread worker asynchrone...$args— Arguments à passer à la closure. Les valeurs scalaires (null,bool,int,float,string), les tableaux de celles-ci et les instancesOxPHP\Shared\*(les seuls objets autorisés à franchir la frontière entre threads) sont acceptés. Les ressources et tout objet non-Sharedsont rejetés.
Renvoie : un ID de promesse entier. Passez-le à oxphp_async_await(), oxphp_async_await_all(), oxphp_async_await_race() ou oxphp_async_await_any().
Lève : OxPHP\Async\AsyncException dans les cas suivants :
- Le pool asynchrone est désactivé (
ASYNC_WORKERS=0) — message : "Async pool is disabled. Set ASYNC_WORKERS > 0 to enable." - La closure n'est pas définie par l'utilisateur
- Le pool asynchrone est plein (tous les emplacements de la file sont occupés)
- Les arguments ou les variables
usecontiennent des objets ou des ressources
Les variables capturées via use dans la closure suivent les mêmes restrictions — les objets et les ressources sont rejetés.
Exemple :
<?php
// Dispatch two independent tasks concurrently
$p1 = oxphp_async(function () {
return fetch_from_api('/users');
});
$p2 = oxphp_async(function () {
return fetch_from_api('/posts');
});
// Retrieve both results
$users = oxphp_async_await($p1);
$posts = oxphp_async_await($p2);oxphp_async_await()
oxphp_async_await(int $promise_id, float $timeout = 0.0): mixedBloque jusqu'à ce que la promesse asynchrone spécifiée s'achève et renvoie son résultat. À l'intérieur d'une Fiber du mode worker, cet appel suspend la Fiber courante de manière coopérative plutôt que de bloquer le thread.
Paramètres :
$promise_id— Un ID de promesse renvoyé paroxphp_async()$timeout— Nombre maximal de secondes à attendre.0.0signifie attendre indéfiniment. Par défaut :0.0
Renvoie : la valeur de retour de la closure asynchrone.
Lève :
OxPHP\Async\AsyncExceptionsi le pool asynchrone est désactivé (ASYNC_WORKERS=0), ou si la tâche asynchrone a levé une exceptionOxPHP\Async\TimeoutExceptionsi$timeoutest dépassé
Exemple :
<?php
$promise = oxphp_async(function (int $n) {
return array_sum(range(1, $n));
}, 1_000_000);
$result = oxphp_async_await($promise);
echo $result; // 500000500000
// With timeout
try {
$result = oxphp_async_await($promise, 5.0);
} catch (\OxPHP\Async\TimeoutException $e) {
echo "Task took too long";
}oxphp_async_await_all()
oxphp_async_await_all(array $promise_ids, float $timeout = 0.0): arrayAttend toutes les promesses du tableau et renvoie un tableau associatif faisant correspondre chaque ID de promesse à son résultat. Les promesses sont attendues dans l'ordre du tableau.
Paramètres :
$promise_ids— Un tableau d'ID de promesse entiers renvoyés paroxphp_async()$timeout— Nombre maximal de secondes à attendre par promesse.0.0signifie attendre indéfiniment. Par défaut :0.0
Renvoie : un tableau associatif où chaque clé est un ID de promesse (entier) et chaque valeur est le résultat de cette promesse.
Lève :
OxPHP\Async\AsyncExceptionsi le pool asynchrone est désactivé (ASYNC_WORKERS=0), ou si une promesse échoueOxPHP\Async\TimeoutExceptionsi une promesse dépasse$timeout
Exemple :
<?php
$promises = [
oxphp_async(fn() => slow_query('users')),
oxphp_async(fn() => slow_query('orders')),
oxphp_async(fn() => slow_query('products')),
];
$results = oxphp_async_await_all($promises);
foreach ($results as $promiseId => $result) {
// process $result
}oxphp_async_await_race()
oxphp_async_await_race(array $promise_ids, float $timeout = 0.0): arrayMet plusieurs promesses en concurrence et renvoie la première à se résoudre, qu'elle soit tenue ou rejetée. Les autres promesses ne sont pas annulées — elles continuent de s'exécuter et restent attendables avec oxphp_async_await(). C'est l'équivalent de Promise.race en JavaScript.
Paramètres :
$promise_ids— Un tableau d'au moins un ID de promesse entier renvoyé paroxphp_async(). Ne doit pas être vide.$timeout— Nombre maximal de secondes à attendre qu'une promesse se résolve.0.0signifie attendre indéfiniment. Par défaut :0.0
Renvoie : un tableau associatif à deux clés :
id(int) — L'ID de promesse du gagnantvalue(mixed) — La valeur de retour de la promesse gagnante
Lève :
OxPHP\Async\AsyncExceptionsi le pool asynchrone est désactivé (ASYNC_WORKERS=0), ou si la promesse gagnante a été rejetéeOxPHP\Async\TimeoutExceptionsi aucune promesse ne se résout dans le délai$timeout
Exemple :
<?php
// Try two mirror endpoints; use whichever responds first
$p1 = oxphp_async(fn() => fetch('https://mirror-1.example.com/data'));
$p2 = oxphp_async(fn() => fetch('https://mirror-2.example.com/data'));
$winner = oxphp_async_await_race([$p1, $p2], timeout: 10.0);
echo "Mirror {$winner['id']} won: " . json_encode($winner['value']);oxphp_async_await_any()
oxphp_async_await_any(array $promise_ids, float $timeout = 0.0): arrayRetourne dès qu'une promesse est TENUE. Les rejets sont accumulés et ne deviennent observables que si toutes les promesses sont rejetées. C'est l'équivalent de Promise.any en JavaScript — utile pour les schémas de repli / redondance où l'on veut n'importe quelle source qui fonctionne.
Paramètres :
$promise_ids— Un tableau d'au moins un ID de promesse entier renvoyé paroxphp_async(). Ne doit pas être vide.$timeout— Nombre maximal de secondes à attendre le premier accomplissement.0.0signifie attendre indéfiniment. Par défaut :0.0
Renvoie : un tableau associatif à deux clés :
id(int) — L'ID de la première promesse tenuevalue(mixed) — La valeur de retour de la promesse gagnante
Lève :
OxPHP\Async\AsyncExceptionsi le pool asynchrone est désactivé (ASYNC_WORKERS=0)OxPHP\Async\AggregateAsyncExceptionsi toutes les promesses ont été rejetées. L'exception transporte chaque erreur viagetErrors()(positionnel, indexé 0..N-1),getErrorMap()(indexé par id) etgetPromiseIds().OxPHP\Async\TimeoutExceptionsi aucune promesse n'a été tenue dans le délai$timeout.getPartialErrors()liste les promesses qui avaient déjà été rejetées avant l'échéance ;getCancelledPromiseIds()liste celles qui ne s'étaient pas résolues et ont donc été annulées. Leur drapeau d'annulation est positionné et leurs récepteurs sont abandonnés — passer l'un de ces ids àoxphp_async_await*()par la suite lève"unknown or already-awaited promise id". Cette liste est une piste d'audit, pas une file de travail reprenable.
Comportement :
- Les promesses encore en attente au moment de la victoire restent attendables individuellement avec
oxphp_async_await(). - Les promesses déjà rejetées avant la gagnante ne le sont pas — leurs résultats ont été consommés lorsqu'ils ont été accumulés comme erreurs candidates.
Exemple :
<?php
$mirror_a = oxphp_async(fn() => fetch('https://mirror-a.example.com/data'));
$mirror_b = oxphp_async(fn() => fetch('https://mirror-b.example.com/data'));
$mirror_c = oxphp_async(fn() => fetch('https://mirror-c.example.com/data'));
try {
$winner = oxphp_async_await_any([$mirror_a, $mirror_b, $mirror_c], 5.0);
echo "Mirror {$winner['id']} responded: " . json_encode($winner['value']);
} catch (\OxPHP\Async\AggregateAsyncException $e) {
// every mirror rejected
foreach ($e->getErrorMap() as $promise_id => $err) {
error_log("mirror {$promise_id}: " . $err->getMessage());
}
} catch (\OxPHP\Async\TimeoutException $e) {
// deadline elapsed before any mirror fulfilled
$partial = $e->getPartialErrors();
$cancelled = $e->getCancelledPromiseIds();
}oxphp_register_decorator()
oxphp_register_decorator(string $class): boolEnregistre une classe PHP comme décorateur qui enveloppe les appels de fonctions et de méthodes. La classe doit implémenter OxPHP\Decorator\AttributeInterface. Une fois enregistrée, OxPHP invoque les hooks before() et after() du décorateur autour de chaque appel de fonction ou de méthode qui correspond aux cibles #[Attribute] du décorateur.
Paramètres :
$class— Le nom de classe pleinement qualifié du décorateur à enregistrer
Renvoie : true en cas de succès, false si la classe n'existe pas ou n'implémente pas OxPHP\Decorator\AttributeInterface.
Exemple :
<?php
use OxPHP\Decorator\AttributeInterface;
use OxPHP\Decorator\Context;
#[\Attribute(\Attribute::TARGET_METHOD)]
class LogDecorator implements AttributeInterface
{
public function before(Context $ctx): void
{
error_log("Calling {$ctx->target} (request {$ctx->requestId})");
}
public function after(Context $ctx): void
{
error_log("Finished {$ctx->target}");
}
}
// Register once at bootstrap (or worker startup)
oxphp_register_decorator(LogDecorator::class);oxphp_apm_trace()
oxphp_apm_trace(string $name, callable $callback, ?array $attributes = null): voidExécute un callback à l'intérieur d'un span nommé. Le span est ouvert avant l'exécution du callback et fermé après son retour. Réservé à une future intégration améliorée des callbacks.
Paramètres :
$name— Nom du span$callback— Callable à exécuter à l'intérieur du span$attributes— Tableau associatif facultatif d'attributs clé-valeur de type chaîne
Renvoie : void
oxphp_apm_start()
oxphp_apm_start(string $name, ?array $attributes = null): intOuvre un nouveau span et renvoie un ID local pour référence ultérieure. Le span devient un enfant du span actuellement actif (ou du span racine de la requête si aucun span n'est actif). Utilisez oxphp_apm_end() pour le fermer.
Paramètres :
$name— Nom du span (par exemple"cache.warm","payment.process")$attributes— Tableau associatif facultatif d'attributs clé-valeur de type chaîne à définir sur le span à sa création
Renvoie : un ID de span local entier. Passez-le à oxphp_apm_end(), oxphp_apm_attribute() ou à d'autres fonctions qui acceptent un $span_id. Renvoie 0 lorsque l'APM est désactivé.
Exemple :
<?php
$spanId = oxphp_apm_start('order.validate', [
'order.type' => 'subscription',
]);
validateOrder($order);
oxphp_apm_end($spanId);oxphp_apm_end()
oxphp_apm_end(int $span_id): voidFerme le span ouvert par oxphp_apm_start(). L'heure de fin du span est enregistrée et il passe de la pile active à la liste des spans terminés, prêt pour l'export.
Paramètres :
$span_id— L'ID de span local renvoyé paroxphp_apm_start()
Renvoie : void
Fermez toujours les spans dans l'ordre inverse. Si vous ouvrez le span A puis le span B, fermez B avant A. Les spans non fermés sont automatiquement fermés à la fin de la requête et marqués avec oxphp.span.leaked=true.
oxphp_apm_attribute()
oxphp_apm_attribute(string $key, mixed $value, ?int $span_id = null): voidDéfinit un attribut clé-valeur sur un span. Les valeurs sont converties en chaînes. Si aucun $span_id n'est fourni, l'attribut est ajouté au span actuellement actif.
Paramètres :
$key— Clé de l'attribut (par exemple"user.id","cache.hit")$value— Valeur de l'attribut (string, int, float, bool ou null -- convertie en chaîne)$span_id— ID de span local facultatif. S'il est omis, cible le span courant
Renvoie : void
Exemple :
<?php
$spanId = oxphp_apm_start('db.query');
oxphp_apm_attribute('db.system', 'mysql');
oxphp_apm_attribute('db.statement', 'SELECT * FROM users WHERE id = ?');
oxphp_apm_attribute('db.row_count', $rowCount, $spanId);
oxphp_apm_end($spanId);oxphp_apm_event()
oxphp_apm_event(string $name, ?array $attributes = null, ?int $span_id = null): voidEnregistre un événement horodaté sur un span. Les événements sont utiles pour consigner des occurrences discrètes au cours de la durée de vie d'un span (par exemple un cache miss, une tentative de réessai, une vérification d'autorisation).
Paramètres :
$name— Nom de l'événement (par exemple"cache.miss","retry")$attributes— Tableau associatif facultatif d'attributs d'événement clé-valeur de type chaîne$span_id— ID de span local facultatif. S'il est omis, cible le span courant
Renvoie : void
Exemple :
<?php
$spanId = oxphp_apm_start('payment.process');
oxphp_apm_event('payment.authorized', [
'provider' => 'stripe',
'amount' => '49.99',
]);
oxphp_apm_end($spanId);oxphp_apm_error()
oxphp_apm_error(mixed $exception, ?int $span_id = null): voidMarque le statut d'un span comme erreur (code de statut 2). Utilisez ceci pour signaler les spans où une exception ou un échec s'est produit.
Paramètres :
$exception— L'exception ou l'erreur (utilisée pour le contexte ; le statut est défini quel que soit le type)$span_id— ID de span local facultatif. S'il est omis, cible le span courant
Renvoie : void
Exemple :
<?php
$spanId = oxphp_apm_start('external.api');
try {
$result = callExternalApi();
} catch (\Throwable $e) {
oxphp_apm_error($e, $spanId);
throw $e;
} finally {
oxphp_apm_end($spanId);
}oxphp_apm_status()
oxphp_apm_status(int $code, ?string $description = null, ?int $span_id = null): voidDéfinit le code de statut et une description facultative sur un span.
Paramètres :
$code— Code de statut :0= Unset,1= Ok,2= Error$description— Description de statut facultative, lisible par un humain$span_id— ID de span local facultatif. S'il est omis, cible le span courant
Renvoie : void
Exemple :
<?php
$spanId = oxphp_apm_start('validation');
if ($valid) {
oxphp_apm_status(1, 'Validation passed', $spanId);
} else {
oxphp_apm_status(2, 'Invalid input: missing email', $spanId);
}
oxphp_apm_end($spanId);oxphp_apm_trace_id()
oxphp_apm_trace_id(): stringRenvoie l'ID de trace W3C (32 caractères hexadécimaux) pour le contexte de trace de la requête courante. C'est la même valeur que $_SERVER['OXPHP_TRACE_ID'], disponible sans les superglobales.
Renvoie : une chaîne d'ID de trace hexadécimale de 32 caractères. Renvoie une chaîne vide lorsque l'APM est désactivé ou qu'aucun contexte de trace n'est actif.
Exemple :
<?php
$traceId = oxphp_apm_trace_id();
error_log("Processing request in trace {$traceId}");oxphp_apm_span_id()
oxphp_apm_span_id(): stringRenvoie l'ID de span (16 caractères hexadécimaux) du span actuellement actif. En cas de spans imbriqués, renvoie l'ID du span ouvert le plus interne.
Renvoie : une chaîne d'ID de span hexadécimale de 16 caractères. Renvoie une chaîne vide lorsqu'aucun span n'est actif.
oxphp_apm_header()
oxphp_apm_header(): stringRenvoie une valeur d'en-tête traceparent W3C pour le contexte de span courant. Utilisez ceci pour propager le contexte de trace vers les appels HTTP en aval.
Renvoie : une chaîne au format 00-{trace_id}-{span_id}-01. Renvoie une chaîne vide lorsqu'aucun contexte de trace n'est actif.
Exemple :
<?php
$spanId = oxphp_apm_start('http.call');
$traceparent = oxphp_apm_header();
$response = file_get_contents('https://api.example.com/data', false,
stream_context_create([
'http' => [
'header' => "traceparent: {$traceparent}\r\n",
],
])
);
oxphp_apm_end($spanId);OxPHP\Profile\is_active()
OxPHP\Profile\is_active(): boolRenvoie true lorsque la capture de profil est actuellement active pour cette requête — c'est-à-dire que le profileur a été déclenché (par en-tête, cookie, paramètre de requête ou taux d'échantillonnage) et que la capture n'a pas été mise en pause via pause().
Utile pour protéger une instrumentation coûteuse qui ne devrait s'exécuter que lorsque le profilage est activé.
Renvoie : bool.
Exemple :
<?php
if (OxPHP\Profile\is_active()) {
OxPHP\Profile\mark('checkpoint.before_query');
}OxPHP\Profile\start()
OxPHP\Profile\start(): voidActive par programmation la capture de profil pour le reste de la requête courante, même si aucun déclencheur ne s'est activé au RINIT. Définit le mode de profilage sur PROFILE_ALL et efface le drapeau de pause.
Si un profil était déjà actif dans un mode différent, cet appel le promeut — tout span déjà collecté dans le mode inférieur est écarté afin que le profil capturé reste cohérent en interne. Utilisez ceci lorsque vous voulez faire adhérer un chemin de code spécifique au profilage sans dépendre des déclencheurs.
Renvoie : void.
Exemple :
<?php
if ($request->header('x-debug') === 'on') {
OxPHP\Profile\start();
}OxPHP\Profile\stop()
OxPHP\Profile\stop(): voidDésactive toute nouvelle capture de span pour cette requête. Les spans actuellement ouverts se ferment naturellement à mesure que PHP en retourne, de sorte que la pile d'appels reste équilibrée — seuls les nouveaux spans cessent d'être enregistrés.
Renvoie : void.
Exemple :
<?php
OxPHP\Profile\start();
expensive_work();
OxPHP\Profile\stop();
non_profiled_work();OxPHP\Profile\pause()
OxPHP\Profile\pause(): voidVariante douce de stop(). Même effet (positionne le drapeau de pause) ; la distinction porte sur l'intention — pause() signale que la capture reprendra plus tard via resume(), tandis que stop() ne le signale pas.
Renvoie : void.
OxPHP\Profile\resume()
OxPHP\Profile\resume(): voidEfface le drapeau de pause positionné par pause() ou stop(). Le mode de profil lui-même n'est pas modifié — s'il n'a jamais été activé, resume() ne fait rien d'observable.
Renvoie : void.
Exemple :
<?php
OxPHP\Profile\pause();
$secret = decrypt_payload($data);
OxPHP\Profile\resume();OxPHP\Profile\mark()
OxPHP\Profile\mark(string $label, ?array $attrs = null): voidAttache un événement Mark au span ouvert le plus haut, avec un sac d'attributs facultatif. Sans effet lorsqu'aucun span n'est ouvert (par exemple profilage non actif, ou mark() appelée au niveau supérieur de la requête, en dehors de tout cadre instrumenté).
Les clés et valeurs d'attributs sont converties en chaînes ; les valeurs non-chaînes deviennent une chaîne vide.
Paramètres :
$label— nom court, lisible par un humain, pour l'événement (par exemple"cache.miss","db.slow_query")$attrs—array<string, scalar>facultatif de paires clé/valeur attachées à l'événement
Renvoie : void.
Exemple :
<?php
function load_user(int $id): array {
$cached = $cache->get("user:$id");
if ($cached === null) {
OxPHP\Profile\mark('cache.miss', ['key' => "user:$id"]);
$cached = $db->fetchUser($id);
}
return $cached;
}OxPHP\Profile\metric()
OxPHP\Profile\metric(string $name, float $value): voidAjoute un attribut metric.<name> au span actuellement ouvert. Sans effet lorsqu'aucun span n'est ouvert.
Contrairement à mark() (qui crée un événement discret), metric() écrit dans l'ensemble d'attributs du span existant — utile pour enregistrer des observations numériques liées à l'opération environnante (lignes récupérées, octets traités, nombre de réessais).
Paramètres :
$name— identifiant de la métrique ; sera stocké sousmetric.<name>$value— valeur numérique (convertie enfloat)
Renvoie : void.
Exemple :
<?php
function search(string $query): array {
$results = $index->search($query);
OxPHP\Profile\metric('result_count', count($results));
return $results;
}Classes et interfaces
L'extension oxphp_sapi enregistre les classes suivantes :
HTTP
| Classe | Description |
|---|---|
OxPHP\Http\Request |
Objet requête renvoyé par oxphp_http_request(). final — ne peut pas être étendu. |
OxPHP\Http\Attributes |
Conteneur mutable d'attributs de requête (pour le middleware). final. |
OxPHP\Http\Session |
Objet session accessible via $request->session(). final. |
OxPHP\Http\UploadedFile |
Objet fichier téléversé issu de $request->files(). final. |
Décorateurs
| Classe / Interface | Description |
|---|---|
OxPHP\Decorator\AttributeInterface |
Interface pour les décorateurs. Requiert les méthodes before(Context $ctx) et after(Context $ctx). |
OxPHP\Decorator\Context |
Objet de contexte passé aux hooks des décorateurs. final. Propriétés publiques : target, class, method, function, objectId, requestId, traceId. Méthodes : getParams(): array, getResult(): mixed, hasResult(): bool. Voir Décorateurs pour la référence complète. |
Traçage
| Classe | Description |
|---|---|
OxPHP\Apm\Trace |
Attribut intégré pour la création automatique de spans. À appliquer aux fonctions ou aux méthodes. |
Async
| Classe | Description |
|---|---|
OxPHP\Async\BorrowedProxy |
Objet proxy pour les valeurs empruntées entre threads. |
Exceptions
Toutes les exceptions enregistrées par l'extension :
| Exception | Étend | Quand elle est levée |
|---|---|---|
OxPHP\Async\AsyncException |
\Exception |
Erreur dans une tâche asynchrone (oxphp_async_await()) ou arguments invalides dans oxphp_async() |
OxPHP\Async\TimeoutException |
OxPHP\Async\AsyncException |
Délai dépassé dans l'une de oxphp_async_await(), oxphp_async_await_all(), oxphp_async_await_race() ou oxphp_async_await_any(). Pour les délais de oxphp_async_await_any(), les accesseurs getPartialErrors(): array<int, \Throwable> et getCancelledPromiseIds(): list<int> sont remplis ; pour les autres points d'appel, les deux renvoient []. |
OxPHP\Async\AggregateAsyncException |
OxPHP\Async\AsyncException |
Levée par oxphp_async_await_any() lorsque toutes les promesses ont été rejetées. Méthodes : getErrors(): list<\Throwable> (positionnel, indexé 0..N-1 par position d'entrée), getErrorMap(): array<int, \Throwable> (indexé par id de promesse), getPromiseIds(): list<int> (ids de promesse d'entrée dans l'ordre). |
OxPHP\Async\BorrowException |
\Exception |
Erreur lors de l'emprunt d'une valeur entre threads |
OxPHP\Http\Exception\NoActiveRequestException |
\RuntimeException |
Appel de oxphp_http_request() en dehors d'une requête active |
OxPHP\Http\Exception\AsyncContextException |
NoActiveRequestException |
Appel de oxphp_http_request() à l'intérieur d'un callback oxphp_async() |
OxPHP\Http\Exception\WorkerIdleException |
NoActiveRequestException |
Appel de oxphp_http_request() en mode worker entre deux requêtes |
OxPHP\Decorator\RejectedException |
\Exception |
Un décorateur a rejeté un appel de fonction/méthode |
Vérification de l'extension
Vous pouvez vérifier que l'extension OxPHP est chargée et inspecter toutes les fonctions enregistrées :
<?php
if (extension_loaded('oxphp_sapi')) {
echo "OxPHP extension is loaded\n";
}
$functions = get_extension_funcs('oxphp_sapi');
print_r($functions);
// Array
// (
// [0] => oxphp_http_request
// [1] => oxphp_superglobals_enabled
// [2] => oxphp_request_id
// [3] => oxphp_worker_id
// [4] => oxphp_server_info
// [5] => oxphp_finish_request
// [6] => oxphp_is_worker
// [7] => oxphp_is_streaming
// [8] => oxphp_stream_flush
// [9] => oxphp_sleep
// [10] => oxphp_usleep
// [11] => oxphp_worker
// [12] => oxphp_register_decorator
// [13] => oxphp_async
// [14] => oxphp_async_await
// [15] => oxphp_async_await_all
// [16] => oxphp_async_await_race
// [17] => oxphp_async_await_any
// [18] => oxphp_apm_trace
// [19] => oxphp_apm_start
// [20] => oxphp_apm_end
// [21] => oxphp_apm_attribute
// [22] => oxphp_apm_event
// [23] => oxphp_apm_error
// [24] => oxphp_apm_status
// [25] => oxphp_apm_trace_id
// [26] => oxphp_apm_span_id
// [27] => oxphp_apm_header
// )Les fonctions SAPI de base (jusqu'à oxphp_register_decorator) viennent en premier ; les familles oxphp_async_* et oxphp_apm_* — ainsi que le SDK OxPHP\Profile\* lorsque le profileur est intégré à la compilation — sont ajoutées par leurs plugins lors de l'initialisation du module. Considérez cette liste comme illustrative : l'ensemble exact et l'ordre dépendent des plugins compilés dans le build.
Compatibilité avec PHP-FPM
Si votre code doit fonctionner à la fois sur OxPHP et PHP-FPM, utilisez des wrappers de repli :
<?php
function finish_request(): bool
{
if (function_exists('oxphp_finish_request')) {
return oxphp_finish_request();
}
if (function_exists('fastcgi_finish_request')) {
return fastcgi_finish_request();
}
return false;
}
// Worker-aware bootstrap
if (function_exists('oxphp_is_worker') && oxphp_is_worker()) {
// OxPHP worker mode
} else {
// PHP-FPM or OxPHP traditional mode
}La famille de fonctions oxphp_async() est toujours enregistrée dans OxPHP, donc function_exists('oxphp_async') renvoie true même lorsque ASYNC_WORKERS=0. Lorsque le pool est désactivé, l'appel de n'importe quelle fonction asynchrone lève OxPHP\Async\AsyncException. Si votre code doit gérer les deux configurations, interceptez l'exception plutôt que de vérifier function_exists().
Voir aussi
- HTTP Request API -- accès orienté objet aux données de requête via
oxphp_http_request() - Mode worker -- boucle worker persistante et cycle de vie des requêtes
- Server-Sent Events -- streaming en temps réel avec
oxphp_stream_flush() - Réponse anticipée -- traitement en arrière-plan avec
oxphp_finish_request() - Superglobales -- comment OxPHP remplit
$_SERVER,$_GET,$_POSTet les autres superglobales - Traçage distribué & APM -- W3C Trace Context, export OTel et le SDK
oxphp_apm_*() - Référence de configuration --
WORKER_MODE_ENABLED,ENTRY_FILE,PHP_WORKERSet les autres variables d'environnement