2009-11-28 4 views
3

PHP에서 예약 된 작업을 실행하는 다른 방법 목록을 제시하려고합니다. 제 의도는 PHP에서 예약 된 작업을 실행하는 보편적 인 방법을 제공하는 것입니다. 지금까지 내가 가지고 :PHP 및 예약 된 작업

1) 분석 사이트 트래픽. 하루에 770 회의 조회수 (2 분에 1 회의 조회수)가 발생하고 오전 6시에 작업이 실행되도록 예약하고 오전 5시 59 분에 방문자가 페이지를 요청한 경우 다음 방문객이 평균 6:01 AM에 도착합니다. 이 경우에는 = 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/7/365 = resource hog 프로세스를 실행하고 싶지 않습니까?

4) Linux에서 exec ('crontab')를 직접 실행하십시오.

(+) 리소스 호그가 아닙니다.

(+) 정확합니다.

(-) exec().

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

5) cPanel 자격 증명을 요청하고 cron을 생성/관리/제거하기 위해 POST를 수행하십시오.

(+)의 그것은 자원 돼지 아닌

(+) 정확합니다.

보안에 대한 나쁜 (-)의 (-)

(-) 모든 플랫폼에서 작동하지 않습니다 (Windows에서 작동하지 않는의 cPanel 필요) 사용자 세부 사항을 필요는 =

유용성

감소했다.

(-) cPanel이 필요합니다.

다른 아이디어?

+3

사용에 대한 잭의 게시물과 매우 유사하다

주, 대부분의 호스트는 crontab을 액세스의 형태를 제공하지 않는 PHP 스크립트의 max_execution_time 제한을 수정했습니다. 마찬가지로, 실행 시간 제한이 고정되어 있지 않은 대부분은 최소한 기본 crontab 액세스를 제공하는 경향이 있습니다. – Amber

+1

다른 호스트로 이동 하시겠습니까? –

+1

"/ usr/bin/php"가 모든 플랫폼에서 작동하지 않을까 걱정됩니다 - 어떤 Windows 속도가 아니든간에 cron을 명시 적으로 처리하는 것도 아닙니다. – Ian

답변

4

당신이 제안한 거의 모든 방법이 가장 좋지만 추악합니다.

필자가보기 싫은 대안은 몇 분 동안 curl 명령을 실행하는 인터넷 연결이 가능한 로컬 컴퓨터에 cron을 설정하는 것입니다.

이것은 모든 솔루션만큼 엉망이지만 다소 안정적입니다.

0

두 번째 서버/가상 컴퓨터에서 이러한 유형의 예약 된 작업을 실행하도록 선택합니다. 두 번째 서버는 오프 사이트가 될 수 있으며 기본 서버가 응답하지 않을 때 사용자에게 알리는 것과 같은 다른 기능을 수행 할 수 있습니다.

그런데 "정확합니까?"라는 정의는 무엇입니까?

0

IMHO, 당신은 그런

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

는 모든 방법을 구현할 필요가 없습니다 ... 이러한 방법 위의 레이어를 작성해야하지만 당신이나 당신의 클라이언트는 새로운 방법 ... 모두 그가 필요한 경우 당신의 기술 인터페이스를 구현하는 것입니다.

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

내가 당신이라면, 기존 라이브러리/모듈을 찾을 것이고 기본 시스템이 예약 된 작업 (유닉스와 윈도우가 처리 할 수 ​​없다)을 처리 할 수 ​​없다면 백그라운드 프로세스를 만들지 않을 것입니다.

1

windows task scheduler 또는 at command을 사용한 적이 있습니까? UNIX에서는 CRON 대신 사용할 수 있습니다. (1) 필요한 모든 집안일을 수행하는 PHP 스크립트를 작성할 수 있습니다. (2) PHP CLI를 통해이 스크립트를 실행하려면 Windows에서 UNIX 또는 예약 된 작업에 CRON 작업을 설정하십시오.

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