Start · Sprachen · PHP · Referenz · msg_set_queue

msg_set_queue

Funktion

Setzt Metadaten (Attribute) einer vorhandenen POSIX-Nachrichten-Warteschlange, z. B. Berechtigungen oder maximale Nachrichtengröße.

seit PHP 4.3.0 Kategorie: misc

Signatur

msg_set_queue(SysvMessageQueue $queue, array $data): bool

Beschreibung

msg_set_queue() erlaubt es, bestimmte Attribute einer bestehenden System-V-Nachrichten-Warteschlange zu verändern. Die zu setzenden Werte werden als assoziatives Array übergeben, das denselben Aufbau wie das von msg_stat_queue() zurückgelieferte Array hat.

Folgende Schlüssel werden ausgewertet und angewendet: msg_perm.uid (Eigentümer-UID), msg_perm.gid (Eigentümer-GID), msg_perm.mode (Zugriffsrechte, oktal) und msg_qbytes (maximale Anzahl Bytes in der Warteschlange). Alle anderen Schlüssel im Array werden ignoriert.

Typische Anwendungsfälle sind das nachträgliche Anpassen der Zugriffsrechte auf eine Warteschlange (z. B. damit ein anderer Prozess mit anderer UID Nachrichten lesen darf) oder das Erhöhen bzw. Verringern der maximalen Puffergröße msg_qbytes.

Bitte beachten Sie, dass das Herabsetzen von msg_qbytes unter den aktuell belegten Platz blockieren kann und dass viele Attribute root-Rechte oder entsprechende Capabilities erfordern.

Parameter

Name Typ Default Beschreibung
$queue Pflicht SysvMessageQueue Das Warteschlangen-Handle, das zuvor mit msg_get_queue() erzeugt oder geöffnet wurde.
$data Pflicht array Assoziatives Array mit den zu setzenden Attributen. Gültige Schlüssel sind msg_perm.uid, msg_perm.gid, msg_perm.mode und msg_qbytes. Alle anderen Schlüssel werden stillschweigend ignoriert.

Rückgabewert

Typ
bool
Beschreibung
Gibt true bei Erfolg zurück, false wenn das Setzen der Attribute fehlschlägt (z. B. wegen fehlender Rechte oder ungültiger Parameter).

Beispiele

Zugriffsrechte einer Warteschlange ändern

<?php
// Warteschlange öffnen oder anlegen
$queue = msg_get_queue(1234);

if ($queue === false) {
    die('Konnte Warteschlange nicht öffnen.');
}

// Aktuelle Metadaten auslesen
$stat = msg_stat_queue($queue);
echo 'Alte Rechte: ' . decoct($stat['msg_perm.mode']) . PHP_EOL;

// Rechte auf 0666 setzen, damit alle Prozesse lesen und schreiben dürfen
$result = msg_set_queue($queue, [
    'msg_perm.mode' => 0666,
]);

if ($result) {
    echo 'Rechte erfolgreich geändert.' . PHP_EOL;
} else {
    echo 'Fehler beim Ändern der Rechte.' . PHP_EOL;
}

// Neue Metadaten auslesen
$stat = msg_stat_queue($queue);
echo 'Neue Rechte: ' . decoct($stat['msg_perm.mode']) . PHP_EOL;
?>
Alte Rechte: 600 Rechte erfolgreich geändert. Neue Rechte: 666

Maximale Warteschlangengröße (msg_qbytes) erhöhen

<?php
$key   = ftok(__FILE__, 'q');
$queue = msg_get_queue($key, 0600);

if ($queue === false) {
    die('Warteschlange konnte nicht geöffnet werden.');
}

// Standardgröße auslesen
$stat = msg_stat_queue($queue);
echo 'Aktuelle msg_qbytes: ' . $stat['msg_qbytes'] . PHP_EOL;

// Puffergröße auf 131072 Bytes erhöhen (root oder CAP_SYS_RESOURCE erforderlich)
$success = msg_set_queue($queue, [
    'msg_qbytes' => 131072,
]);

if ($success) {
    $stat = msg_stat_queue($queue);
    echo 'Neue msg_qbytes: ' . $stat['msg_qbytes'] . PHP_EOL;
} else {
    echo 'Erhöhung fehlgeschlagen – möglicherweise fehlende Rechte.' . PHP_EOL;
}

msg_remove_queue($queue);
?>
Aktuelle msg_qbytes: 16384 Neue msg_qbytes: 131072

// Wichtig · Fallstricke

Berechtigungen: Das Ändern von msg_qbytes auf einen Wert oberhalb des systemweiten Limits (/proc/sys/kernel/msgmnb unter Linux) ist in der Regel nur dem Superuser (root) oder Prozessen mit der Capability CAP_SYS_RESOURCE erlaubt. Normale Benutzer können den Wert nur verringern.

Plattformabhängigkeit: Diese Funktion setzt System-V-IPC voraus und ist ausschließlich auf Unix-ähnlichen Betriebssystemen (Linux, macOS, BSD) verfügbar. Unter Windows steht sie nicht zur Verfügung.

Typsicherheit: Seit PHP 8.0 erwartet der erste Parameter ein SysvMessageQueue-Objekt anstelle einer Ressource. Code, der noch eine Ressource weitergibt, muss angepasst werden.