У меня есть скрипт, который читает последнюю строку файла журнала для моей радиостанции, используя следующую команду.
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 строки, как в примере выше. Мне нужен способ сделать 3 вещи.
1) Обнаружить только последнее появление записи в журналах, соответствующей шаблону строки № 1
2) Выполните код, когда это произойдет, и ничего не делайте, пока это не произойдет снова.
3) регулярное выражение для извлечения данных между «вторым набором» квадратных скобок в строке, разделенной знаком «-», например, [Рианна подвиг. Кейшиа Коул — Название (Ремикс)]
Перед изменением выходных данных моего радиосценария мой сценарий определил, когда произошло изменение песни, путем привязки журналов к строке «Название обновлено», а затем извлекал имя исполнителя и название заголовка из квадратных скобок в той же строке.
Как только это происходит, данные отправляются в базу данных MySQL и отправляются в Twitter.
Я попытался использовать «strpos» в операторе if, чтобы сначала обнаружить строку, содержащую «Обновленный заголовок», а затем выполнить функцию, чтобы получить информацию о песне из строки впоследствии, что работает, но только если я использую статический сценарий, помещая пример кроме строки # 1 в переменную, а затем запустить его из моего сценария. Он определяет линию и сервер, для которых он предназначен, но мне нужно, чтобы мой сценарий оставался динамическим, чтобы он что-то делал, только когда происходит это событие, и в это время всегда бездействовал.
Прямо сейчас я должен был пойти бутлег и сделать следующее.
Создал функцию, чтобы получить последние 3 строки из журнала и затем поместить каждую строку в массив. Сойдя с примера вывода выше.
массив [0] = целевая линия
массив [1] = следующая строка
массив [3] = следующая строка
Журналы останутся таким же образом, так как никакие другие выходные данные не будут опубликованы до следующей смены песни, а затем они повторяются с единственным изменением — это информация об исполнителе и названии. В настоящее время, так как я запускаю свой скрипт для принудительного просмотра массива [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];
Этот скрипт ниже является тем направлением, к которому я хотел бы вернуться, и он работает при использовании статической версии, как в примере ниже. Как только я настраиваю скрипт на просмотр последней строки журнала, он никогда не обнаруживает изменений, потому что всегда обнаруживает следующую строку после целевой строки. (поверьте, регулярное выражение может быть ответственным, но не уверен)
$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];
Задача ещё не решена.
Других решений пока нет …