2013-07-04 2 views
0
I은 ​​PHP 예 바라는

은/확장 (각 경로의 특정)PHP 다른 루틴

일정한 주기로 다른 PHP 서브 루틴의 실행을 개시 할 수 있도록 각각의 X, Y, Z 분 출시 무한 루프

아이디 TINYINT (4) 자동 증가
NOM 숯불 (50) NULL
zone_id TINYINT (4) NULL
: 내 smarthome 자동화를 들어, 나는 MySQL의 테이블에 정의 된 센서 목록을했습니다 grandeu r_id TINYINT (4) NULL
adresse_source의 VARCHAR (255) NULL
polling_time의 SMALLINT (6) NULL [5]
label_unite의 VARCHAR (15) NULL
설명 VARCHAR (255) NULL

각을 센서 (필드 adresse_source에 주어진 URL)는 1 분에서 1 일 간격마다 그리고 데이터 테이블의 레코더에서 읽어야합니다. 센서 A는 매 분, 센서 B는 매 5 분마다 읽을 수 있습니다.

센서 판독 절차는 모든 센서에서 동일합니다.

내가 다른 기간 및 다수의 cron 항목이 PHP 스크립트의 다른 버전을 만들 계획이었다, 그러나 이것은

을 관리하기 편리하고 무거운없는 경우 인터럽트 관리를위한 PHP 기능은 무한에 있는가 루프는 이벤트 시간 트리거가 해당 폴링 _ 시간에 따라 센서의 쓰기 & 쓰기 시작할 것입니다?

+0

pcntl_signal & pcntl_alarm help? 하나의 타이머에 대한 좋은 생각이지만, 같은 시간에 실행되는 4-5 다른 타이머가 필요할 수도 있습니다 – ThomasP

+0

eventbase PHP 확장이 될 수 있습니까? 하지만 난 그것을 작동시킬 수 없다 – ThomasP

답변

1

조잡한 해결책의 경우, 타이밍 범위 (1 분에서 1 일)가 주어지면 간단한 루프를 벗어날 수 있습니다.

루프가 안정적으로 몇 초 안에 실행되면, php 시간 (now())을 확인할 수 있습니다 (가장 가까운 분으로 반올림 - 다이빙 60). (PHP 시간은 정수로 초 단위로 표시됩니다). 그런 다음이 값의 mod()를 분으로 표시된 관련 간격으로 나누어 테스트 할 수 있습니다.

결과가 0이면 해당 이벤트가 트리거 될 수 있습니다.

센서의 수가 많지 않으면 한 번에 (루프 이전에) 읽는 것이 도움이 될 수 있으며 간격으로 입력 된 연관 배열에 저장됩니다.

$sensors=array(); 

... while(fetch_row ..){ 
$interval=$row['polling_time']; 
$sensors["$interval"][]=$row; 
} 
... 
$prevtime=intval(round(floatval(now()/60),0); 
while (true) 
{ 
    $thistime=intval(round(floatval(now()/60),0); 
    if ($thistime == $prevtime) 
    { 
    sleep(1); 
    continue; 
    } 
    $prevtime=$thistime; 
    foreach ($sensors as $interval=>$intsensors) 
    { 
    if (($thistime%intval($interval)) == 0) 
    { // this interval has been matched to the current time - so get the sensors 
     foreach ($intsensors as $this_sensor) 
     { 
     extract($this_sensor); 
     // do what you like with this sensor's details. 
     } 
    } 
    } 
    sleep(10) // or however many seconds you need to make your loop work smoothly 
} 
... etc 

내가 말했듯이 - 원유하지만 확인을 작동 할 수 - 당신 (용어 컴퓨팅에서) 상당히 많은 시간 척도 주어진다. 건배

+0

감사합니다. 나는 이것을 시험 할 것입니다. – ThomasP

+0

PHP Event :: Timer에 대해 살펴 보았습니다. PHP 예제와 관련하여 코드는 괜찮은 것처럼 보이지만 그 확장에 대해서는 많은 논평이 없습니다. 우리가 어떻게 작동하는지 알면 합리적으로 좋은 해결책이 될 수 있습니다. –

0

인터럽트 관리? 이것은 낮은 수준의 물건이며 당신은 심지어 어떤 OS를 실행 중인지 말하지 않습니다. 인터럽트는 이론적으로는 사용자 공간 프로그램을 호출 할 수있는 커널에 의해 처리되어야하지만, 어떤 언어로든 일을 처리하는 것은 매우 순환적인 방식입니다. cron에 대한 언급은 당신이 정말로 인터럽트를 전혀 의미하지 않는다고 믿게합니다.

pcntl_signal(), [u] sleep() 및 pcntl_alarm()을 사용하여 코드 실행을 예약 할 수 있습니다. 실제로는 usleep() 및 이벤트 대기열을 사용하여 수행 할 수 있습니다.

나인 경우, PHP를 컨트롤러로 사용하는 대신 PHP 스크립트를 호출하기 위해 Nagios와 같은 스케줄링 엔진 (고주파 크론 작업과 관련하여 복잡한 문제가 있음)을 사용합니다.

+0

라스베리 파이 raspbian 지난 배포판과 우분투와 sheevaplug에서 실행 9. 당신은 이벤트 대기열에 의해 무엇을 의미합니까? – ThomasP

0

나는 이벤트 PHP 확장 기능을 사용해 보았지만 각 이벤트를 한 번만 실행 한 다음 다른 것은 한 번만 실행합니다.

아이디어가 있습니까?

 

    $base = new EventBase(); 
    $delay1 = 2; 
    $delay2 = 10; 

    $event1 = Event::timer($base, function($delay1) use (&$event1) { 
     // subroutine event1 
     echo "$delay1 seconds elapsed event 1\n"; 
     $event1->delTimer(); 
     }, $delay1); 
    $event1->addTimer($delay1); 

    $event2 = Event::timer($base, function($delay2) use (&$event2) { 
     // subroutine event1 
     echo "$delay2 seconds elapsed event 2\n"; 
     $event2->delTimer(); 
     }, $delay2); 
    $event2->addTimer($delay2); 
    $base->loop(); 
    while (1);