Heim  >  Artikel  >  Backend-Entwicklung  >  Installation und Verwendung der Direct IO-Erweiterung in PHP

Installation und Verwendung der Direct IO-Erweiterung in PHP

藏色散人
藏色散人nach vorne
2021-07-09 11:43:071979Durchsuche

Über PHP-Dateioperationen werden wir auch in einer Reihe von Artikeln lernen. Heute erfahren wir zunächst etwas über eine Erweiterung, die nur wenige Menschen verwendet haben und die viele nicht einmal kennen. Sie unterscheidet sich geringfügig von unseren täglichen Dateioperationen. Diese Unterschiede sind jedoch mit bloßem Auge nicht intuitiv erkennbar. Sie liegen hauptsächlich im Gleichgewicht zwischen Geschäftsanforderungen und Leistung.

Was ist Direct IO?

Direct IO ist eigentlich ein Konzept im Linux-Betriebssystem. Es bedeutet, den Dateistream direkt zu bedienen. Wenn unser Betriebssystem Dateioperationen ausführt, liest und schreibt es Dateien nicht sofort direkt auf der Festplatte. In der Mitte befindet sich eine Ebene des Seitencaches. Da es sich um einen Cache handelt, wird er sicherlich gewisse Leistungsverbesserungen mit sich bringen, dies ist jedoch nicht völlig sicher. Die direkte Operation besteht darin, diese Schicht von Cache-Operationen zu ignorieren und Dateien direkt auf der Festplatte zu lesen und zu schreiben. Wir alle wissen, dass es eine große Lücke zwischen der Verarbeitungsgeschwindigkeit von Festplatten, sogar Solid-State-Laufwerken, und CPU und Speicher gibt. Der Standard-Seitencache wird verwendet, um diese Lücke zu schließen. Der Seitencache erhöht jedoch die Rechenoperationen der CPU und belegt den Speicher. Beim direkten Betrieb tritt dieses Problem nicht auf, aber relativ gesehen ist seine Geschwindigkeit nicht mit der von Dateilesevorgängen mit Cache vergleichbar.

Das Obige ist ein einfaches Verständnis von Direct IO. Für eine detailliertere Erklärung können Sie auf den zweiten Link im Referenzdokument am Ende des Artikels verweisen und eine eingehende Studie durchführen. In PHP laden wir die Direct IO-Erweiterung direkt von PECL herunter und installieren sie gemäß der normalen Installationsmethode der Erweiterung.

Dateien erstellen und schreiben

Da es sich um einen Dateivorgang handelt, erstellen und schreiben wir zunächst einige Dateidaten.

$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);

Ähnlich wie bei den Funktionen der f-Serie müssen wir eine dio_open()-Funktion verwenden, um eine Datei zu öffnen. Der O_CREAT-Parameter bedeutet, eine Lese-/Schreibdatei zu öffnen und zu erstellen, wenn die Datei nicht vorhanden ist. Diese beiden Konstanten entsprechen den Konstanten, die sich auf den direkten Betrieb von Dateien unter Linux beziehen. Die Erklärung dieser Konstanten finden Sie auch im Link am Ende des Artikels.

Der Schreibvorgang kann auch mit dio_write() abgeschlossen werden. Der zurückgegebene Inhalt entspricht der Länge des geschriebenen Inhalts. Hier haben wir 43 Zeichen geschrieben.

dio_stat() gibt einige Informationen über das aktuelle Dateihandle zurück, Gerät, UID, GID, Atime, Mtime und andere Informationen, die wir in der Tat sehen können Diese Datei enthält einige einfache Informationen.

Dateien lesen

Das Lesen von Dateien kann ganz einfach über eine Funktion erfolgen. Die Funktion

$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() enthält auch einen weiteren Parameter, der den Inhalt entsprechend der angegebenen Bytelänge lesen kann. Wir werden später verwandte Beispiele sehen.

Dateivorgang

Während des Dateilesevorgangs müssen wir möglicherweise nur einen Teil des Inhalts lesen oder den Dateiinhalt ab einer bestimmten Position lesen. Die folgenden Betriebsfunktionen wirken sich auf diese beiden Aspekte aus.

$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);

Wie Sie am Namen erkennen können, wird dio_truncate() tatsächlich verwendet, um den Inhalt der Datei abzuschneiden. Hier kürzen wir ab dem 20. Zeichen und verwenden dann dio_read(), um nur die ersten 20 Zeichen zu lesen.

dio_seek() gibt an, ab welchem ​​Zeichen der Inhalt gelesen werden soll. Nachdem wir die Startzeichenposition als 3 angegeben haben, werden die ersten drei Zeichen nicht gelesen. Es ist zu beachten, dass dio_truncate() den Inhalt der Originaldatei ändert, dio_seek() hingegen nicht.

Andere Einstellungen

$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);

Die Funktion dio_fcntl() wird in der c-Funktionsbibliothek als Funktion bezeichnet. Der Zweck besteht darin, einige bestimmte Operationen am Dateideskriptor auszuführen. Hier verwenden wir F_SETFL bedeutet, dass das Dateideskriptor-Flag auf den angegebenen Wert gesetzt wird. Dieses O_SYNC bedeutet, dass das Schreiben in die Datei erst dann beendet wird, wenn die Daten auf die Festplatte geschrieben werden. Natürlich kann diese Funktion auch mit vielen anderen Operatoren eingestellt werden. Eine ausführliche Untersuchung finden Sie in der offiziellen PHP-Dokumentation.

dio_tcsetattr() wird verwendet, um die Terminalattribute und die Baudrate der geöffneten Datei festzulegen. Baud repräsentiert die Baudrate, Bits repräsentiert die Bits, Stop repräsentiert das Stoppbit und Parität repräsentiert das Paritätsbit. Dieser Aspekt erfordert einige Kenntnisse aus den Bereichen „Computer-Kompositionsprinzipien“ und „Betriebssystem“. Ich bin mir darüber nicht ganz im Klaren und werde ihn daher nicht im Detail erläutern. Daraus ist ersichtlich, dass die Grundkurse im Hochschulunterricht wirklich sehr wichtig sind. Ich glaube, dass Studierende, die diese professionellen Grundkurse studiert haben, die Rolle dieser Funktion sofort verstehen werden.

Abschließend verwenden wir den zweiten Parameter in dio_read(), um den Dateiinhalt basierend auf der Bytelänge zu lesen. Sie können sehen, dass der gelesene Inhalt in Segmenten mit einer Länge von 4 Zeichen ausgegeben wird.

总结

函数的学习还是比较简单的,核心的还是要知道这个扩展在什么业务场景下更适合使用。在文章开头的介绍中我们已经说明了直接操作文件与普通文件操作的一些区别,在自缓存应用或者需要传输非常大的数据时,直接操作对于 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视频教程

Das obige ist der detaillierte Inhalt vonInstallation und Verwendung der Direct IO-Erweiterung in PHP. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Dieser Artikel ist reproduziert unter:segmentfault.com. Bei Verstößen wenden Sie sich bitte an admin@php.cn löschen