PHP開発では、特にSymlinksに関しては、ファイルパスの問題に対処する必要があることがよくあります。ファイルの実際のパスを取得することが特に重要になります。この記事では、IS_LINK()とRealPath()関数を組み合わせてファイルの実際のパスを正確に取得する方法を詳細に紹介します。
IS_LINK() :指定されたパスがシンボリックリンクであるかどうかを判断します。
RealPath() :指定されたパスの絶対パスを返し、すべてのシンボリックリンクを解析します。
RealPath()を単独で使用すると、ファイルへの実際のパスを直接取得できますが、場合によっては、まず象徴的なリンクであるかを判断し、次にパスへの対処方法を決定したいと思います。
<?php
// ファイルパスがあるとします
$filePath = '/var/www/html/symlink-file';
// まず、このパスが象徴的なリンクであるかどうかを判断します
if (is_link($filePath)) {
// それが象徴的なリンクの場合,使用 readlink() リンクが指し示されるパスを取得します
$linkTarget = readlink($filePath);
// もう一度使用してください realpath() リンクターゲットへの実際のパスを取得します
$realPath = realpath($linkTarget);
} else {
// それが象徴的なリンクではない場合,実際のパスを直接取得します
$realPath = realpath($filePath);
}
echo "ファイルの実際のパスはです: " . $realPath;
?>
上記のコードで:
is_link()を使用して、ファイルがシンボリックリンクであるかどうかを判断します。
シンボリックリンクの場合、最初にreadLink()を使用して、シンボリックリンクへのパスを取得します。
次に、 RealPath()を使用して、シンボリックリンクターゲットの絶対的な真のパスを取得します。
シンボリックリンクでない場合は、 RealPath()を直接呼び出して、Real Pathを取得します。
PHPコードでリモートファイルアドレスを処理する必要があり、アドレスにリダイレクトまたはシンボリックリンクが含まれる場合、操作する前にパスを解析できます。
サンプルコード:
<?php
$url = 'http://m66.net/path/to/symlink';
// 最初に分析します URL,パス部分を取得します
$parsedUrl = parse_url($url);
$path = $parsedUrl['path'] ?? '';
// ここでは、同じパスがローカルに存在すると仮定します,判断します
if (is_link($path)) {
$linkTarget = readlink($path);
$realPath = realpath($linkTarget);
} else {
$realPath = realpath($path);
}
echo "対応するファイルへの真のパスはです: " . $realPath;
?>
上記のコードは、is_link()とRealPath()を組み合わせてURLの実際のパス部分を取得する方法を示しています。
RealPath()によって返されるパスが存在する必要があります。そうしないと、 Falseが返されます。
ReadLink()は、シンボリックリンクにのみ使用でき、通常のファイルを処理できません。
リモートURLの場合、 is_link()およびRealPath()は適用されず、ローカルファイルシステムで使用する必要があります。
要約すると、 IS_LINK()とRealPath()を組み合わせることで、ファイルがシンボリックリンクであるかどうかをより正確に判断し、パスエラーによって引き起こされる潜在的な問題を回避するための実際のパスを取得できます。これは、ファイル操作、構成管理、その他のシナリオで非常に実用的です。