개발 Q&A

제목 php 기초 실행순서 함수실행순서 curl 멀티
카테고리 PHP
글쓴이 강남원 작성시각 2017/10/19 14:30:51
댓글 : 7 추천 : 0 스크랩 : 0 조회수 : 12817   RSS

안녕하세요

 

php 의 함수 실행에 대해 질문드립니다.

 

foo($name);

함수설명: 학생 테이블에 학생정보를 받아 insert 하는 함수입니다.return 값은 없습니다.

select();

함수설명: 학생 테이블 의 모든 데이터를 가져오는 함수입니다.

return 은 학생 레코드 배열입니다.

 

foo("김씨");

select();

를 연달아 실행합니다.

 

의견1.

php 가 담당하는 영역은 foo 함수의 정상실행 까지이며 db 에 "김씨"가 정확히 입력되었다 까지가 아니다.

즉 select 를 실행시 "김씨" 가 데이터 안에 없는 상황이 발생할수 있다.

 

의견2.

foo 함수안의 $db->query 함수 자체에 리턴값이 있기때문에 결과/성공을 파악하고 넘어가기때문에

반드시 select 에서 "김씨"를 찾아볼수있을것이다.

 

의견3

foo 함수안의 db->query 자체에 리턴값이 돌아와있으나 코딩한 사람이 그 return 값을 확인하는 과정을 

코딩하지않았기때문에 의견1과 같은 일이 발생할수있다.

 

 

curl_multi_init 을 이용하여 yahoo shopping(일본입니다.) api 를 사용하여 주문 정보를 가져오는데

curl은 이미 완료가 되었고 오류가 없다고 나온 상황에서 그다음 api 를 통해 내려받은 주문을 db에서 

가져오면 주문이 많을경우 반정도밖에 안나옵니다. 무슨상황인지 몰라서 삽질하다가 curl처리 완료후 sleep 을 넣고

2초간 쉰다음 db 에서 값을 가져오면 모든 주문이 나오는군요 ;; 

curl_multi_exec 의 처리가 완전히 끝난 시점을 아는 방법이 없을까요 ?

 

인수 : $urls <-url들이 들어있음

 

$mh = curl_multi_init();

$ch_list = array();

foreach( $urls as $url )       

{           

    $ch_list[$url] = curl_init($url);           

    curl_setopt($ch_list[$url], CURLOPT_RETURNTRANSFER, TRUE);             

    curl_setopt($ch_list[$url], CURLOPT_TIMEOUT, 3);  

    curl_multi_add_handle($mh, $ch_list[$url]);       

}

 

$running = null;       

do { curl_multi_exec($mh, $running); } while ( $running );

$result="";

//각 multi 용 php 는 처리 제일끝에 echo $에러메시지 (에러가없을경우"")가 있습니다. 

foreach( $urls as $url )       

{                    

    $result.= curl_multi_getcontent($ch_list[$url]);

    curl_multi_remove_handle($mh, $ch_list[$url]);           

    curl_close($ch_list[$url]);       

}     

curl_multi_close($mh);  

 

if($result!="")       

{           

    $this->create_error_log("yahoo","yahoo注文api関連",$result,"DB確認要望","新規注文画面" );

    return false;

}

else

{

    return true; 

}

 

 

 

 

 

 

 

 다음글 mysql 날짜로 검색 질문드립니다. (2)
 이전글 DB 쿼리 로그 관리에 대한 질문입니다. (4)

댓글

변종원(웅파) / 2017/10/19 14:49:43 / 추천 0

insert 하고 나서 $this->db->insert_id() 함수를 통해 생성된 id 값을 가져올 수 있습니다.

이 값 유무에 따라 다음 액션을 처리합니다. (실패시 에러 노출 등등)

 

do { curl_multi_exec($mh, $running); } while ( $running ); <- 이 구문 자체가 끝나면 끝인데 어떤게 더 필요하신건지..

올리신 소스상으로는 문제가 없습니다. 질문과 소스가 다른걸로 봐서 일부를 빼고 올리신거 같은데 질문을 다시 정리하시거나 전체 구조를 올리셔야 답변할 수 있습니다.

한대승(불의회상) / 2017/10/19 14:52:15 / 추천 0
multi_exec 는 비동기로 처리되기 때문에 이에 대한 처리가 필요합니다.
강남원 / 2017/10/19 14:52:34 / 추천 0
질문 한 소스 제일아래에 있는 return true 로 나가면 그다음 실행되는 함수가 멀티로 가져온 주문정보를 db에서 가져오는 부분입니다. 그다음 함수를 실행시키면 주문건수가 작을때10~20일땐 정삭적으로 모든주문이 출력되나 50건이넘어가면 중간에 잘립니다. 혹시나해서 return true 나간후 바로 sleep로 2초를 재우고 불러오면 정상적으로 출력됩니다.
강남원 / 2017/10/19 14:54:41 / 추천 0

즉 multi 가 완료 를 뱉었으나 db에대한 insert는 계속 되는 중이고 그도중에 select 를 해왔다라고 해석할수있는데요 ..

그럼 결국 multi가 처리가 다끝나지도않았는데 retrun true를 뱉은 상황이 됩니다. ㅜㅜ 

변종원(웅파) / 2017/10/19 15:42:32 / 추천 0

불의회상님 답변처럼 multi_exec이 비동기라면 한건씩 순차처리하는 방법으로 해야겠네요.

처리가 다 끝나고 db insert.

 

강남원 / 2017/10/19 16:34:32 / 추천 0

한대승님,변종원님 답변감사합니다.

저는curl_multi_getcontent가 각 프로세스들이 처리를 끝냇는지 확인후 끝났으면 그 내용을 출력해주는 함수인지 알았는데 처리가 끝나지 않아도 무슨내용이 나와잇나보고 건내주는가 보네요

curl_multi_close($mh);  

후에 while 문을 만들어서 DB에 이번에 입력될 총 건수를 계속 비교하여 일치하면 while false 시키는 식으로 처리를 해야겠네요

감사합니다.

 

 

 

강남원 / 2017/11/17 17:32:30 / 추천 0

//후일자가해결

curl_setopt($ch_list[$url], CURLOPT_TIMEOUT, 3);

위옵션이 각 세션들이 무거운 작업을해서 3초이내에 결과를 돌려주지않을경우 3초후에연결을끊고 다음 작업을 진행해서

DB에인서트 업데이트가 끝나지않았는데 다음으로 넘어갔네요 자가해결했습니다.