gettimeofday 는 C 언어 표준 라이브러리 기능으로, 일반적으로 현재 시스템 시간을 얻는 데 사용되며 정확도는 마이크로 초에 도달합니다. 그 진술은 다음과 같습니다.
<span><span><span class="hljs-type">int</span></span><span> </span><span><span class="hljs-title function_">gettimeofday</span></span><span><span class="hljs-params">(<span class="hljs-keyword">struct</span></span></span><span> timeval *tv, </span><span><span class="hljs-keyword">struct</span></span><span> timezone *tz);
</span></span>
TV는 초와 마이크로 초를 포함하는 타임볼 구조입니다.
TZ 는 시간대 정보이며 시간대 정보가 초점 내에 있지 않기 때문에 일반적으로 NULL을 전달할 수 있습니다.
gettimeofday 의 반환 값은 현재 시간, 초 및 마이크로 초이며 작업의 실행 시간을 정확하게 계산하는 데 사용할 수 있습니다.
수면 기능
수면 함수는 프로그램의 실행을 일시 중지하는 데 사용되며,이 단위는 초에 코드의 대기 시간을 제어하는 데 사용됩니다. 그 진술은 다음과 같습니다.
<span><span><span class="hljs-type">unsigned</span></span><span> </span><span><span class="hljs-type">int</span></span><span> </span><span><span class="hljs-title function_">sleep</span></span><span><span class="hljs-params">(<span class="hljs-type">unsigned</span></span></span><span> </span><span><span class="hljs-type">int</span></span><span> seconds);
</span></span>
그러나 수면 기능은 두 번째 수준으로 만 정확할 수 있습니다. 정밀 시간 제어가 더 높은 경우, 우리는 Usleep 기능을 사용할 수있어 마이크로 초 수준에서 시간을 통과 할 수 있습니다.
고정 된 시간 간격 내에 작업 실행이 고정되어야하는 것과 같이 프로그램의 작업 실행 시간을 정확하게 제어해야한다고 가정하지만 작업의 실행 시간이 너무 길거나 너무 짧아지는 것을 원하지 않습니다. gettimeofday를 사용하여 현재 시간을 얻고 수면 기능을 결합하여 각 실행의 간격을 조정할 수 있습니다.
현재 시간을 얻으십시오
우리는 먼저 gettimeofday 에 전화하여 현재 시스템 시간을 얻습니다. 이것은 작업이 실행되기 시작하는 시간을 알 수 있습니다.
대상 시간을 계산하십시오
100 밀리 초마다 실행되기 위해 작업이 필요하다고 가정합니다. 시작 시간을 얻은 후 다음 작업 실행의 대상 시간을 계산할 수 있습니다. 대상 시간은 현재 시간과 작업 실행 간격과 같습니다.
대상 시간이 도착할 때까지 기다리십시오
대상 시간을 계산 한 후 현재 시간과 대상 시간의 차이를 계산하고 수면 또는 수면을 사용하여 정확하게 기다릴 수 있습니다. 이렇게하면 작업이 너무 길거나 너무 짧게 실행되는 것을 방지 할 수 있습니다.
작업의 정확성을 제어하십시오
작업의 실행 시간을보다 정확하게 제어하려면 작업 간격이 요구 사항을 충족하는지 확인하기 위해 작업이 실행 된 후 현재 시간을 확인할 수 있습니다.
다음은 gettimeofday 및 sleep을 사용하여 작업 실행 시간을 제어하는 샘플 코드입니다.
<span><span><span class="hljs-meta"><?php</span></span><span>
</span><span><span class="hljs-comment">// 각 작업 실행의 간격 시간을 설정하십시오(단위:초 및 마이크로 초)</span></span><span>
</span><span><span class="hljs-variable">$interval_sec</span></span><span> = </span><span><span class="hljs-number">0</span></span><span>; </span><span><span class="hljs-comment">// 두번째</span></span><span>
</span><span><span class="hljs-variable">$interval_usec</span></span><span> = </span><span><span class="hljs-number">100000</span></span><span>; </span><span><span class="hljs-comment">// 微두번째,100毫두번째</span></span><span>
</span><span><span class="hljs-comment">// 현재 시간을 얻으십시오</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getCurrentTime</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-variable">$time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">gettimeofday</span></span><span>();
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$time</span></span><span>[</span><span><span class="hljs-string">'sec'</span></span><span>] * </span><span><span class="hljs-number">1000000</span></span><span> + </span><span><span class="hljs-variable">$time</span></span><span>[</span><span><span class="hljs-string">'usec'</span></span><span>]; </span><span><span class="hljs-comment">// 返回当前时间的微두번째数</span></span><span>
}
</span><span><span class="hljs-comment">// 작업 실행을위한 대상 시간을 계산하십시오</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">getTargetTime</span></span><span>(</span><span><span class="hljs-params"><span class="hljs-variable">$interval_sec</span></span></span><span>, </span><span><span class="hljs-variable">$interval_usec</span></span><span>) {
</span><span><span class="hljs-variable">$current_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getCurrentTime</span></span><span>();
</span><span><span class="hljs-keyword">return</span></span><span> </span><span><span class="hljs-variable">$current_time</span></span><span> + </span><span><span class="hljs-variable">$interval_sec</span></span><span> * </span><span><span class="hljs-number">1000000</span></span><span> + </span><span><span class="hljs-variable">$interval_usec</span></span><span>;
}
</span><span><span class="hljs-comment">// 시간이 정한 작업을 시뮬레이션하십시오</span></span><span>
</span><span><span class="hljs-function"><span class="hljs-keyword">function</span></span></span><span> </span><span><span class="hljs-title">performTask</span></span><span>(</span><span><span class="hljs-params"></span></span><span>) {
</span><span><span class="hljs-comment">// 작업 실행 시뮬레이션(예를 들어:처리 데이터、묻다API기다리다)</span></span><span>
</span><span><span class="hljs-keyword">echo</span></span><span> </span><span><span class="hljs-string">"Task performed at: "</span></span><span> . </span><span><span class="hljs-title function_ invoke__">date</span></span><span>(</span><span><span class="hljs-string">"Y-m-d H:i:s"</span></span><span>) . </span><span><span class="hljs-string">"\n"</span></span><span>;
}
</span><span><span class="hljs-comment">// 주요 프로그램</span></span><span>
</span><span><span class="hljs-keyword">while</span></span><span> (</span><span><span class="hljs-literal">true</span></span><span>) {
</span><span><span class="hljs-comment">// 현재 시간을 얻으십시오</span></span><span>
</span><span><span class="hljs-variable">$current_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getCurrentTime</span></span><span>();
</span><span><span class="hljs-comment">// 대상 시간을 계산하십시오</span></span><span>
</span><span><span class="hljs-variable">$target_time</span></span><span> = </span><span><span class="hljs-title function_ invoke__">getTargetTime</span></span><span>(</span><span><span class="hljs-variable">$interval_sec</span></span><span>, </span><span><span class="hljs-variable">$interval_usec</span></span><span>);
</span><span><span class="hljs-comment">// 작업을 수행하십시오</span></span><span>
</span><span><span class="hljs-title function_ invoke__">performTask</span></span><span>();
</span><span><span class="hljs-comment">// 计算기다리다待时间</span></span><span>
</span><span><span class="hljs-variable">$sleep_time</span></span><span> = </span><span><span class="hljs-variable">$target_time</span></span><span> - </span><span><span class="hljs-title function_ invoke__">getCurrentTime</span></span><span>();
</span><span><span class="hljs-comment">// 작업 실행 시간이 짧은 경우,통과 할 수 있습니다 usleep 来精确기다리다待</span></span><span>
</span><span><span class="hljs-keyword">if</span></span><span> (</span><span><span class="hljs-variable">$sleep_time</span></span><span> > </span><span><span class="hljs-number">0</span></span><span>) {
</span><span><span class="hljs-title function_ invoke__">usleep</span></span><span>(</span><span><span class="hljs-variable">$sleep_time</span></span><span>); </span><span><span class="hljs-comment">// 기다리다待直到目标时间到达</span></span><span>
}
}
</span><span><span class="hljs-meta">?></span></span><span>
</span></span>
이 예에서는 작업이 100 밀리 초마다 실행됩니다. gettimeofday 함수를 통해 현재 시간을 얻고 대상 시간을 계산 한 다음 usleep 함수를 사용하여 정확하게 대기하십시오. 이를 통해 작업을 정확하게 제어 할 수 있으며 시스템 일정 또는 기타 요인으로 인한 시간 편차를 피할 수 있습니다.