Php 在Shoutcast服务器中检测歌曲更改的时间

Php 在Shoutcast服务器中检测歌曲更改的时间,php,regex,shoutcast,Php,Regex,Shoutcast,我有一个脚本,正在使用以下命令读取我的电台日志文件的最后一行 watch -n 1 php script.php 上面的命令每隔1秒执行我的脚本。此脚本正在读取的日志的输出如下所示 2016-04-28 23:30:34 INFO [ADMINCGI sid=1] Title updated [Bankroll Fresh Feat. Street Money Boochie - Get It] 2016-04-28 23:30:34 INFO [ADMINCGI sid=1] D

我有一个脚本,正在使用以下命令读取我的电台日志文件的最后一行

watch -n 1 php script.php
上面的命令每隔1秒执行我的脚本。此脚本正在读取的日志的输出如下所示

2016-04-28 23:30:34 INFO    [ADMINCGI sid=1] Title updated [Bankroll Fresh Feat. Street Money Boochie - Get It]
2016-04-28 23:30:34 INFO    [ADMINCGI sid=1] DJ name updated [1]
2016-04-28 23:30:36 INFO    [YP] Updating listing details for stream #1 succeeded.
每次歌曲更改时,会向日志中添加3行,如上面的示例输出所示。我需要一种方法来做三件事

1) 仅检测日志中与第#1行模式匹配的条目的最新发生情况 2) 发生这种情况时执行代码,在再次发生这种情况之前,不要执行任何其他操作。 3) 正则表达式用于在由“-”分隔的行上的“第二组”方括号之间提取数据,例如[Rihanna feat.Keyshia Cole-Title(混音)]

在我的广播脚本的日志输出更改之前,我的脚本将通过跟踪“标题更新”行的日志来检测何时发生歌曲更改,然后从同一行的方括号中提取艺术家和标题名称

一旦发生这种情况,数据将被发送到MySQL数据库并发送到Twitter

我曾尝试在if语句中使用“strpos”来首先检测包含“Title updated”的行,然后执行一个函数从该行中获取歌曲信息,该函数随后可以工作,但仅当我使用静态场景时,才可以通过将除第#1行之外的示例放入变量中,然后从脚本中运行它。它确实检测到了线路和服务器,但我需要我的脚本保持动态,这意味着只有在发生此事件时才执行某些操作,同时始终处于空闲状态

现在我不得不去偷盗并做以下事情

创建了一个函数,从日志中获取最后3行,然后将每行放入一个数组中。离开上面的示例输出。 数组[0]=目标行 数组[1]=下一行 数组[3]=下一行

日志将保持这种方式,因为在下一首歌曲更改之前不会发布其他输出,然后它会重复,唯一更改的是艺术家和标题信息。目前,由于我正在运行脚本来强制查看数组[0],而数组[0]始终是我需要的行,因此当脚本在歌曲更改时发布到Twitter时,它会立即发送副本。幸运的是,我在Twitter部分实现了错误代码,这样我就可以使用sleep()强制脚本在平均歌曲长度周围空闲180秒(3分钟)。现在,这是体面的,它确实张贴,但我的推文不再是实时的,因为每首歌有不同的长度

下面是我脚本中的一个片段

$lines = read_file(TEXT_FILE, LINES_COUNT);
    foreach ($lines as $line) {
    $pattern="/\[([^\]]*)\]/";
            if (preg_match_all($pattern, $lines[0], $matches)){
                foreach ($matches[1] as $a ){

     $fulltitle = explode("-", $matches[1][1]);

     $artist = $fulltitle[0];
     $title = $fulltitle[1];
下面的脚本是我想返回的方向,在使用静态版本时确实有效,如下面的示例所示。一旦我将脚本设置为查看日志的最后一行,它就不会检测到更改,因为它总是检测目标行之后的下一行。(相信regex可能对此负责,但不确定)

$line ="2016-04-27 22:56:48     INFO    [ADMINCGI sid=1] Title updated [Tessa Feat. Gucci Mane - Get You Right]";
echo $line;

$pattern="/\[([^\]]*)\]/";

$needle = " Title updated ";
if (strpos($line,$needle) !== false) {
    preg_match_all($pattern, $line, $matches);
        foreach ($matches[1] as $a ){

$fulltitle = explode("-", $matches[1][1]);

$artist = $fulltitle[0];
$title = $fulltitle[1];