PHP のデフォルトの一時ファイル ディレクトリを取得する
Linux オペレーティング システムを学習したことがある人なら、/tmp というディレクトリがあることを知っているでしょう。ディレクトリ (Windows では通常: C:\Windows\Temp\)。システムの一時ファイルを保存するために使用されるため、このディレクトリは一時ファイル ディレクトリとも呼ばれます。多くのソフトウェアは、キャッシュや一時的に生成されたスクリプトなど、一時的に保存されたファイルをこのディレクトリに配置します。また、PHP はデフォルトで一時ファイル ディレクトリをこのディレクトリにポイントし、SESSION ファイルを含む一時ファイルはここに保存されます。これは、php.ini ファイルの sys_tmp_dir を介して設定できます。
もちろん、動的に実行される PHP プログラムでは、関数を通じて現在の一時ファイル ディレクトリを取得することもできます。
print_r(sys_get_temp_dir()); // /tmp
一時ファイルの作成
一時ファイル ディレクトリができたので、もちろん PHP は一時ファイルを直接作成するための関数を慎重に用意しています。
$tmpFile = tmpfile(); fwrite($tmpFile, "I'm tmp file."); // ll /tmp // vim phpbnAjbE sleep(10); fclose($tmpFile); // ll /tmp
tmpfile() 関数は、この一時ファイルの作成に使用されます。ファイル名やパスを指定する必要はありません。同時に、作成されるファイルのタイプは w、つまり It です。直接読み取りおよび書き込み可能なファイルです。 fclose() が呼び出されると、この一時ファイルは自動的に削除されます。マニュアルには、この機能で作成したファイルはスクリプト終了後に自動的に削除されると記載されていますが、テストしたところ、スクリプト終了時にファイルは削除されないことが判明しました。
関数を呼び出してコンテンツを書き込んだ後、10 秒間一時停止します。実際には、/tmp ディレクトリに移動して、ファイルが正常に生成されたかどうかを確認するだけです。ファイルの作成時刻に基づいて、対応する生成ファイルが見つかりました。そして、10秒後に fclose() を実行した後、再度ディレクトリを確認すると、ファイルが自動的に削除されていることがわかります。
ディレクトリの状態に基づいて一意の名前を持つ一時ファイルを作成する
最後に、PHP は一時ファイルを作成するための非常に使いやすい機能も提供します。
$tmpFile = tempnam('/Users/zhangyue/MyDoc/博客文章/dev-blog/php/202006/source', 'testtmp'); $f = fopen($tmpFile, "w"); fwrite($f, "I'm tmp file."); // ll /tmp // vim testtmpH7bptZ // etc目录没有写权限 $tmpFile = tempnam('/etc', 'testtmp'); $f = fopen($tmpFile, "w"); fwrite($f, "I'm tmp file."); // ll /etc // ll /tmp // vim testtmpTUNucM
tempnam() 関数。ディレクトリのステータスに基づいて一意の名前を持つ一時ファイルを生成します。ディレクトリのステータスは何に基づいていますか?上記のコード コメントからわかるように、2 番目の段落の /etc ディレクトリは通常、root 権限を持つディレクトリであり、root アカウント権限がなければ、ファイルを作成したり変更したりすることはできません。権限のないディレクトリ、またはまったく存在しないディレクトリの場合、tempnam() 関数は一時ファイル ディレクトリにファイルを生成します。コードの最初の部分のように、ディレクトリが正常に存在し、書き込み可能であれば、ファイルはこのディレクトリに通常どおり作成されます。
tempnam() 関数の 2 番目のパラメーターは、生成されるファイル名のプレフィックスを指定します。 tmpfile() 関数はファイル名を指定できませんが、この関数はファイル名に固定のプレフィックスを与え、プレフィックス以降の自動生成されたファイル名部分が一意であることを保証できます。
概要
これらの非常に興味深い関数を発見しました。一時キャッシュとして使用するか、ファイルを作成するために使用するかにかかわらず、これら 2 つの一時ファイル操作関数は非常に便利です。今後の開発ではこのような機能をさらに活用できるようになり、生産性が大幅に向上する可能性があります。
テスト コード:
https://github.com/zhangyue0503/dev-blog/blob/master/php/202006/source/%E5%9C%A8PHP%E4%B8%AD%E6%93%8D%E4%BD%9C%E4%B8%B4%E6%97%B6%E6%96%87%E4%BB%B6.php
推奨学習: php ビデオ チュートリアル