検索
ホームページバックエンド開発PHPチュートリアルPHPのrar解凍・読み込み拡張パッケージを一緒に学びましょう!

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 サイトの他の関連記事を参照してください。

声明
この記事はsegmentfaultで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。
PHPセッションに保存されているデータをどのように変更しますか?PHPセッションに保存されているデータをどのように変更しますか?Apr 27, 2025 am 12:23 AM

tomodifydatainaphpsession、starthessession withsession_start()、$ _sessiontoset、modify、orremovevariables.1)startthessession.2)

PHPセッションに配列を保存する例を示します。PHPセッションに配列を保存する例を示します。Apr 27, 2025 am 12:20 AM

配列はPHPセッションに保存できます。 1。セッションを開始し、session_start()を使用します。 2。配列を作成し、$ _Sessionで保存します。 3. $ _Sessionを介して配列を取得します。 4.セッションデータを最適化してパフォーマンスを向上させます。

Garbage CollectionはPHPセッションでどのように機能しますか?Garbage CollectionはPHPセッションでどのように機能しますか?Apr 27, 2025 am 12:19 AM

PHPセッションガベージコレクションは、有効期限が切れたセッションデータをクリーンアップするために確率メカニズムを通じてトリガーされます。 1)構成ファイルにトリガー確率とセッションのライフサイクルを設定します。 2)Cronタスクを使用して、高負荷アプリケーションを最適化できます。 3)データの損失を避けるために、ごみ収集の頻度とパフォーマンスのバランスを取る必要があります。

どのようにしてPHPでセッションアクティビティをトレースできますか?どのようにしてPHPでセッションアクティビティをトレースできますか?Apr 27, 2025 am 12:10 AM

PHPでのユーザーセッションアクティビティの追跡は、セッション管理を通じて実装されます。 1)SESSION_START()を使用してセッションを開始します。 2)$ _Sessionアレイを介してデータを保存およびアクセスします。 3)セッションを終了するには、session_destroy()を呼び出します。セッショントラッキングは、ユーザーの動作分析、セキュリティ監視、パフォーマンスの最適化に使用されます。

データベースを使用してPHPセッションデータを保存するにはどうすればよいですか?データベースを使用してPHPセッションデータを保存するにはどうすればよいですか?Apr 27, 2025 am 12:02 AM

データベースを使用してPHPセッションデータを保存すると、パフォーマンスとスケーラビリティが向上します。 1)MySQLを構成してセッションデータを保存します:PHP.iniまたはPHPコードでセッションプロセッサを設定します。 2)カスタムセッションプロセッサを実装します:データベースと対話するために、開いて、閉じ、読み取り、書き込み、その他の機能を定義します。 3)最適化とベストプラクティス:インデックス、キャッシュ、データ圧縮、分散ストレージを使用して、パフォーマンスを向上させます。

PHPセッションの概念を簡単に説明してください。PHPセッションの概念を簡単に説明してください。Apr 26, 2025 am 12:09 AM

phpssionsStrackuserdataacrossmultiplepagerequestsusingauniqueidstoredinacookie.here'showtomanageetheemefectively:1)Startassession withsession_start()andstoredatain $ _ session.2)RegeneratesseSsessidafterloginwithsession_id(the topreventes_id)

PHPセッションに保存されているすべての値をどのようにループしますか?PHPセッションに保存されているすべての値をどのようにループしますか?Apr 26, 2025 am 12:06 AM

PHPでは、次の手順を通じてセッションデータを繰り返すことができます。1。session_start()を使用してセッションを開始します。 2。$ _Sessionアレイのすべてのキー価値ペアを介してforeachループを反復します。 3.複雑なデータ構造を処理する場合、is_array()またはis_object()関数を使用し、print_r()を使用して詳細情報を出力します。 4.トラバーサルを最適化する場合、ページングを使用して、一度に大量のデータの処理を避けることができます。これにより、実際のプロジェクトでPHPセッションデータをより効率的に管理および使用するのに役立ちます。

ユーザー認証にセッションを使用する方法を説明します。ユーザー認証にセッションを使用する方法を説明します。Apr 26, 2025 am 12:04 AM

このセッションは、サーバー側の状態管理メカニズムを介してユーザー認証を実現します。 1)セッションの作成と一意のIDの生成、2)IDはCookieを介して渡されます。3)サーバーストアとIDを介してセッションデータにアクセスします。

See all articles

ホット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 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

ホットツール

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

SecLists

SecLists

SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

mPDF

mPDF

mPDF は、UTF-8 でエンコードされた HTML から PDF ファイルを生成できる PHP ライブラリです。オリジナルの作者である Ian Back は、Web サイトから「オンザフライ」で PDF ファイルを出力し、さまざまな言語を処理するために mPDF を作成しました。 HTML2FPDF などのオリジナルのスクリプトよりも遅く、Unicode フォントを使用すると生成されるファイルが大きくなりますが、CSS スタイルなどをサポートし、多くの機能強化が施されています。 RTL (アラビア語とヘブライ語) や CJK (中国語、日本語、韓国語) を含むほぼすべての言語をサポートします。ネストされたブロックレベル要素 (P、DIV など) をサポートします。

SublimeText3 英語版

SublimeText3 英語版

推奨: Win バージョン、コードプロンプトをサポート!

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター