send

說明:

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

向客戶端發送數據

參數

$data

要發送的數據,如果在初始化Worker類時指定了協議,則會自動調用協議的encode方法,完成協議打包工作後發送給客戶端

$raw

是否發送原始數據,即不調用協議的encode方法,默认是false,即自動調用協議的encode方法

返回值

true 表示數據已經成功寫入到該連接的操作系統層的socket發送緩衝區

null 表示數據已經寫入到該連接的應用層發送緩衝區,等待向系統層socket發送緩衝區寫入

false 表示發送失敗,失敗原因可能是客戶端連接已經關閉,或者該連接的應用層發送緩衝區已滿

注意

send返回true,僅僅代表數據已經成功寫入到該連接的操作系統socket發送緩衝區,並不意味著數據已經成功的發送給對端socket接收緩衝區,更不意味著對端應用程序已經從本地socket接收緩衝區讀取了數據。即便如此,只要send不返回false並且網路沒有斷開,而且客戶端接收正常,數據基本上可以看做100%能發到對方的。

由於socket發送緩衝區的數據是由操作系統異步發送給對端的,操作系統並沒有給應用層提供相應確認機制,所以應用層無法得知socket發送緩衝區的數據何時開始發送,應用層更無法得知socket發送緩衝區的數據是否發送成功。基於以上原因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();