Dans PHP, la rédaction de données dans les fichiers journaux sous forme binaire peut réduire efficacement l'espace de stockage et améliorer les performances de lecture. La fonction Pack () combinée à FWrite () est un outil important pour y parvenir. Cet article utilisera un exemple pour décrire comment utiliser ces deux fonctions pour écrire des données structurées dans des fichiers journaux binaires et expliquer les détails techniques pertinents.
Par rapport aux journaux de texte traditionnels, les avantages des journaux binaires sont:
Plus compact: utilisez l'alignement des octets pour stocker les données pour économiser l'espace disque;
Plus efficace: la lecture rapide et la vitesse d'analyse, adaptée à des scénarios de concurrence élevés;
Plus sécurisé: la structure du journal n'est pas facile à modifier manuellement.
Bien sûr, l'inconvénient est une mauvaise lisibilité, il est donc recommandé d'être utilisé uniquement en interne ou dans le cadre de l'optimisation des performances.
Pack () est utilisé pour emballer les variables PHP en chaînes binaires. Sa syntaxe de base est:
string pack(string $format, mixed ...$values)
où $ format est une chaîne de format, qui définit comment emballer chaque valeur, telle que:
L : entier long non signé (4 octets, Machine Endianness)
N : entier long non signé (4 octets, Big Endan octet Order)
A : NUL REMPLER STRING
F : Numéro de point flottant à une seule précision (4 octets)
Prenons l'exemple des journaux d'accès des utilisateurs à enregistrer. Chaque enregistrement contient les champs suivants:
ID utilisateur (entier non signé de 4 octets)
Timestamp (4 octets entier non signé)
Longueur de l'URL de la page (entier non signé de 2 octets)
URL de page (chaîne de longueur variable)
<?php
function write_log($user_id, $timestamp, $url) {
$fp = fopen("access.log", "ab"); // Ouvrez le fichier journal en binaire
if (!$fp) {
die("Impossible d'ouvrir le fichier journal");
}
$url = parse_url($url, PHP_URL_PATH); // Seule la partie de chemin est enregistrée,Évitez les journaux contenant des paramètres sensibles
$url_length = strlen($url);
if ($url_length > 65535) {
$url = substr($url, 0, 65535); // Le stockage maximum ne peut être que2longueur d'octetURL
$url_length = 65535;
}
// Données de longueur fixe du package:utilisateurID + Horodatage + URLlongueur
$header = pack("L L n", $user_id, $timestamp, $url_length);
// Écrire dans les fichiers journaux
fwrite($fp, $header);
fwrite($fp, $url);
fclose($fp);
}
// Exemple d'appel
write_log(123456, time(), "https://m66.net/user/profile?id=987");
?>
Le code ci-dessus fait ce qui suit:
Utilisez Pack ("LL N", ...) pour coder l'ID utilisateur, l'horodatage et la longueur d'URL au format binaire;
Utilisez FWrite () pour écrire respectivement l'en-tête et le corps d'URL;
Chaque enregistrement est clair et compact au format et peut être utilisé pour des lectures ou une analyse rapides ultérieures.
Après écrit, ces journaux binaires peuvent être lus et décodés en utilisant la méthode suivante:
<?php
function read_logs($filename) {
$fp = fopen($filename, "rb");
while (!feof($fp)) {
$header = fread($fp, 10); // 4octetutilisateurID + 4octetHorodatage + 2octetURLlongueur
if (strlen($header) < 10) break;
$data = unpack("Luser_id/Ltimestamp/nurl_len", $header);
$url = fread($fp, $data['url_len']);
echo "utilisateurID: {$data['user_id']}, temps: " . date('Y-m-d H:i:s', $data['timestamp']) . ", URL: $url\n";
}
fclose($fp);
}
// Exemple d'appel
read_logs("access.log");
?>
Via pack () et fwrite () , nous pouvons écrire efficacement des données structurées dans des fichiers journaux binaires, ce qui convient à l'enregistrement d'un grand nombre d'informations de journal fréquemment accessibles. Bien que les journaux binaires ne soient pas faciles à visualiser directement, ils peuvent être lus et analysés par lots pour améliorer les performances et la maintenabilité du système.
Dans les applications pratiques, cette méthode peut également être étendue à plusieurs scénarios tels que l'enregistrement des trajectoires de comportement des utilisateurs, les journaux d'appels d'interface, les données d'analyse des performances, etc., qui est une méthode de traitement de journal efficace qui vaut la peine d'être apprise.