onWorkerStart里面是stream流數(shù)據(jù),導(dǎo)致前端連接失敗,因?yàn)樵诓煌5耐扑蛿?shù)據(jù),默認(rèn)沒(méi)有執(zhí)行完成,求1個(gè)思路,感謝。
<?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)建一個(gè) Guzzle 客戶(hù)端實(shí)例
$client = new Client();
// 設(shè)置請(qǐng)求頭
$headers = [
'Content-Type' => 'application/json',
'Authorization' => 'Bearer 123456789...'
];
// 發(fā)起請(qǐng)求并傳遞請(qǐng)求頭
$promise = $client->getAsync('這里是一個(gè)流鏈接地址,會(huì)不停的推送如下圖所示的數(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);
// 在這里我想實(shí)現(xiàn),把line數(shù)據(jù)推送給前端連接對(duì)象,$line數(shù)據(jù)格式如下圖所示
// 但是前端連接不上,上面代碼[ while (!$body->eof()) { ]逐行讀取影響了,因?yàn)樵诓煌5耐扑蛿?shù)據(jù),沒(méi)有執(zhí)行完成
// 上面的while注釋掉,前端可以連接成功
}
}
// 關(guān)閉流
$body->close();
} else {
echo "請(qǐng)求失敗: " . $response->getStatusCode() . "\n";
}
};
// 當(dāng)客戶(hù)端建立連接時(shí),不匹配則主動(dòng)斷開(kāi)
$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)有客戶(hù)端發(fā)來(lái)消息時(shí),執(zhí)行的回調(diào)函數(shù)
$worker->onMessage = function (TcpConnection $connection, $data) {
if ($data == "pong") {
$connection->send('heartbeat');
}
};
// 向所有驗(yàn)證的用戶(hù)推送對(duì)應(yīng)的數(shù)據(jù)
function broadcast($msg, $symbol)
{
global $worker;
foreach ($worker->connections as $connection) {
$connection->send($msg);
}
}
// 運(yùn)行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>