0

我正在寻找一个 php 示例/扩展,以便能够定期启动不同 PHP 子例程的执行(特定于每个路由)

对于我的智能家居自动化,我有一个在 mysql 表中定义的传感器列表:

id tinyint(4) 自动递增
nom char(50) NULL
zone_id tinyint(4) NULL
grandeur_id tinyint(4) NULL
adresse_source varchar(255) NULL
polling_time smallint(6) NULL [5]
label_unite varchar(15) NULL
description varchar(255 ) ) 无效的

每个传感器(在字段 adresse_source 中给出的 url)应每隔 1 分钟到 1 天读取一次,并记录在数据表中。我们可以让传感器 A 每分钟读取一次,传感器 B 每 5 分钟读取一次,等等......

所有传感器的传感器读取程序都相同。

我计划为不同的时间段和多个 cron 条目创建不同版本的 PHP 脚本,但这不方便且管理繁重

是否有用于中断管理的 PHP 功能,在无限循环中将有事件时间触发器根据其 polling_time 启动传感器的读写?

4

3 回答 3

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

就像我说的 - 粗糙但可能工作正常 - 考虑到你(在计算方面)相当大的时间尺度。干杯

于 2013-07-04T22:08:23.357 回答
0

中断管理?这是低级的东西,你甚至不说它在什么操作系统上运行。中断必须由内核处理——理论上它可以调用用户空间程序——但它是任何语言的一种非常迂回的做事方式。您提到 cron 让我相信您根本不是真的要中断。

在 POSIX 系统上,您可以使用 pcntl_signal()、[u]sleep() 和 pcntl_alarm() 来安排代码的运行,实际上只需使用 usleep() 和事件队列即可。

如果是我,我会使用像 Nagios 这样的调度引擎(高频 cron 作业存在复杂性)来调用 PHP 脚本,而不是让 PHP 充当控制器。

于 2013-07-04T20:52:52.080 回答
0

我尝试使用事件 php 扩展,但它只执行每个事件一次,然后没有别的。

可能是一个想法?

    $base = new EventBase();
    $延迟1 = 2;
    $延迟2 = 10;

    $event1 = Event::timer($base, function($delay1) 使用 (&$event1) {
        // 子程序 event1
        echo "$delay1 秒经过的事件 1\n";
        $event1->delTimer();
        }, $延迟1);
    $event1->addTimer($delay1);

    $event2 = Event::timer($base, function($delay2) 使用 (&$event2) {
        // 子程序 event1
        echo "$delay2 秒经过的事件 2\n";
        $event2->delTimer();
        }, $延迟2);
    $event2->addTimer($delay2);
    $base->循环();
    而(1);

于 2013-07-04T22:24:01.577 回答