hyperf 处理百万数据单元测试案例

Posted mr.杰瑞

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了hyperf 处理百万数据单元测试案例相关的知识,希望对你有一定的参考价值。

场景:有一批数据没有推到中间件,需要我这里搞一个脚本,大约有600万数据。我开始比较蠢的方法是将文件拆分,然后一条一条读。一条一条请求,速度很慢,如果因为某些因素中断程序,虽然有日志,但是还是要将已经跑过的数据去除,很麻烦
后来领导说放redis,然后用hyperf协程搞。
为啥这样搞,redis保证数据不丢。开协程增加并发
废话不多说,上代码

/**
     * composer test -- --filter=testCmshzSignHandle
     */
    public function testCmshzSignHandle()
    
        try 
            $logFiles = '/opt/www/test/Cases/text.txt';
            if (! file_exists($logFiles)) 
                throw new \\Exception('日志文件不存在');
            
            $file = fopen($logFiles, 'r');
            $redisKey = 'handle-redis';
            $i = 0;
            while (! feof($file)) 
                $i++;
                $lineData = fgets($file);
                if (intval($lineData)==0) 
        			continue;
    			
                $requestData[] = trim($lineData, '"');
                if (count($requestData) > 500) 
                    Redis::push($redisKey, ...$requestData);
                    $requestData = [];
                

            
            $result = Redis::llen($redisKey);
            $this->assertTrue($result);
         catch (\\Throwable $e) 
            var_dump($e->getMessage());
            $this->assertTrue(false, $e->getMessage());
        
    
/**
     * composer test -- --filter=testCsGo
     */
    public function testCsGo()
    
        $key = 'handle-redis';
        $request = new RequestServices();
        $parallel = new Coroutine\\Concurrent(10);
        while (true) 
            $result = Redis::pop($key, 10);
            if (empty($result)) 
                break;
            
            $parallel->create(function () use($result,$request, $key) 
                $params = [
                    'suborderid' => $result,
                ];
                //请求数据添加数据签名
                $params = CmsEncryptServices::getInstance()->dataSign($params);
                $res = $request->post($url, $params);
                Log::info($key, [$res]);
                usleep(100);
                if ($res['code'] != 0) 
                    Redis::push($key, $result);
                
            );
        

    

以上是关于hyperf 处理百万数据单元测试案例的主要内容,如果未能解决你的问题,请参考以下文章

hyperf 处理百万数据单元测试案例

hyperf composer执行单元测试超时处理

hyperf composer执行单元测试超时处理

hyperf composer执行单元测试超时处理

软件测试理论和APP测试案例

Yii2 EasySwoole Hyperf 并发对比