ホームページ  >  記事  >  バックエンド開発  >  PHPのファイルシステム機能をみんなで学ぼう(1)

PHPのファイルシステム機能をみんなで学ぼう(1)

藏色散人
藏色散人転載
2021-07-13 14:37:232960ブラウズ

この記事から始めて、PHP ファイル システムに関連する一連の関数を学習します。これらの関数は実際によく使うものが多く、意識して覚える必要はありませんが、「こういうものがある」ということを知っていれば、使う際には必ずドキュメントを確認してください。

ファイル パス関連関数

ファイル パス関連関数は一部のフレームワークでよく使用され、\_\_FILE\_\_ および \_\ と組み合わせて使用​​されることがよくあります。 _DIR \_\_ のようなマジック定数を使用します。

echo "1) ".basename("/etc/sudoers.d", ".d"), PHP_EOL;
echo "2) ".basename("/etc/passwd"), PHP_EOL;
echo "3) ".basename("/etc/"), PHP_EOL;
echo "4) ".basename("."), PHP_EOL;
echo "5) ".basename("/"), PHP_EOL;
echo "6) ".basename("/usr/local/Cellar/php/7.3.9_1/README.md"), PHP_EOL;
// 1) sudoers
// 2) passwd
// 3) etc
// 4) .
// 5) 
// 6) README.md

basename() 関数は、パス内のファイル名を取得するものです。これには 2 つのパラメータがあります。1 つ目はファイルのパスで、2 つ目はフィルタリングされたコンテンツです。たとえば、最初のパラメータをフィルタリングします。 test ステートメント ファイル拡張子を削除します。

echo "1) " . dirname("/etc/passwd") , PHP_EOL;
echo "2) " . dirname("/etc/") , PHP_EOL;
echo "3) " . dirname("."), PHP_EOL;
// 1) /etc
// 2) /
// 3) .

dirname() は、パスのパス部分、つまりファイル名を含まない部分を返します。これは、basename() のまったく逆の機能です。

print_r(pathinfo('/usr/local/Cellar/php/7.3.9_1/README.md'));
// Array
// (
//     [dirname] => /usr/local/Cellar/php/7.3.9_1
//     [basename] => README.md
//     [extension] => md
//     [filename] => README
// )

echo realpath('./../../..//../etc/passwd'), PHP_EOL;
// /private/etc/passwd

pathinfo() 関数は、パス内の情報を配列形式で返すために使用されます。結果から、ファイルの dirname 部分、basename 部分、およびファイル拡張子拡張子を確認できます。拡張子なし ファイル名の内容。

realpath() は、正規化された絶対パス名を返します。すべてのシンボリック接続を展開し、入力パス内の ./、../、および冗長な / を処理します。返される内容は、絶対的な標準仕様のパスです。

ファイルの所有権関連情報の変更

次に、ファイル関連の属性を変更するいくつかの関数、主に Linux システム環境におけるファイルのアクセス許可情報の操作について学習します。

もちろん、最初にファイルを作成する必要があります。これは Linux のコマンドに非常に似ています。

touch('test3.txt');

touch() 関数には、作成するファイルの名前を指定するだけでなく、ファイルの作成時間とアクセス時間を指定できる 2 つのオプションのパラメータもあります。パラメータが指定されない場合、デフォルトは現在時刻です。このファイル名は、アクセス許可のあるディレクトリへの相対パスまたは絶対パスにすることができ、そのディレクトリ内に空のファイルが作成されます。

echo fileowner('test.txt'), PHP_EOL; // 501
chown('test.txt', 'www');
clearstatcache();
echo fileowner('test.txt'), PHP_EOL; // 70

fileowner() 関数を通じて、ファイルが属するユーザーを取得できます。デフォルトでは、ユーザーは現在 PHP スクリプトを実行しているユーザー、つまりシステムに現在ログインしているユーザーです。 。ここでは、chown() 関数を使用してユーザーを www ユーザーに変更します。 clearstatcache() はファイル システムのキャッシュ情報をクリアするために使用されますが、キャッシュ情報がクリアされていない場合でも、fileowner() は以前のユーザー情報を返します。

echo filegroup('test.txt'), PHP_EOL; // 20
chgrp('test.txt', 'www');
clearstatcache();
echo filegroup('test.txt'), PHP_EOL; // 70

echo substr(sprintf('%o', fileperms('test.txt')), -4), PHP_EOL; // 0766
chmod('test.txt', 0777);
clearstatcache();
echo substr(sprintf('%o', fileperms('test.txt')), -4), PHP_EOL; // 0777

同様に、filegroup() 関数を使用してファイルのグループ情報を取得し、chgrp() を使用してファイルのグループを変更します。 fileperms() は、ファイルのアクセス許可情報を返すために使用されます。数値モードでファイル アクセス許可を返します。ここでは、sprintf() を使用して結果をフォーマットし、一般的に使用される Linux システム許可フォーマットを取得します。 chmod() 関数は、ファイルのアクセス許可を変更するために使用されます。そのアクセス許可パラメーターは、Linux システムで 1、2、4 とその組み合わせを表す 8 進データで構成される 3 つの数値であるため、前の 0 が使用されるように追加する必要があります。操作が正しく実行できることを確認します。システム ファイルのアクセス許可に関する知識については、Linux システムの関連コンテンツを注意深く学習する必要があります。

上記の関数がコマンド ラインで実行できない場合、その原因のほとんどは権限の欠如であることに注意してください。sudo を使用してテストできます。 fastcgi で実行する場合は、アクセス許可の問題にさらに注意を払い、サーバーが操作できるディレクトリ内でのみファイルのアクセス許可を安全に変更する必要があります。

print_r(stat('test.txt'));
// Array
// (
//     [0] => 16777220
//     [1] => 8707958352
//     [2] => 33279
//     [3] => 2
//     [4] => 70
//     [5] => 70
//     [6] => 0
//     [7] => 0
//     [8] => 1603070453
//     [9] => 1603070453
//     [10] => 1603072836
//     [11] => 4096
//     [12] => 0
//     [dev] => 16777220
//     [ino] => 8707958352
//     [mode] => 33279
//     [nlink] => 2
//     [uid] => 70
//     [gid] => 70
//     [rdev] => 0
//     [size] => 0
//     [atime] => 1603070453
//     [mtime] => 1603070453
//     [ctime] => 1603072836
//     [blksize] => 4096
//     [blocks] => 0
// )

stat() 関数は、指定したファイルのすべての属性情報を取得することができ、ファイルの uid、gid、ctime、mtime などの情報を確認できます。

ソフトおよびハード ファイル接続に関連する操作

Linux システムには、ソフト接続とハード接続に関する関連知識があります。実際、ソフト リンクは Windows のショートカットに似ていますが、ハード リンクはデータのコピーのコピーに関連しています。 PHP では、ソフト接続とハード接続の作成と、いくつかの関連操作も提供します。

link('test.txt', 'ltest.txt');
echo linkinfo('ltest.txt'), PHP_EOL; // 16777220

symlink('test.txt', 'ltest2.txt');
echo linkinfo('ltest2.txt'), PHP_EOL; // 16777220

print_r(lstat('ltest2.txt'));
// Array
// (
//     [0] => 16777220
//     [1] => 8707962848
//     [2] => 41453
//     [3] => 1
//     [4] => 0
//     [5] => 20
//     [6] => 0
//     [7] => 8
//     [8] => 1603072717
//     [9] => 1603072717
//     [10] => 1603072717
//     [11] => 4096
//     [12] => 0
//     [dev] => 16777220
//     [ino] => 8707962848
//     [mode] => 41453
//     [nlink] => 1
//     [uid] => 0
//     [gid] => 20
//     [rdev] => 0
//     [size] => 8
//     [atime] => 1603072717
//     [mtime] => 1603072717
//     [ctime] => 1603072717
//     [blksize] => 4096
//     [blocks] => 0
// )

link() 関数を使用すると、指定したファイルのハード リンク ファイルが作成され、symlink() 関数を使用するとソフト リンク ファイルが作成されます。比較的、より多くのシナリオでソフト接続を使用します。 lstat() は stat() 関数と同じ機能を持ち、ファイルのさまざまな属性情報を表示しますが、lstat() 関数はソフト リンク ファイルとハード リンク ファイルを対象としています。

lchown('ltest2.txt', 'zhangyue');
lchgrp('ltest2.txt', 'staff');
// lrwxr-xr-x  1 zhangyue  staff      8 Oct 19 09:58 ltest2.txt -> test.txt

同様に、ソフト接続およびハード接続のユーザーおよびユーザー グループ情報を変更することもできますが、その情報は fileowner() または filegroup() を通じて表示することはできません。接続ファイルであるため、元のファイルにバインドされており、fileowner() などの関数を使用して、元のファイルの情報を表示することができます。システム環境で ls -l を使用すると、接続ファイルのユーザーおよびユーザー グループ情報が正常に変更されたかどうかを確認できます。

概要

今日の内容は比較的単純で、アクセス許可を変更する操作は一般的には使用されません。ただし、これらは依然としてシステム セキュリティにとって非常に役立ちます。たとえば、アップロードの場合、実行可能ファイルのアップロードを防止したい場合は、ファイルのアクセス許可を変更してファイルが直接実行されないようにすることができます。セキュリティ保護。また、ディレクトリパスに関する操作も一部のフレームワークの基礎となっており、dirname()やbasename()などの関数は、ほぼすべてのフレームワークやComposerの入り口に登場します。

测试代码:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202010/source/6.PHP中的文件系统函数(一).php
参考文档:
https://www.php.net/manual/zh/ref.filesystem.php

推荐学习:《PHP视频教程

以上がPHPのファイルシステム機能をみんなで学ぼう(1)の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はsegmentfault.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。