send

説明:

mixed Connection::send(mixed $data [,$raw = false])

クライアントにデータを送信します。

パラメータ

$data

送信するデータです。Workerクラスを初期化する際にプロトコルを指定した場合、プロトコルのencodeメソッドが自動的に呼び出され、プロトコルのパッキングが完了した後にクライアントに送信されます。

$raw

生データを送信するかどうかを指定します。つまり、プロトコルのencodeメソッドを呼び出さない場合、デフォルトはfalseで、プロトコルのencodeメソッドが自動的に呼び出されます。

戻り値

true は、データがこの接続のオペレーティングシステムのレベルのソケット送信バッファに正常に書き込まれたことを示します。

null は、データがこの接続のアプリケーション層送信バッファに書き込まれたことを示し、システムレベルのソケット送信バッファに書き込まれるのを待っています。

false は、送信に失敗したことを示します。失敗の原因は、クライアント接続がすでに閉じられているか、この接続のアプリケーション層送信バッファが満杯である可能性があります。

注意

sendがtrueを返すことは、データがこの接続のオペレーティングシステムのソケット送信バッファに正常に書き込まれたことを示すだけであり、データが対向ソケットの受信バッファに正常に送信されたことを意味するものではありませんし、対向アプリケーションがローカルソケットの受信バッファからデータを読み取ったことを意味するものでもありません。しかしながら、sendがfalseを返さず、ネットワークが切断されず、クライアントが正常に受信する限り、データは基本的に100%相手に送信できたと考えられます。

ソケット送信バッファのデータはオペレーティングシステムによって非同期に相手に送信されますが、オペレーティングシステムはアプリケーション層に対してその確認メカニズムを提供していないため、アプリケーション層はソケット送信バッファのデータがいつ送信を開始したのかを知ることができず、アプリケーション層はソケット送信バッファのデータが送信に成功したかどうかを知ることはできません。以上の理由から、workermanはメッセージ確認インターフェースを直接提供していません。

もしビジネスが各メッセージがクライアントに届くことを保証する必要がある場合、ビジネス上で確認メカニズムを追加することができます。確認メカニズムはビジネスによって異なる場合があり、同一のビジネス確認メカニズムでも多様な方法があります。

例えば、チャットシステムではこのような確認メカニズムを使用することができます。各メッセージをデータベースに保存し、各メッセージには既読フラグがあります。クライアントがメッセージを受け取るたびにサーバーに確認パッケージを送信し、サーバーは対応するメッセージを既読にします。クライアントがサーバーに接続するとき(一般的にはユーザーがログインするか接続が切れて再接続する際)、データベースに未読メッセージがあるかを確認し、あればクライアントに送信します。同様に、クライアントがメッセージを受信した後、サーバーに既読通知をします。こうすることで、各メッセージが相手に届くことを保証できます。もちろん、開発者は独自の確認ロジックを用いることもできます。

use Workerman\Worker;
use Workerman\Connection\TcpConnection;
require_once __DIR__ . '/vendor/autoload.php';

$worker = new Worker('websocket://0.0.0.0:8484');
$worker->onMessage = function(TcpConnection $connection, $data)
{
    // \Workerman\Protocols\Websocket::encodeを自動的に呼び出してwebsocketプロトコルデータにパッケージ化して送信します
    $connection->send("hello\n");
};
// Workerを実行します
Worker::runAll();