2013-01-08 4 views
1

우리는 완벽하게 작동하는 PHP emailer를 만들고 있습니다.MYSQL SELECT with PAUSE

데이터베이스에서 모든 사용자를 선택하고 이메일을 보내면 좋습니다.

하지만 보내야 할 엄청난 양의 이메일이 있었기 때문에 [1000]이 (가)있는 이메일 트랜잭션을 시작하고 일시 중지하여 서버에 과부하가 걸리지 않도록하십시오.

예 :

SELECT : 1000;

PAUSE MYSQL

SELECT ANOTHER 1000;

PAUSE MYSQL

기타. ..

나는 & 롤백 기능을 COMMIT 시작 TRANSACTION에 대해 읽고, 나는이 권리를 구현 생각

사람이 ROLLBACK 전에 거래를 백초의 일시 중지를 포함하는 데 도움이 수 있습니까? 내가 지금까지 [접두사 코드]를 가지고 내가 무엇을 해야할지 모르겠어요

..

..

$ max = 1000;

$ send = 0;

$ rollback = false;

mysql_query ('START TRANSACTION;');

$ query = mysql_query ("SELECT DISTINCT mail_id, customers_email_address 뉴스 레터 WHERE ORDER BY mail_id ASC");

동안 ($ 결과 =로 MYSQL_ASSOC ($ 쿼리) {

경우 ($ 롤백 == TRUE) {= 거짓

$ 롤백,

는 mysql_query (" ROLLBACK; ");

}

$ 보내 ++ [이 ------ 스크립트는 이메일 -----를 보내]

경우 ($ 최대 == $ 보내기) {

는 mysql_query ("COMMIT;");

$ rollback = true;

}

}

건배 제이

+0

당신은 트랜잭션을 사용하는 것이 이해가되지 않도록 데이터베이스의 정보를 수정하지 않습니다. 어떤 이메일을 누가 데이터베이스에 보냈는지 추적 할 계획입니까? – jeroen

+1

제로 엔이 말한 바. 또한 새로운 코드에서 mysql_ 함수 사용을 중단하십시오! – Kermit

+2

PHP의 mysql_xxx() 함수는 더 이상 쓸데없고 안전하지 않으며 더 이상 사용되지 않습니다. 가능한 한 빨리'mysqli_xx()'함수 나 PDO 라이브러리로 전환해야한다. 또한 참조하십시오. http://stackoverflow.com/questions/12859942/why-shouldnt-i-use-mysql-functions-in-php – SDC

답변

1

당신이 필요로하는 모든 예를 들어 크론 및 이메일의 일부 금액을 전송로 보낸 스크립트를 예약하는 것입니다. (SQL에서 LIMIT 사용).

는 모든 M 분 및 서버가 행복 할 것이다 N 이메일보다 보내드립니다)

3

에서 모두 여기 거래에 대한 필요가 없습니다 - 당신은 아무것도 업데이트되지 것입니다. 사실 트랜잭션의 오버 헤드는 여기에 전혀 무의미합니다. 따라서이 문제를 해결할 것을 권합니다.

당신은 단순히

  • 데이터베이스에서 처음 1000 개 행을 선택합니다 (이론적으로,이에 대한 코드를 작성할 수 있습니다) 수 : 귀하의 1000 오프셋
  • 다음 1000을 선택 SELECT ... LIMIT 0, 1000
  • 증가 행 : SELECT ... LIMIT 1000, 1000
  • 쿼리에서 1000 개 미만의 행이 반환 될 때까지 헹구고 반복합니다.

해당 방법이 작동하려면 기본 키를 ASC 순서로 ORDER BY하여 동일한 행을 두 번 가져 오지 않아야합니다. 다음과 같은

+0

Thnx, 이것은 나를 도왔습니다! –

+0

지연이 필요한 경우 PHP 섹션에'sleep()'을 넣으십시오. –

+0

네, 알아요,하지만 mysql에서 sleep/delay 함수가 없습니까? –

0

거의 optios는 :

1) 당신은 cron 작업을 구현할 수 있습니다.

2) 몇 초 안에 통합 할 수있는 PHPList이라는 PHP의 오픈 소스 소규모 응용 프로그램이 있습니다. (나는 이미 이것을 사용하고 있습니다.)

3) 세 번째 옵션은 PHP의 sleep function입니다. (나는 이것에 대해 확실하지 않습니다)