2013-02-28 3 views
1

나는 경매가 여러 번 끝나는 사이트를 가지고있다. 경매가 끝난 후 판매자와 구매자에게 자동 이메일을 보내서 경매 결말 및 결과를 알릴 필요가 있습니다. 분명히 누군가가 스크립트를 실행하기 위해 페이지를로드 할 때까지 기다릴 수는 없으므로 현재 시간을 확인하고 경매 종료 시간과 스크립트를 비교하여이를 자동화하는 좋은 방법이 있습니까?특정 시간에 PHP 스크립트를 실행하는 가장 좋은 방법은 무엇입니까?

사이트가 UNIX 서버에 있으므로 cron 작업이 옵션이지만 cron 작업을 실행하면 서버에 상당한 부하가 걸릴 수 있습니다.

+0

실행중인 서버 인프라의 종류를 묻습니다. 난 당신이 PHP 이외의 타이머 메커니즘을 사용하는 것으로 추정? 다른 것을 사용하는 경우 타이머가 만료 될 때 메일 보내기 스크립트를 실행하는 타이머 메커니즘에 몇 가지 코드를 첨부하는 것이 좋습니다. – L0j1k

+0

나는 자바 스크립트가 페이지에서 실행되는 것을 제외하고 사용할 수있는 타이머를 전혀 모르고있다. 나는 실제로 누군가가 그것을 조작하고 경매에 속이는 것을 두려워했기 때문에 javascript를 사용하고 싶지 않았습니다. – Budove

+1

누가 그 경매에서 누가이기는 지 결정하기 위해 당신은 무엇을 사용하고 있습니까? 승자는 누구에게 (정밀도로) 결정할 수 있습니까? 백엔드 (예 : Node.js 또는 Perl 또는 Python의 JavaScript 또는 PHP 이외의 다른 것)에서 강력한 타이머 메커니즘을 사용하는 데 매우주의해야합니다. 사용자가 페이지를 방문 할 때 타이머가 작동하고 트리거되고 파일/데이터베이스를 확인하는 방법에 대한 아이디어를 얻으려고합니다. 이제는 어렵고 어쩌면 불필요한 것처럼 들릴 수도 있지만, 응용 프로그램이 성장함에 따라 이러한 모든 메커니즘을 실행하는 백그라운드에서 핵심 타이머를 만들었 기 때문에 매우 기쁩니다. – L0j1k

답변

2

크론 작업은 분당 최대 한 번 실행됩니다.

서버에서 생성되는 부하는 실제로 실행하려는 스크립트의 종류에 따라 다릅니다. .

    : BTW, 난 당신이 스크립트를 실행 cli를 사용하여 (이 아니라 단지 curl http://mysite.com을 다하고 있으리라 믿고있어

    을 스크립트가 일분보다 더 오래 걸리는 경우 (당신은 단순히 하나)이 모니터링해야

  • 이 스크립트의 두 개의 인스턴스를 동시에 실행할 수 있는지 확인하기 위해 lock file를 사용, 실행 또는 사이의 시간 간격을 늘립니다.

    if (($fp = fopen('/tmp/mylockfile', "r+")) === false) { 
        die("Could not open lock file"); 
    } 
    if (!flock($fp, LOCK_EX | LOCK_NB)) { 
        die("Could not obtain lock"); 
    } 
    // run your code here 
    
    // release the lock and close file 
    fclose($fp); 
    

OTOH 스크립트를 분당 한 번 이상 실행해야하는 경우 완전히 다른 메커니즘이 필요합니다.

+1

'벤치마킹해야합니다', nop! 59 초 후에 스크립트가 멈추는 지 확인해야합니다! – hek2mgl

+0

@ hek2mgl Wat? 그게 얼마나 비현실적인지 알지? 물론 농담하지 않았다면. –

+0

아니요! 나는 그것을했다. .. 대기 행렬을 가지고있다. .. 대기 행렬의 끝나거나 50 초 후에 멈춘다. 50 초가 지나면 -> email to admin. 경보! . 그게 좋은 일이야 – hek2mgl

1

크론을 사용하십시오. http://clickmojo.com/code/cron-tutorial.html

서버로드가가는 한, 매우 낮은 수준의 데이터베이스 호출에서 매우 많은 수의 데이터베이스 호출을 자주 실행하지 않는 한 일반적으로 문제가되지 않습니다. 엔드 서버. 나는 일반적으로 말하지만 그 생각은 건전합니다.

경매 타이머 메커니즘을 실행하는 데 PHP 이외의 다른 것을 사용하는 경우 타이머가 0으로 떨어지고 승자를 결정할 때 메일 보내기 스크립트를 실행하는 타이머 메커니즘에 코드를 첨부하는 것이 좋습니다. .

+0

나는 downvote 왜 @ L0j1k 함께있어? – hek2mgl

+1

OP는 말했다 : * 크론 작업은 옵션이지만, 나는 그 같은 크론 작업을 실행하면 서버에 상당한 부하가 걸릴 것이라고 우려하고있다 *. 당신이 궁금해하는 경우에, 그것은 내 downvote되지 않았습니다. –

+0

그것은 내 투표가 아니었지만 아마도 "언제든지 당신이 원한다"고 말할 것입니다. 그것은 1 분 간격으로 사실이 아닙니다. 경매와 함께 이것은 편리하지 않습니다. – stUrb

0

PHP 스크립트를 명령 줄 스크립트로 실행하십시오. 이렇게하면 웹 서버에 부하가 걸리지 않으며 서버의 부하만으로 CRON을 통해 쉽게 실행할 수 있습니다.

스크립트의 상단에 #!/usr/bin/php를 추가하고 PHP를 통해

http://php.net/manual/en/features.commandline.php

+0

글쎄,'#!/usr/bin/php'는 실제로 PHP를 통해 이것을 전달하지만 인터프리터에 직접 전달합니다. – L0j1k

+0

죄송합니다.'php scriptname.php'와'scriptname.php'를 통해 실행하는 것을 언급하고있었습니다. –

1

Q 그것을 통과하지 않고 직접 스크립트를 실행할 수 chmod +x scriptname.php 사용하여 파일에 실행 비트 변경하는 경우 : 무엇 최고 특정 시간이나 간격에서 PHP 스크립트를 실행하는 방법은 무엇입니까?
A : 사용 cron

Q : cronjob이 서버에 큰 부하를 생성합니까?
A : 스크립트에 따라 다릅니다. 그러나 경매가 종료되어야하는지 확인하고, 그것을 닫고 2 개의 전자 메일을 보내는 것이 어렵지 않아야합니다. 스크립트가 간격 설정보다 오래 실행되면 두 번 실행되지 않도록 lockfile을 만들어야합니다.

Q : 1 분보다 짧은 간격으로 스크립트를 실행하십시오.
A :이 질문에 답할 수 없습니다. 죄송합니다 :)

0

이해야 할 몇 가지 : 당신은 아직 여부를이 전자 메일을 보낸 여부를 나타내는 경매 정보에

  1. 스토어 뭔가 (수 부울 또는 전송 된 날짜는 null 일 수 있습니다. 이 전자 메일을 보내는 것 외에 뭔가를해야한다고 생각해야합니까? 경매가 종료 된 것처럼 표시하면 더 이상 입찰을 할 수 없습니까?

  2. 이 전자 메일이 필요한 경매를 찾는 코드 비트 : 예 : 그들은 끝났고 아직 상기되지 않았습니다.

  3. 몇 가지 코드가 반복적으로 실행됩니다. cron을 사용할 수 있습니다. 또는 반복적으로 실행되는 유닉스 용 데몬을 작성할 수 있습니다 (적어도 몇 밀리 초 이상 기다리십시오). 후자는 더 많은 일이지만 내 의견으로는 훨씬 더 잘 맞습니다. 이 접근법에 관심이 있다면 유용한 도구는 http://pear.php.net/package/System_Daemon을 참조하십시오.

우연히이 전자 메일을 두 번 보내는 것에 대해 조심하고 싶은 점이 하나 있습니다. 이 코드를 하나의 스레드로만 실행한다면 꽤 쉽습니다. 그러나이 전자 메일을 작성하고 보내는 여러 가지 분산 된 컴퓨터가있는 지점까지 빌드하려면 조심해야합니다. cron에서 실행하면 다른 하나가 시작되기 전에 하나의 실행을 항상 보장 할 수 있습니까?

관련 문제