1

PHPストリームアプリケーションを作成しようとしています。問題は、2 人のユーザーが同時に接続することを許可できないことです。なぜなら、彼らは料金を支払っているので、ストリームを共有しても意味がないからです。

したがって、私の解決策は、MySQL データベースに行を追加して、ユーザーが 1 でログインしているかどうかを記録し、ユーザーが停止またはキャンセルすると、ストリーム レコードが 0 に戻されるようにすることでした。問題は、検出できないところです。ユーザーが接続を中止したとき。私はすべてを試しました、私は思う:ignore_user_abort(true), while(!connection_aborted){readfile($stream)}...

複数のストリーム ファイルがありますが、解決策に最も近いと思われるものをここに置きます。O ともう 1 つ、動的ストリーム/ユーザー名/パスワードを一切使用していない間、しばらくの間機能しました。したがって、ここにファイルがあります:

<?php

require "../general/bootstrap.php"; // Include bootstrap
require "../general/error.php"; // Comertials when error

session_write_close();
ignore_user_abort(TRUE);
set_time_limit(0);

header("Expires: Sat, 26 Jul 1997 05:00:00 GMT"); // Date in history
header("Content-Transfer-Encoding: binary");
header("Cache-control: no-cache");
header('Pragma: no-cache');

if (count($items) != 3) {
    if (isset($items[1]) && !empty($items[1])) {
        $username = $items[1];
    } else {
        $username = null;
    }
    error("Missing one or more arguments(tv, username, password)!", $username);
}

$channel = (string) $items[0];
$username = (string) $items[1];
$password = (string) $items[2];

if (stream::channel_exists($channel)) {
    if (stream::channel_is_tv($channel)) {
        header('Content-Disposition: attachment; filename="stream.xspf"');
    } else {
        header('Content-Disposition: attachment; filename="stream.m3u"');
    }
} else {
    header('Content-Disposition: attachment; filename="stream.xspf"');
}

if (!stream::user_has_channel($username, $channel)) {
    error("User has requested channel '$channel' that it doesn't have!", $username);
}

if (!user::login($username, $password)) {
    error("Login failed! - probably because of trying to log in from 2 places at the same time or invalid username/password combination!", $username);
}

if (!isset($stream))
    $stream = stream::get_channel_stream($channel); // returns http://xxx.xxx.xxx.xxx/channel

function flush_buffers() {
    ob_end_flush();
    ob_flush();
    flush();
    //ob_start();
    fastcgi_finish_request();
}

// STREAM START
stream:
while(!connection_aborted() && user::is_enabled($username)) {
    readfile($stream);
    flush_buffers();
}
//STREAM END

sleep(10);

if(!connection_aborted()){
    goto stream;
}

user::logout($username);
exit();`
4

3 に答える 3

1

私がそれを正しく理解していれば、これはあなたが必要とするものです: http://php.net/manual/en/function.connection-aborted.php

于 2013-05-28T10:26:02.853 に答える
0

これに対する解決策の 1 つは、スクリプトをスレッドとして実行し、exec()、shell_exec、または proc_open() を使用してバックグラウンドで実行することです。このようにして、プロセスを監視し、スクリプトが正常に終了したか中止されたかを簡単に検出できます。パイプを簡単に開いて監視できるように、proc_open() を使用することをお勧めします。

proc_open() を扱ういくつかの便利なリンクを次に示します。

http://php.net/manual/en/function.proc-open.php

http://www.分子科学.org/PHP/proc_open_tutorial_and_examples

http://phptutorial.info/?proc-open

于 2013-05-28T10:24:50.907 に答える
0

つまり、else ステートメントを使用して最後の if ステートメントにこれらの行を含める必要があるため、ユーザーは接続が中止された場合にのみログアウトされます。

if(!connection_aborted())
   {
    goto stream;
   }
else
    user::logout($username);
    exit();`
   }

ストリーミングしているコンテンツのファイル サイズがわかっている場合は、そのバイト数がユーザーに送信された後に接続を切断できます。

于 2013-05-28T10:27:43.600 に答える