Я использую у себя такую конструкцию:
<?php register_tick_function('_all_cron_trick');
declare(ticks=1);
?>
Функция _all_cron_trick у меня такая:
<?php function _all_cron_trick()
{
global $all_info;
if(ALL_CRON_CPU<1||ALL_CRON_CPU>=100) return;
$i_time=_debug_microtime();
if($i_time<$all_info['cron-time']+ALL_CRON_CPU/100.0*ALL_CRON_TICK) return;
$i_sleep=(100.0/ALL_CRON_CPU-1)*($i_time-$all_info['cron-time']);
if($i_sleep>ALL_CRON_MAX) $i_sleep=ALL_CRON_MAX;
usleep($i_sleep*1000000);
$all_info['cron-time']=_debug_microtime();
}
?>
функция _debug_microtime() возвращает текущее время в миллисекундах
константа ALL_CRON_CPU содержит число от 1 до 100, обозначающее процент загруженности процессора (100% - означает, что процессор можно грузить на 100%; 1% - означает, что процессор можно загружать только на 1%)
ALL_CRON_MAX - максимальное количество секунд для одного цикла ожидания. то есть, например, может получиться так, что функция _all_cron_trick() не вызывалась слишком долго и тогда $i_sleep будет очень большим. а нет смысла, с точки зрения нагрузки на процессор, простаивать, к примеру, больше 5 секунд - тогда ALL_CRON_MAX можно установить равным 5.
При этом правда, нужно заметить, что:
1. Во всех версиях Windows вызов declare() приводит к краху апача.
2. Крах апача также наступает во многих вариантах инсталляций *nix+PHP - это нужно проверять конкретно у Вашего хостера - у некоторых наступает крах, а у некоторых всё ок. Причём под *nix крах может быть неустойчивым (то есть, один раз вырубился апач, а один раз - всё ок). Но если крах не устойчивый, то выбрубается примерно в 50% вызовах - то есть, нужно пощёлкать несколько раз и посмотреть, если хотя бы раз вырубилось, значит не годится фишка для Вашего хостера.
Для теста на то, вызывает ли declare() крах системы, я использую такой файл:
requirement-declare.html (основной файл, его нужно вызывать)
<?php // public_html/prg/requirement-declare.html
// (c) Yuri Popoff, May 2008, popoff.donetsk.ua
// A script to show a bug in a PHP
// LICENSE-NOLICENSE
if(empty($_GET['auto']))
{
echo '<p>Test <code>declare(ticks=1);</code></p><p>Valid reply: <b>123</b></p><p>Invalid reply: <b>1</b></p><p>This is an unstable error, so you SHOULD make many tries to ensure that a valid reply comes always.</p>Reply: ';
}
echo '1';flush();
include('requirement-declare.php');
echo '2';flush();
function _all_cron_trick()
{
// any function
}
register_tick_function('_all_cron_trick');
declare(ticks=1);
echo '3';flush();
?>
Файл requirement-declare.php может быть абсолютно любым. В моём тесте он такой:
<?php // absoultely any file
?>
~~~~~ 27 Фев 2009, 17:25, спустя 3 минуты 33 секунды ~~~~~
Да, а ещё недавно я обнаружил инсталляцию апаче+РНР, под которой этот тест не выводит даже “1”...