国产+高潮+在线,国产 av 仑乱内谢,www国产亚洲精品久久,51国产偷自视频区视频,成人午夜精品网站在线观看

通過AsyncTcpConnection循環(huán)訪問https接口的json數(shù)據(jù)問題

pchacker
use \GatewayWorker\Lib\Gateway;
use \Workerman\Connection\AsyncTcpConnection;
use \Workerman\Events\EventInterface;
use \Workerman\Worker;
use \Workerman\Autoloader;
use \Workerman\WebServer;
use \GatewayWorker\BusinessWorker;
use \Workerman\Lib\Timer;
use Lib\JsonFormat;
use Lib\JsonToSql;

include_once __DIR__.'/../'.'Include/function.php';
include_once __DIR__.'/../'.'Include/config.db.php';
require_once __DIR__.'/../../'.'vendor/workerman/mysql-master/src/Connection.php';

// bussinessWorker 進程
$worker = new BusinessWorker();
// worker名稱
$worker->name = 'M-BtcTrade-COM';
// bussinessWorker進程數(shù)量
$worker->count = 1;
// 服務注冊地址
$worker->registerAddress = '127.0.0.1:1238';

// 心跳間隔25秒
define('HEARTBEAT_TIME', 25);

$worker->onWorkerStart = function()
{

    // 設置訪問對方主機的本地ip及端口以及ssl證書
    $context_option = array(
            // ssl選項,參考http://php.net/manual/zh/context.ssl.php
            'ssl' => array(
                    // 本地證書路徑。 必須是 PEM 格式,并且包含本地的證書及私鑰。
                    //'local_cert'        => '/your/path/to/pemfile',
                    // local_cert 文件的密碼。
                    //'passphrase'        => 'your_pem_passphrase',
                    // 是否允許自簽名證書。
                    'allow_self_signed' => true,
                    // 是否需要驗證 SSL 證書。
                    'verify_peer'       => false,
                    'verify_peer_name'  => false
            )
    );
    // 每1秒執(zhí)行一次
    $time_interval = 1;
    $connect_time = time();
    // 給connection對象臨時添加一個timer_id屬性保存定時器id
    Timer::add($time_interval, function()
    {
        $coin_list = array("btc","eth","ltc","doge","ybc");
        //print_r($coin_list);
        foreach ($coin_list as $key=>$val){
            $con = new AsyncTcpConnection("ssl://api.btctrade.com:443", $context_option);
            $con->cointype = $val;
            $con->send("GET /api/trades?coin=".$val." HTTP/1.1\r\nHost: api.btctrade.com\r\n\r\n");
            $con->onMessage = function($con, $data)
            {
                $data_arr = explode("\r\n\r\n", $data, 2);
                $data_arr1 = explode("\r\n", $data_arr);
                $json_data = "btctrade_trade_".$con->cointype."cny";
                $json_data = json_decode($data_arr1,true);
                //print_r($json_data);
                //echo $con->uri."\n";
                //輸出數(shù)據(jù)進行處理
                ..................................................
                ................................................
            };
            $con->connect();

            $con->onClose = function($con)
            {
                //echo "connection closed\n";
            };

            //print_r($val);
            // 設置以ssl加密方式訪問,使之成為wss
        }
    });

};

// 如果不是在根目錄啟動,則運行runAll方法
if(!defined('GLOBAL_START')) {
    Worker::runAll();
}

以上代碼是每秒鐘循環(huán)中抓取一下5個URL返回的JSON數(shù)據(jù)

現(xiàn)在的問題是在$con->onMessage還未完全處理完數(shù)據(jù)之前,$con 對象就被下次循環(huán)重建了,從而造成數(shù)據(jù)丟失,請問如何修改代碼才能避免這個問題的出現(xiàn)呢?

3228 6 0
6個回答

walkor 打賞

這是5個不同的鏈接,互相不影響,不會有覆蓋。

你的問題應該是tcp數(shù)據(jù)被分包了,數(shù)據(jù)沒接收完整,onMessage里的數(shù)據(jù)是服務器響應的部分數(shù)據(jù)。你要根據(jù)http協(xié)議規(guī)則,讀取http包頭中包的長度,然后根據(jù)長度緩沖每次onMessage里的數(shù)據(jù),把每次onMessage里的的data數(shù)據(jù)拼接成一個完整的http數(shù)據(jù)才行

  • 暫無評論
pchacker

通過測試,$con->onMessage中輸出的print_r($data),都是完整的json格式數(shù)據(jù),$data的輸出內(nèi)容在附件中。
除了分包問題,還有沒有其他可能性造成這種情況的出現(xiàn)?

  • 暫無評論
walkor 打賞

服務端返回的數(shù)據(jù)小是完整的,返回的數(shù)據(jù)大肯定要被分包的。

另外數(shù)據(jù)不會丟的,自己再找找原因吧

  • 暫無評論
pchacker

ssl協(xié)議的$con->onMessage確實存在分包問題

請問AsyncTcpConnection的wss協(xié)議是否也存在分包問題呢?

  • 暫無評論
walkor 打賞

大包都會分包,正常的,這是tcp的機制

  • 暫無評論
workerofmine

用PHP寫個接口,可以訪問workerman嗎?

  • 暫無評論
年代過于久遠,無法發(fā)表回答
??