문제

나는 PHP에서 예약된 작업을 실행하기 위한 다양한 접근 방식 목록을 만들려고 노력하고 있습니다.내 의도는 PHP에서 예약된 작업을 실행하는 보편적인 방법을 제공하는 것입니다.지금까지 나는 다음을 가지고 있습니다 :

1) 사이트 트래픽을 분석합니다.하루에 770개의 히트(2분당 1개의 히트)를 수신하고 오전 6시에 작업이 실행되도록 예약했고 방문자가 오전 5시 59분에 페이지를 요청한 경우 다음 방문자가 페이지를 요청하기 때문에 작업을 실행합니다. 평균 오전 6시 1분에 도착합니다.이 경우에는 = exec('/usr/bin/php -f /home/account/cron.php') 를 실행하세요.

(+) 경로가 올바른 한 모든 플랫폼에서 작동합니다.

(-) 약간의 CPU 성능이 필요합니다.

(-) exec()가 필요합니다.

(-) 소규모 사이트나 트래픽 급증이 발생하는 사이트에서는 정확하지 않습니다.

2) 위의 개선된 버전입니다.사용자가 페이지를 요청하고 작업을 실행하려고 하면 exec()를 사용하지 말고 내용을 사용자에게 플러시한 후 include()를 사용하세요.

(+) 모든 플랫폼에서 작동합니다.

(+) exec()가 없습니다.

(-) 약간의 CPU 성능이 필요합니다.

(-) 소규모 사이트나 트래픽 급증이 발생하는 사이트에서는 정확하지 않습니다.

3) 일정한 루프에서 실행되도록 별도의 프로세스 백그라운드를 실행합니다."서비스"를 "시작"하고 "종료"할 수 있는 관리 인터페이스를 제공하세요.그런 다음 fsockopen()을 사용하여 무한히 실행되는 .php 스크립트를 호출합니다.리소스를 소비하지 않고 적절한 시간에 깨어나기 위해 sleep()을 사용합니다(참조:time_sleep_until()).파일을 검색하고 읽어서 언제 어떤 작업을 실행할지 이해할 수 있습니다.스케줄러가 그 내부의 코드를 실행하도록 만드는 "run-everyday-3.00am" 파일을 생성할 수 있습니다.

(+) 모든 플랫폼에서 작동합니다.

(+) exec()가 없습니다.

(+) 매우 정확할 수 있습니다(예:분당 수면을 취하는 경우).

(-) 안정적이지 않습니다. 서버 충돌로 인해 스케줄러가 완전히 중지됩니다.

(-) 일부 호스트는 연중무휴 24시간 실행되는 프로세스를 좋아하지 않습니다 = 리소스를 많이 사용합니까?

4) Linux 등에서 직접 exec('crontab')을 실행하세요.

(+) 자원을 많이 잡아먹는 것이 아닙니다.

(+) 정확합니다.

(-) 실행().

(-) 모든 플랫폼에서 작동하지 않습니다.

5) cPanel 자격 증명을 요청하고 이에 대한 POST를 수행하여 크론을 생성/관리/제거합니다.

(+) 정확하다

(+) 자원을 많이 잡아먹는 것이 아닙니다.

(-) 보안에 좋지 않음

(-) 사용자 세부 정보 필요 = 사용성 감소

(-) 모든 플랫폼에서 작동하지 않습니다(Windows에서는 작동하지 않는 cPanel이 필요함).

(-) cPanel이 필요합니다.

다른 아이디어가 있나요?

도움이 되었습니까?

해결책

당신이 제안한 거의 모든 방법은 대부분 작동하지만 추악합니다.

내 추악한 대안은 인터넷 연결이있는 로컬 컴퓨터에 CRON을 설정하는 것입니다.

모든 솔루션만큼이나 추악하지만 약간 더 신뢰할 수 있습니다.

다른 팁

원격 서버에서 http-password 보호 스크립트를 핑하여 visurecron이라는 Windows 도구를 사용하여 특정 작업을 실행합니다. VC에는 훌륭한 이메일 상태 알림이 내장되어 있습니다.

이것은 Local Cron+Curl 또는 Cron+Wget 사용에 대한 Zack의 게시물과 매우 유사합니다.

http://www.visualcron.com http://www.visualcron.com/img/screenshots/v5/mainwindow/mainwindow_bluetheme.png

당신은 사용한 적이 있습니다 Windows 작업 스케줄러 아니면 그 명령? Unix에서 Cron의 대체로 사용할 수 있습니다. (1) 필요한 모든 집안일을 수행하는 PHP 스크립트를 작성할 수 있습니다.

원격 시스템에서 HTTP에서 열어 스크립트를 실행할 수도 있습니다. 원격 기계는 Unix 또는 Windows 상자 일 수 있습니다. wget 웹 브라우저 대신 사용할 수 있으며 두 플랫폼 모두에서 사용할 수 있습니다.

이러한 유형의 예정된 작업을 실행하기 위해 두 번째 서버 / 가상 머신을 선택합니다. 두 번째 서버는 오프 사이트 일 수 있으며 기본 서버가 응답하지 않을 때 알려주는 것과 같은 다른 기능을 수행 할 수 있습니다.

그건 그렇고, "정확한"에 대한 당신의 정의는 무엇입니까?

IMHO, 이 방법 위에 레이어를 작성해야 합니다...

User code <=> [User interface]<-> Your library <->[Technology interface] <=> Technology execution module (method)

그러면 모든 메소드를 구현할 필요는 없지만 귀하 또는 귀하의 고객이 새로운 메소드가 필요한 경우...그가 해야 할 일은 기술 인터페이스를 구현하는 것뿐입니다.

BTW, "기술 실행 방법"은 더 나은 성능/호스트 시스템 통합을 위해 PHP 모듈로 작성될 수 있습니다.

내가 당신이라면 기존 라이브러리/모듈을 찾을 것이며 기본 시스템이 예약된 작업을 처리할 수 없는 경우가 아니면 백그라운드 프로세스를 만들지 않을 것입니다(Unix와 Windows는 이를 처리합니다).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top