目次
圧縮パッケージ ハンドルを取得する RARArchive
圧縮パッケージ内の各エンティティ ファイルまたはディレクトリは、RarEntryを操作します。
例外処理
概要
ホームページ バックエンド開発 PHPチュートリアル PHPのrar解凍・読み込み拡張パッケージを一緒に学びましょう!

PHPのrar解凍・読み込み拡張パッケージを一緒に学びましょう!

Jun 24, 2021 pm 03:36 PM
php

PHPのrar解凍と拡張パッケージの読み込みを一緒に学びましょう!

PHP の rar 解凍と読み取り拡張パッケージについて学ぶ

圧縮と解凍の拡張研究として、2 つのエース圧縮形式である rar と zip は常にコンピュータ分野で最も普及している圧縮ターミネータ。 Windows システムでは rar 形式の圧縮パッケージが優勢に近づいています。今日学習する PHP 拡張機能は rar 圧縮パッケージの操作用です。ただし、PHP の rar 拡張機能は rar 形式の圧縮パッケージの読み取りと解凍のみが可能であり、圧縮操作は実行できません。

php-rar pecl 拡張機能のインストール パッケージは古いため、PHP7 では使用できません。PHP7 環境に正常にインストールするには、github 上のソース コードを使用してコンパイルし、インストールする必要があります。

https://github.com/cataphract/php-rar

git clone を直接実行した後、PHP 拡張機能の通常の方法でインストールできます。

圧縮パッケージ ハンドルを取得する RARArchive

$arch = RarArchive::open("test.rar");

$archNo = rar_open("test.rar");

echo $arch, PHP_EOL; // RAR Archive "/data/www/blog/test.rar"
echo $archNo, PHP_EOL; // RAR Archive "/data/www/blog/test.rar"

$arch->close();
rar_close($archNo);

echo $arch, PHP_EOL; // RAR Archive "/data/www/blog/test.rar" (closed)
echo $archNo, PHP_EOL; // RAR Archive "/data/www/blog/test.rar" (closed)
ログイン後にコピー

php-rar 拡張機能には 2 つの記述形式があります。1 つはオブジェクト指向です。つまり、RarArchive クラスを使用して圧縮パッケージを操作します。もう 1 つの方法は、関数 rar_open を直接使用して rar ファイルのハンドルを取得することです。これらはすべて __toString メソッドをオーバーライドするため、ハンドルの内容を直接出力して、現在のハンドルによって操作される特定のファイルを確認できます。

ハンドルを閉じると、ハンドル オブジェクトは引き続き出力できますが、後で閉じたことが表示されます。この時点のハンドル オブジェクトは他の操作を実行できなくなります。

$arch = RarArchive::open("test.rar");
$archNo = rar_open("test.rar");

echo $arch->getComment(), PHP_EOL;
echo $arch->isBroken(), PHP_EOL;
echo $arch->isSolid(), PHP_EOL;

echo rar_comment_get($archNo), PHP_EOL;
echo rar_broken_is($archNo), PHP_EOL;
echo rar_solid_is($archNo), PHP_EOL;

echo $arch->setAllowBroken(true), PHP_EOL;
echo rar_allow_broken_set($archNo, true), PHP_EOL;
ログイン後にコピー

RarArchive オブジェクトの一部のメソッドは、現在の圧縮パッケージに関する情報を取得するのに役立ちます。たとえば、getComment() は圧縮パッケージの説明情報を取得し、isBroken() は現在の圧縮パッケージが破損しているかどうかを取得し、isSolid() は現在の圧縮パッケージが利用可能かどうかを確認します。 setAllowBroken() メソッドを使用すると、破損した圧縮パッケージを操作できるようになります。ここではオブジェクト指向とプロセス指向の書き方を紹介します。

圧縮パッケージ内の各エンティティ ファイルまたはディレクトリは、RarEntryを操作します。

圧縮パッケージのハンドルを取得した後、さらに圧縮パッケージ内のコンテンツを取得する必要があります。ハンドル オブジェクトは、圧縮パッケージ内の各ファイルとディレクトリのオブジェクト RAREntry をすでに保存しています。

$gameEntry = $arch->getEntry('ldxlcs/ldxlcs/game.htm');
echo $gameEntry->getName(), PHP_EOL; // ldxlcs/ldxlcs/game.htm
echo $gameEntry->getUnpackedSize(), PHP_EOL; // 56063

$gameEntryNo = rar_entry_get($arch, "ldxlcs/ldxlcs/game.htm");
echo $gameEntry->getName(), PHP_EOL; // ldxlcs/ldxlcs/game.htm
echo $gameEntry->getUnpackedSize(), PHP_EOL; // 56063

$fp = $gameEntryNo->getStream();
while (!feof($fp)) {
    $buff = fread($fp, 8192);
    if ($buff !== false) {
        echo $buff;
    } else {
        break;
    }
    //fread error
}
// 输出文件的全部内容
echo PHP_EOL;

echo 'Entry extract: ', $gameEntry->extract("./"), PHP_EOL;
ログイン後にコピー

ハンドル オブジェクトの getEntry() メソッドは、指定されたファイルまたはディレクトリの内容を取得するために使用されます。単一のファイルまたはディレクトリを取得するため、取得するファイルの内容を明示的に指定する必要があります。このメソッドを通じて、RarEntry オブジェクトを取得できます。次に、このオブジェクトに対していくつかの操作が行われます。

RarEntry オブジェクトの getName() メソッドを使用してファイル名を取得します。このファイル名にはパスがあり、このパスは圧縮パッケージ内の絶対パスです。 getUnpackedSize() メソッドはファイルのサイズを取得するために使用され、getStream() はファイル ストリームを取得するために使用され、getStream() メソッドを通じてファイルの内容を直接出力できます。

もちろん、最も重要なことは、extract() メソッドを通じて指定されたディレクトリにファイルを直接抽出できることです。 php-rar 拡張子は、圧縮パッケージ全体を完全に解凍できる方法を提供していないため、圧縮パッケージ全体を解凍する必要がある場合は、圧縮パッケージの内容全体をループしてこれらのファイルを 1 つずつ解凍する必要があります。 。

最後に、圧縮パッケージの内容をすべて走査する方法を見てみましょう。

$entries = $arch->getEntries();

foreach ($entries as $en) {
    echo $en, PHP_EOL;
    echo $en->getName(), PHP_EOL;
    echo $en->getUnpackedSize(), PHP_EOL;
    echo $en->getAttr(), PHP_EOL;
    echo $en->getCrc(), PHP_EOL;
    echo $en->getFileTime(), PHP_EOL;
    echo $en->getHostOs(), PHP_EOL;
    echo $en->getMethod(), PHP_EOL;
    echo $en->getPackedSize(), PHP_EOL;
    echo $en->getVersion(), PHP_EOL;
    echo $en->isDirectory(), PHP_EOL;
    echo $en->isEncrypted(), PHP_EOL;

}

// 压缩包中所有文件的内容
// RarEntry for file "ldxlcs/ldxlcs/game.htm" (3c19abf6)
// ldxlcs/ldxlcs/game.htm
// 56063
// 32
// 3c19abf6
// 2017-09-10 13:25:04
// 2
// 51
// 7049
// 200
// ……

$entriesNo = rar_list($archNo);
foreach ($entriesNo as $en) {
    echo $en->getName(), PHP_EOL;
}
ログイン後にコピー

RarArchive オブジェクトの getEntries() メソッドを直接使用します。このメソッドを通じて、rar 圧縮パッケージのすべての内容を含む、RarEntry オブジェクトの配列を取得できます。このコードでは、RarEntry オブジェクトの他の属性メソッドも出力しました。名前に基づいて、これらのメソッドがファイルに関するさまざまな情報を取得するために使用されることが大まかに理解できます。これらのメソッドは自分でテストできます。

例外処理

最後に、間違ったファイルを開いたり、圧縮パッケージ内にないファイルを取得したりすると、php-rar 拡張子は PHP エラーの形式でエラーを報告します。 。ただし、完全なオブジェクト指向の記述方法を提供するため、オブジェクト指向の例外処理メカニズムのセットも提供する必要があります。

// 不打开 UsingExceptions 全部错误会走 PHP 错误机制,打开后走 PHP 的异常机制
RarException::setUsingExceptions(true);
var_dump(RarException::isUsingExceptions()); // bool(true)
try {
    $arch = RarArchive::open("test1.rar");
    $arch->getEntry('ttt.txt');
} catch (RarException $e) {
    var_dump($e);
    // object(RarException)#35 (7) {
    //     ["message":protected]=>
    //     string(91) "unRAR internal error: Failed to open /data/www/blog/test1.rar: ERAR_EOPEN (file open error)"
    //     ["string":"Exception":private]=>
    //     string(0) ""
    //     ["code":protected]=>
    //     int(15)
    //     ["file":protected]=>
    //     string(22) "/data/www/blog/rar.php"
    //     ["line":protected]=>
    //     int(93)
    //     ["trace":"Exception":private]=>
    //     array(1) {
    //       [0]=>
    //       array(6) {
    //         ["file"]=>
    //         string(22) "/data/www/blog/rar.php"
    //         ["line"]=>
    //         int(93)
    //         ["function"]=>
    //         string(4) "open"
    //         ["class"]=>
    //         string(10) "RarArchive"
    //         ["type"]=>
    //         string(2) "::"
    //         ["args"]=>
    //         array(1) {
    //           [0]=>
    //           string(9) "test1.rar"
    //         }
    //       }
    //     }
    //     ["previous":"Exception":private]=>
    //     NULL
    //   }
}
ログイン後にコピー

RarException::setUsingExceptions() が true に設定されている限り、php-rar 拡張機能の例外処理メカニズムを有効にすることができます。このとき、エラー ファイルを開くか、圧縮パッケージのファイル パスを指定すると、例外の形式でエラー メッセージがスローされます。

概要

この拡張機能セットは非常に使いやすいと思いますか?つまり、オブジェクト指向のアプローチと、機能操作に焦点を当てたプロセス指向のアプローチを提供します。ただし、古いコードと新しいアイデアの両方を考慮する必要があり、拡張機能自体の内部実装がはるかに複雑になるため、これを行うメリットは実際にはあまり多くありません。自分でコードを書くときはこのような書き方はせず、リファクタリングの際は段階的に最新の形に移行するようにしています。

关于 rar 的压缩操作并没有找到太多有用的资料。当然,我们在生产环境中如果要生成压缩包的话大部分情况下都会直接去生成 zip 格式的提供给用户,毕竟大部分的客户端软件都是能够同时支持 rar 和 zip 格式文件的解压的,如果一定要指定生成 rar 的话,也可以多多和产品经理或者客户商量。有的时候,技术的难点是可以通过业务的变通来解决的,最重要的其实还是在于沟通。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/202007/source/PHP%E7%9A%84rar%E8%A7%A3%E5%8E%8B%E8%AF%BB%E5%8F%96%E6%89%A9%E5%B1%95%E5%8C%85%E5%AD%A6%E4%B9%A0.php
ログイン後にコピー

推荐:《PHP视频教程

以上がPHPのrar解凍・読み込み拡張パッケージを一緒に学びましょう!の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Ubuntu および Debian 用の PHP 8.4 インストールおよびアップグレード ガイド Dec 24, 2024 pm 04:42 PM

PHP 8.4 では、いくつかの新機能、セキュリティの改善、パフォーマンスの改善が行われ、かなりの量の機能の非推奨と削除が行われています。 このガイドでは、Ubuntu、Debian、またはその派生版に PHP 8.4 をインストールする方法、または PHP 8.4 にアップグレードする方法について説明します。

今まで知らなかったことを後悔している 7 つの PHP 関数 今まで知らなかったことを後悔している 7 つの PHP 関数 Nov 13, 2024 am 09:42 AM

あなたが経験豊富な PHP 開発者であれば、すでにそこにいて、すでにそれを行っていると感じているかもしれません。あなたは、運用を達成するために、かなりの数のアプリケーションを開発し、数百万行のコードをデバッグし、大量のスクリプトを微調整してきました。

PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 PHP 開発用に Visual Studio Code (VS Code) をセットアップする方法 Dec 20, 2024 am 11:31 AM

Visual Studio Code (VS Code とも呼ばれる) は、すべての主要なオペレーティング システムで利用できる無料のソース コード エディター (統合開発環境 (IDE)) です。 多くのプログラミング言語の拡張機能の大規模なコレクションを備えた VS Code は、

JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 JSON Web Tokens(JWT)とPHP APIでのユースケースを説明してください。 Apr 05, 2025 am 12:04 AM

JWTは、JSONに基づくオープン標準であり、主にアイデンティティ認証と情報交換のために、当事者間で情報を安全に送信するために使用されます。 1。JWTは、ヘッダー、ペイロード、署名の3つの部分で構成されています。 2。JWTの実用的な原則には、JWTの生成、JWTの検証、ペイロードの解析という3つのステップが含まれます。 3. PHPでの認証にJWTを使用する場合、JWTを生成および検証でき、ユーザーの役割と許可情報を高度な使用に含めることができます。 4.一般的なエラーには、署名検証障害、トークンの有効期限、およびペイロードが大きくなります。デバッグスキルには、デバッグツールの使用とロギングが含まれます。 5.パフォーマンスの最適化とベストプラクティスには、適切な署名アルゴリズムの使用、有効期間を合理的に設定することが含まれます。

PHPでHTML/XMLを解析および処理するにはどうすればよいですか? PHPでHTML/XMLを解析および処理するにはどうすればよいですか? Feb 07, 2025 am 11:57 AM

このチュートリアルでは、PHPを使用してXMLドキュメントを効率的に処理する方法を示しています。 XML(拡張可能なマークアップ言語)は、人間の読みやすさとマシン解析の両方に合わせて設計された多用途のテキストベースのマークアップ言語です。一般的にデータストレージに使用されます

母音を文字列にカウントするPHPプログラム 母音を文字列にカウントするPHPプログラム Feb 07, 2025 pm 12:12 PM

文字列は、文字、数字、シンボルを含む一連の文字です。このチュートリアルでは、さまざまな方法を使用してPHPの特定の文字列内の母音の数を計算する方法を学びます。英語の母音は、a、e、i、o、u、そしてそれらは大文字または小文字である可能性があります。 母音とは何ですか? 母音は、特定の発音を表すアルファベットのある文字です。大文字と小文字など、英語には5つの母音があります。 a、e、i、o、u 例1 入力:string = "tutorialspoint" 出力:6 説明する 文字列「TutorialSpoint」の母音は、u、o、i、a、o、iです。合計で6元があります

PHPでの後期静的結合を説明します(静的::)。 PHPでの後期静的結合を説明します(静的::)。 Apr 03, 2025 am 12:04 AM

静的結合(静的::) PHPで後期静的結合(LSB)を実装し、クラスを定義するのではなく、静的コンテキストで呼び出しクラスを参照できるようにします。 1)解析プロセスは実行時に実行されます。2)継承関係のコールクラスを検索します。3)パフォーマンスオーバーヘッドをもたらす可能性があります。

PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? PHPマジックメソッド(__construct、__destruct、__call、__get、__setなど)とは何ですか? Apr 03, 2025 am 12:03 AM

PHPの魔法の方法は何ですか? PHPの魔法の方法には次のものが含まれます。1。\ _ \ _コンストラクト、オブジェクトの初期化に使用されます。 2。\ _ \ _リソースのクリーンアップに使用される破壊。 3。\ _ \ _呼び出し、存在しないメソッド呼び出しを処理します。 4。\ _ \ _ get、dynamic属性アクセスを実装します。 5。\ _ \ _セット、動的属性設定を実装します。これらの方法は、特定の状況で自動的に呼び出され、コードの柔軟性と効率を向上させます。

See all articles