onWorkerStart里面是stream流數(shù)據(jù),導(dǎo)致前端連接失敗,因為在不停的推送數(shù)據(jù),默認(rèn)沒有執(zhí)行完成,求1個思路,感謝。
<?php
use Workerman\Worker;
use Workerman\Connection\TcpConnection;
use GuzzleHttp\Client;
use GuzzleHttp\Psr7;
require 'vendor/autoload.php';
$worker = new Worker("websocket://127.0.0.1:2000");
$worker->onWorkerStart = function ($worker) {
// 創(chuàng)建一個 Guzzle 客戶端實例
$client = new Client();
// 設(shè)置請求頭
$headers = [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer 123456789...'
];
// 發(fā)起請求并傳遞請求頭
$promise = $client->getAsync('這里是一個流鏈接地址,會不停的推送如下圖所示的數(shù)據(jù)', [
'headers' => $headers,
'stream' => true
]);
// 等待Promise解析為響應(yīng)
$response = $promise->wait();
// 檢查響應(yīng)是否成功
if ($response->getStatusCode() == 200) {
// 獲取響應(yīng)體流
$body = $response->getBody();
// 逐行讀取數(shù)據(jù)
while (!$body->eof()) {
$line = Psr7\Utils::readLine($body);
if ($line) {
var_dump($line);
// 在這里我想實現(xiàn),把line數(shù)據(jù)推送給前端連接對象,$line數(shù)據(jù)格式如下圖所示
// 但是前端連接不上,上面代碼[ while (!$body->eof()) { ]逐行讀取影響了,因為在不停的推送數(shù)據(jù),沒有執(zhí)行完成
// 上面的while注釋掉,前端可以連接成功
}
}
// 關(guān)閉流
$body->close();
} else {
echo "請求失敗: " . $response->getStatusCode() . "\n";
}
};
// 當(dāng)客戶端建立連接時,不匹配則主動斷開
$worker->onConnect = function ($connection) {
$connection->onWebSocketConnect = function ($connection, $http_header) {
$token = $_GET["token"];
$symbol = $_GET["symbol"];
if ($token != '673eb112dcd3ca2a2d7024a84d8cd6ef') {
$connection->close();
} else {
$connection->symbol = $symbol;
}
};
};
// 當(dāng)有客戶端發(fā)來消息時,執(zhí)行的回調(diào)函數(shù)
$worker->onMessage = function (TcpConnection $connection, $data) {
if ($data == "pong") {
$connection->send('heartbeat');
}
};
// 向所有驗證的用戶推送對應(yīng)的數(shù)據(jù)
function broadcast($msg, $symbol)
{
global $worker;
foreach ($worker->connections as $connection) {
$connection->send($msg);
}
}
// 運行worker
Worker::runAll();
<script type="text/javascript">
ws = new WebSocket("ws://127.0.0.1/?token=673eb112dcd3ca2a2d7024a84d8cd6ef&symbol=EUR_USD");
ws.onopen = function() {
console.log("連接成功");
var heartbeat = setInterval(function(){
ws.send('pong');
},10000);
}
ws.onmessage = function(e) {
console.log(e.data);
}
</script>