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){
을 사용하여 처리할 데이터의 일부를 한 번에 꺼낸 다음 일괄 처리가 완료된 후 루프에서 벗어날 수 있습니다
}