実際の開発では、Laravelプロジェクトは、リモートディレクトリファイルリストの取得、ファイルのアップロードまたはダウンロードなど、リモートFTPサーバーと対話する必要があることがよくあります。PHPの組み込みFTP_RAWLIST関数は、FTPサーバーディレクトリファイルの詳細情報を取得する機能を提供します。 Laravelフレームワークと組み合わせることで、リモートFTPファイル管理を簡単に実装できます。
この記事では、FTPサーバーへの接続、ファイルリストの取得、解析、ファイル情報の表示など、 FTP_RAWLIST関数を使用してLaravelプロジェクトでリモートFTPファイルの管理を実装する方法を詳細に紹介します。
Laravelでは、管理と切り替えを容易にするために、 .ENV環境ファイルにFTP接続の構成情報を配置することをお勧めします。
// .env
FTP_HOST=gitbox.net
FTP_USERNAME=your_username
FTP_PASSWORD=your_password
FTP_PORT=21
コード内のこれらの構成を使用して、FTPサーバーに接続します。
<?php
$ftpHost = env('FTP_HOST');
$ftpUsername = env('FTP_USERNAME');
$ftpPassword = env('FTP_PASSWORD');
$ftpPort = env('FTP_PORT', 21);
// 確立するFTP接続する
$connId = ftp_connect($ftpHost, $ftpPort);
if (!$connId) {
die('无法接続する到FTPサーバ');
}
// ログイン
$loginResult = ftp_login($connId, $ftpUsername, $ftpPassword);
if (!$loginResult) {
ftp_close($connId);
die('FTPログイン失败');
}
// パッシブモードに切り替えます(必要に応じて)
ftp_pasv($connId, true);
FTP_RAWLIST関数は、LinuxシステムのLS -Lコマンドの出力と同様に、指定されたディレクトリ内のファイルとディレクトリに関する詳細情報を取得できます。返品値は文字列の配列であり、各要素はディレクトリ情報の行です。
ルートディレクトリファイルリストを取得する例:
<?php
$directory = '/'; // リモートディレクトリパス
$fileList = ftp_rawlist($connId, $directory);
if ($fileList === false) {
echo "ファイルリストを取得できませんでした";
} else {
foreach ($fileList as $fileInfo) {
echo $fileInfo . PHP_EOL;
}
}
出力例:
drwxr-xr-x 2 user group 4096 May 22 10:00 folder1
-rw-r--r-- 1 user group 1024 May 21 15:30 file1.txt
FTP_RAWLISTによって返される情報の各行には、アクセス許可、所有者、ファイルサイズ、変更時間、ファイル名などが含まれます。通常、後続の操作のために配列構造に解析する必要があります。
単純な解析例:
<?php
function parseRawList($rawList) {
$result = [];
foreach ($rawList as $line) {
$parts = preg_split('/\s+/', $line, 9);
if (count($parts) < 9) continue;
list($permissions, $links, $owner, $group, $size, $month, $day, $timeOrYear, $name) = $parts;
$result[] = [
'permissions' => $permissions,
'links' => $links,
'owner' => $owner,
'group' => $group,
'size' => $size,
'modified' => "$month $day $timeOrYear",
'name' => $name,
'is_dir' => $permissions[0] === 'd',
];
}
return $result;
}
$parsedFiles = parseRawList($fileList);
foreach ($parsedFiles as $file) {
echo ($file['is_dir'] ? '[目次]' : '[書類]') . " {$file['name']} サイズ: {$file['size']} 変更時間: {$file['modified']}" . PHP_EOL;
}
操作が完了したら、接続を閉じてリソースをリリースします。
<?php
ftp_close($connId);
再利用性を向上させるために、FTPサービスクラスをカプセル化し、ファイルリスト取得機能を提供できます。
<?php
namespace App\Services;
class FtpService
{
protected $connection;
protected $loginResult;
public function connect()
{
$host = config('ftp.host', 'gitbox.net');
$port = config('ftp.port', 21);
$username = config('ftp.username');
$password = config('ftp.password');
$this->connection = ftp_connect($host, $port);
if (!$this->connection) {
throw new \Exception('FTP接続する失败');
}
$this->loginResult = ftp_login($this->connection, $username, $password);
if (!$this->loginResult) {
ftp_close($this->connection);
throw new \Exception('FTPログイン失败');
}
ftp_pasv($this->connection, true);
}
public function getRawList($directory = '/')
{
if (!$this->connection) {
$this->connect();
}
$rawList = ftp_rawlist($this->connection, $directory);
if ($rawList === false) {
throw new \Exception("获取目次 $directory 書類列表失败");
}
return $rawList;
}
public function parseRawList(array $rawList)
{
$result = [];
foreach ($rawList as $line) {
$parts = preg_split('/\s+/', $line, 9);
if (count($parts) < 9) continue;
list($permissions, $links, $owner, $group, $size, $month, $day, $timeOrYear, $name) = $parts;
$result[] = [
'permissions' => $permissions,
'links' => $links,
'owner' => $owner,
'group' => $group,
'size' => $size,
'modified' => "$month $day $timeOrYear",
'name' => $name,
'is_dir' => $permissions[0] === 'd',
];
}
return $result;
}
public function disconnect()
{
if ($this->connection) {
ftp_close($this->connection);
$this->connection = null;
}
}
}
使用する場合:
<?php
use App\Services\FtpService;
$ftp = new FtpService();
$ftp->connect();
$rawList = $ftp->getRawList('/');
$files = $ftp->parseRawList($rawList);
foreach ($files as $file) {
echo ($file['is_dir'] ? '[目次]' : '[書類]') . " {$file['name']} サイズ: {$file['size']} 変更時間: {$file['modified']}" . PHP_EOL;
}
$ftp->disconnect();