동시성 영웅들에게 해결책을 주세요...

WBOY
풀어 주다: 2016-08-18 09:15:53
원래의
916명이 탐색했습니다.

while 루프 코드를 사용하는 코드가 있기 때문에 데이터 양이 많으면 실패합니다....

while($rows = $query->fetch_array()){

<code>if($rows['mingxi_1']=='1'){
    $ds = Ssc_Ds($rs['ball_1']);
    $dx = Ssc_Dx($rs['ball_1']);
    if($rows['mingxi_2']==$rs['ball_1'] || $rows['mingxi_2']==$ds || $rows['mingxi_2']==$dx){
     
        $msql="update c_bet set js=1 where id='".$rows['id']."'";
        $mysqli->query($msql) or die ("修改订单状态失败!!!".$rows['id']);
        //给会员账户增加奖金
        $msql="update k_user set money=money+".$rows['win']." where uid=".$rows['uid']."";
        $mysqli->query($msql) or die ("修改失败!!!".$rows['id']);
    }else{
        //注单未中奖,修改注单内容
        $msql="update c_bet set win=0,js=1 where id=".$rows['id']."";
        $mysqli->query($msql) or die ("修改失败!!!".$rows['id']);
    }
}</code>
로그인 후 복사
로그인 후 복사

답글 내용:

while 루프 코드를 사용하는 코드가 있기 때문에 데이터 양이 많으면 실패합니다....

while($rows = $query->fetch_array()){

<code>if($rows['mingxi_1']=='1'){
    $ds = Ssc_Ds($rs['ball_1']);
    $dx = Ssc_Dx($rs['ball_1']);
    if($rows['mingxi_2']==$rs['ball_1'] || $rows['mingxi_2']==$ds || $rows['mingxi_2']==$dx){
     
        $msql="update c_bet set js=1 where id='".$rows['id']."'";
        $mysqli->query($msql) or die ("修改订单状态失败!!!".$rows['id']);
        //给会员账户增加奖金
        $msql="update k_user set money=money+".$rows['win']." where uid=".$rows['uid']."";
        $mysqli->query($msql) or die ("修改失败!!!".$rows['id']);
    }else{
        //注单未中奖,修改注单内容
        $msql="update c_bet set win=0,js=1 where id=".$rows['id']."";
        $mysqli->query($msql) or die ("修改失败!!!".$rows['id']);
    }
}</code>
로그인 후 복사
로그인 후 복사

1. 전체 버전의 코드를 업로드할 수 있나요? SQL을 꺼내는 것을 꺼리시나요?
2. 육안으로 검사하면 SQL 결과 세트가 너무 많아 메모리가 오버플로되고 작업에 시간이 많이 걸릴 수 있습니다
3. 해결 방법: Redis 대기열 또는 MySQL 대기열을 사용하여 문제를 해결하세요

프로그램에서 루프 연산을 이렇게 작성하면 안 됩니다. . . 새 SQL 테이블을 대기열로 생성하거나 Redis를 대기열로 직접 사용할 수 있습니다. . 그런 다음 이 작업을 구체적으로 처리하기 위해 새 서비스나 스크립트를 엽니다

처리 속도가 너무 느려 서버가 새로운 요청에 응답하지 못해 장애가 발생한 것으로 추정됩니다. 코드로 판단하면 처리 모델에 문제가 있습니다. 주문을 하나씩 처리하는 데 루프를 사용하지 않는 것이 가장 좋습니다. 예를 들어 문제를 해결하려면 저장 프로시저를 사용하는 것이 더 빠릅니다.

$rs는 큰 배열이어야 하며 루프에서 mysql 쿼리를 사용하고 있으므로 매우 비효율적입니다.
비동기 처리를 위해서는 CLI 모드 PHP 실행을 권장합니다

매우 단순하고 폭력적인 다중 프로세스 아이디어를 제공하기 위해 대기열을 사용하고 싶지 않습니다

가장 큰 쿼리 결과 집합은 ID의 모듈로를 기준으로 여러 프로세스로 분할됩니다. 아이디어는 다음 의사 코드와 유사합니다

<code>        for ($i=1;$i<=100;$i++){

            if($i%5==0){
                echo 'mod 1 : '.$i.'<br>';
            }
            if($i%5==1){
                echo 'mod 2 : '.$i.'<br>';
            }
            if($i%5==2){
                echo 'mod 3 : '.$i.'<br>';
            }
            if($i%5==3){
                echo 'mod 4 : '.$i.'<br>';
            }
            if($i%5==4){
                echo 'mod 5 : '.$i.'<br>';
            }

        }</code>
로그인 후 복사

데이터 양에 따라 모든 ID를 다중화하고 분할합니다. 모두 꺼내서 분할할지, 아니면 SQL 문을 쿼리할 때 직접 5개의 PHP 프로세스를 열고 분할할지 여부는 분석된 비즈니스 로직에 따라 다릅니다.

5개의 프로세스로 분할된 SQL 문은 다음과 유사합니다.

<code>SELECT * FROM member where member_id%5=0;
SELECT * FROM member where member_id%5=1;
SELECT * FROM member where member_id%5=2;
SELECT * FROM member where member_id%5=3;
SELECT * FROM member where member_id%5=4;</code>
로그인 후 복사

while(1){
을 사용하여 처리할 데이터의 일부를 한 번에 꺼낸 다음 일괄 처리가 완료된 후 루프에서 벗어날 수 있습니다
}

관련 라벨:
원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!