2

ユーザーがサーバー経由でファイルをダウンロードできるようにするために、次のコードがあります。

$ch_2 = curl_init();
curl_setopt($ch_2, CURLOPT_USERAGENT, 'Mozilla/4.0');
curl_setopt($ch_2, CURLOPT_URL, $download_link);
curl_setopt($ch_2, CURLOPT_AUTOREFERER, true);
curl_setopt($ch_2, CURLOPT_BINARYTRANSFER, true);
curl_setopt($ch_2, CURLOPT_COOKIESESSION, false);
curl_setopt($ch_2, CURLOPT_FAILONERROR, true);
curl_setopt($ch_2, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($ch_2, CURLOPT_FORBID_REUSE, true);
curl_setopt($ch_2, CURLOPT_FRESH_CONNECT, true);
curl_setopt($ch_2, CURLOPT_NOSIGNAL, true);
curl_setopt($ch_2, CURLOPT_RETURNTRANSFER, false);
curl_setopt($ch_2, CURLOPT_CONNECTTIMEOUT, 60);
curl_setopt($ch_2, CURLOPT_TIMEOUT, 86400);
curl_setopt($ch_2, CURLOPT_LOW_SPEED_LIMIT, 10240);
curl_setopt($ch_2, CURLOPT_LOW_SPEED_TIME, 60);
curl_setopt($ch_2, CURLOPT_MAX_RECV_SPEED_LARGE, 500);
curl_exec($ch_2);
$curl_errno_2 = curl_errno($ch_2);
curl_close($ch_2);

これらのファイル ($download_link にリンクされています) は非常に大きく、約 1 ~ 3 GB です。

このコードは正常に動作しますが、私の問題は、ユーザーがダウンロードを切断または中止した場合、サーバーが完全なファイル ($download_link) を受信するまでスクリプトが停止しないことです。

"ignore_user_abort(true)" を設定するとスクリプトが停止しますが、スクリプトでクライアントの切断やダウンロードの中止を確認し、これを処理できますか? たとえば、MySQLデータベース エントリなどを更新しますか?

たとえば、「readfile()」または fopen、fread を使用してこのコードを変更できることはわかっていますが、このcURLコードを使用します (そして使用する必要があります)。

ユーザーがIP アドレスごとに 1 つのダウンロード接続のみを許可するため、このユーザーの切断またはダウンロードの中止を確認することはできますか? したがって、ダウンロードが中止された場合、MySQL データベースを更新して、この IP アドレスからのダウンロード接続を管理することはできません。

4

1 に答える 1

3

シャットダウン機能を登録できます。これは、スクリプトが終了したとき、ユーザーが中止したとき、または exit() または die() を呼び出したときに呼び出されます。http://php.net/manual/en/function.register-shutdown-function.php

例: (からphp.net):

<?php
    function shutdown()
    {
        // This is our shutdown function, in
        // here we can do any last operations
        // before the script is complete.

        echo 'Script executed with success', PHP_EOL;
    }

    register_shutdown_function('shutdown');
?>

それがあなたが得ようとしている最も近いものです。

「ユーザーが IP アドレスごとに 1 つのダウンロード接続のみを許可するからですか?」

これを行うことをお勧めします:

  1. APCを使用して、現在何かをダウンロードしている IP アドレスを保存します
  2. シャットダウン関数を登録して、APC から IP アドレスを削除し、別のものをダウンロードできるようにします
于 2012-10-31T17:27:32.930 に答える