Maison  >  Article  >  développement back-end  >  Installation et utilisation de l'extension Direct IO en PHP

Installation et utilisation de l'extension Direct IO en PHP

藏色散人
藏色散人avant
2021-07-09 11:43:071925parcourir

À propos des opérations sur les fichiers PHP, nous apprendrons également à travers une série d'articles. Aujourd’hui, nous allons d’abord découvrir une extension que peu de gens ont utilisée, et que beaucoup de gens ne connaissent même pas. Elle est légèrement différente de nos opérations quotidiennes sur les fichiers. Cependant, ces différences ne sont pas intuitivement visibles à l’œil nu. Elles résident principalement dans l’équilibre entre besoins métier et performances.

Qu'est-ce que Direct IO

Direct IO est en fait un concept du système d'exploitation Linux. Cela signifie exploiter directement le flux de fichiers. Pourquoi dit-on qu'il est direct ? En fait, lorsque notre système d'exploitation effectue des opérations sur les fichiers, il ne lit pas et n'écrit pas immédiatement les fichiers sur le disque. Il y a une couche de cache de pages au milieu. Puisqu'il s'agit d'un cache, il apportera certainement certaines améliorations de performances, mais ce n'est pas totalement absolu. L'opération directe consiste à ignorer cette couche d'opérations de cache et à lire et écrire directement les fichiers sur le disque. Nous savons tous qu'il existe un énorme écart entre la vitesse de traitement des disques, même des disques SSD, et celle du processeur et de la mémoire. Le cache de pages par défaut est utilisé pour combler cet écart. Cependant, le cache de pages augmentera les opérations de calcul du CPU et occupera de la mémoire. Le fonctionnement direct ne pose pas ce problème, mais relativement parlant, sa vitesse n'est pas comparable à celle des opérations de lecture de fichiers avec cache.

Ce qui précède est une simple compréhension de Direct IO. Pour une explication plus détaillée, vous pouvez vous référer au deuxième lien dans le document de référence à la fin de l'article et mener une étude approfondie. En PHP, nous téléchargeons l'extension Direct IO directement depuis PECL et l'installons selon la méthode d'installation normale de l'extension.

Créer et écrire des fichiers

Puisqu'il s'agit d'une opération de fichier, créons et écrivons d'abord quelques données de fichier.

$fd = dio_open("./test", O_RDWR | O_CREAT);

echo dio_write($fd, "This is Test.I'm ZyBlog.Show me the money4i"), PHP_EOL;
// 43

print_r(dio_stat($fd));
// Array
// (
//     [device] => 64768
//     [inode] => 652548
//     [mode] => 35432
//     [nlink] => 1
//     [uid] => 0
//     [gid] => 0
//     [device_type] => 0
//     [size] => 43
//     [block_size] => 4096
//     [blocks] => 8
//     [atime] => 1602643459
//     [mtime] => 1602656963
//     [ctime] => 1602656963
// )

dio_close($fd);

Semblable aux fonctions de la série f, nous devons utiliser une fonction dio_open() pour ouvrir un fichier. Le paramètre O_RDWR | O_CREAT signifie ouvrir un fichier en lecture-écriture et le créer si le fichier n'existe pas. Ces deux constantes correspondent aux constantes liées au fonctionnement direct des fichiers sous Linux. Vous pouvez également voir l'explication de ces constantes dans le lien en fin d'article.

L'opération d'écriture peut également être effectuée en utilisant dio_write(). Le contenu qu'elle renvoie est la longueur du contenu écrit. Ici, nous avons écrit 43 caractères.

dio_stat() renvoie des informations sur le descripteur de fichier actuel. Nous pouvons voir le numéro de périphérique, l'uid, le gid, l'heure, le mtime et d'autres informations. Elles sont similaires aux informations que nous pouvons voir sous Linux. ce fichier quelques informations simples.

Lecture de fichiers

La lecture de fichiers peut se faire très simplement à l'aide d'une fonction. La fonction

$fd = dio_open("./test", O_RDWR | O_CREAT);

echo dio_read($fd), PHP_EOL;
// This is Test.I'm ZyBlog.Show me the money4i

dio_close($fd);

dio_read() contient également un autre paramètre, qui peut lire le contenu en fonction de la longueur d'octet spécifiée. Nous verrons des exemples associés plus tard.

Opération de fichier

Pendant le processus de lecture du fichier, nous n'avons peut-être besoin que de lire une partie du contenu ou de commencer à lire le contenu du fichier à partir d'une certaine position. Les fonctions d'opération suivantes opèrent sur ces deux aspects.

$fd = dio_open("./test", O_RDWR | O_CREAT);

var_dump(dio_truncate ($fd , 20)); 
// bool(true)
echo dio_read($fd), PHP_EOL;
// This is Test.I'm ZyB

dio_seek($fd, 3); 

echo dio_read($fd), PHP_EOL;
// s is Test.I'm ZyB

dio_close($fd);

En fait, comme vous pouvez le voir d'après le nom, dio_truncate() est utilisé pour tronquer le contenu du fichier. Ici, nous tronquons à partir du 20ème caractère, puis utilisons dio_read() pour lire uniquement les 20 premiers caractères.

dio_seek() spécifie à partir de quel caractère commencer la lecture du contenu. Après avoir spécifié la position du caractère de départ sur 3, les trois premiers caractères ne seront pas lus. Il convient de noter que dio_truncate() modifiera le contenu du fichier original, contrairement à dio_seek().

Autres paramètres

$fd = dio_open('./test', O_RDWR | O_NOCTTY | O_NONBLOCK);

dio_fcntl($fd, F_SETFL, O_SYNC);

dio_tcsetattr($fd, array(
  'baud' => 9600,
  'bits' => 8,
  'stop'  => 1,
  'parity' => 0
));

while (($data = dio_read($fd, 4))!=false) {
    echo $data, PHP_EOL;
}
// This
//  is
// Test
// .I'm
//  ZyB

dio_close($fd);

dio_fcntl() est appelée la fonction fcntl dans la bibliothèque de fonctions c. Le but est d'effectuer certaines opérations spécifiées sur le descripteur de fichier. Cette opération est également corrigée avec certaines constantes. signifie définir l'indicateur du descripteur de fichier sur la valeur spécifiée. Ce O_SYNC signifie que si ce descripteur est défini, l'écriture dans le fichier ne se terminera pas tant que les données ne seront pas écrites sur le disque. Bien entendu, cette fonction peut également être paramétrée avec de nombreux autres opérateurs. Vous pouvez vous référer à la documentation officielle de PHP pour une étude approfondie.

dio_tcsetattr() est utilisé pour définir les attributs du terminal et la vitesse de transmission du fichier ouvert. Baud représente le débit en bauds, bits représente les bits, stop représente le bit d'arrêt et parité représente le bit de parité. Cet aspect nécessite quelques connaissances des « Principes de composition informatique » et du « Système d'exploitation ». Je ne suis pas très clair à ce sujet, je ne l'expliquerai donc pas en détail. On voit ici que les cours de base dans les classes collégiales sont vraiment très importants. Je crois que les étudiants qui ont suivi ces cours de base professionnels comprendront immédiatement le rôle de cette fonction.

Enfin, nous utilisons le deuxième paramètre dans dio_read() pour lire le contenu du fichier en fonction de la longueur en octets. Vous pouvez voir que le contenu lu est affiché en segments de 4 caractères.

总结

函数的学习还是比较简单的,核心的还是要知道这个扩展在什么业务场景下更适合使用。在文章开头的介绍中我们已经说明了直接操作文件与普通文件操作的一些区别,在自缓存应用或者需要传输非常大的数据时,直接操作对于 CPU 和 内存 更加地友好。而其它情况,我们还是使用系统默认的文件操作方式就可以了。其实在大部分情况下,我们基本看不出来它们的显著区别。所以在实际应用中,还是那句话,结合业务实际情况,选择最佳的方案。

测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/4.PHP中DirectIO直操作文件扩展的使用.php
参考文档:
https://www.php.net/manual/zh/book.dio.php
https://www.ibm.com/developerworks/cn/linux/l-cn-directio/

推荐学习:《PHP视频教程

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer