제목 | php 기초 실행순서 함수실행순서 curl 멀티 | ||
---|---|---|---|
카테고리 | PHP | ||
글쓴이 | 강남원 | 작성시각 | 2017/10/19 14:30:51 |
|
|||
안녕하세요
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
|
한대승(불의회상)
/
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에인서트 업데이트가 끝나지않았는데 다음으로 넘어갔네요 자가해결했습니다. |
insert 하고 나서 $this->db->insert_id() 함수를 통해 생성된 id 값을 가져올 수 있습니다.
이 값 유무에 따라 다음 액션을 처리합니다. (실패시 에러 노출 등등)
do { curl_multi_exec($mh, $running); } while ( $running ); <- 이 구문 자체가 끝나면 끝인데 어떤게 더 필요하신건지..
올리신 소스상으로는 문제가 없습니다. 질문과 소스가 다른걸로 봐서 일부를 빼고 올리신거 같은데 질문을 다시 정리하시거나 전체 구조를 올리셔야 답변할 수 있습니다.