@pavelzabavin

Как адаптировать код php под FreeBSD?

Дано: код, который анализирует онлайн-поток радиостанции, извлекает мета-данные и отдаёт через JSON.

P.S.: Его лепили из того, что было...

<?php
(PHP_SAPI !== 'cli' || isset($_SERVER['HTTP_USER_AGENT'])) && die();
error_reporting(0);
header('Content-Type: text/html; charset=utf-8', true);
set_time_limit(0);
ignore_user_abort(true);

exec('ps -ef | grep -v grep | grep ' . __FILE__ . '  2>&1', $processes);
if ((isset($processes[1])) and (stripos($processes[1], __FILE__) !== false)) {
    echo "A copy of the script is already running!" . PHP_EOL;
} else {
    $stored_uniqueid = 0;
    while (true) {
        $meta = '';
        $uniqueid = 0;
        $meta = trim(htmlspecialchars_decode(strip_tags(file_get_contents('ссылка на поток&' .time()))));
        $uniqueid = intval(crc32($meta));
        if ($uniqueid !== $stored_uniqueid) {
            $out = array();
            $out['id'] = $uniqueid;
            $out['meta'] = $meta;
            $meta_arr = explode(' - ', $meta);
            $out['artist'] = array_shift($meta_arr);
            $out['title'] = implode(' - ', $meta_arr);
            $out['cover'] = file_exists(__DIR__ . '/covers/' . str_replace('/\\', '_', $meta) . '.jpg') ? '/covers/' . str_replace('/\\', '_', $meta) . '.jpg' : '/covers/logo.jpg';
            $out['last_modified'] = filemtime(__DIR__ . $out['cover']);
            $stored_uniqueid = $uniqueid;
            $file_out = fopen(__DIR__ . '/current.json', "w+");
            $out_json = json_encode($out, JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES | JSON_HEX_APOS | JSON_HEX_QUOT) . PHP_EOL;
            fwrite($file_out, $out_json);
            fclose($file_out);
            $file_out = fopen(__DIR__ . '/current.txt', "w+");
            fwrite($file_out, $out['artist'] . ' - ' . $out['title']);
            fclose($file_out);
            //sleep(1);
        }
        sleep(20);
    }
}
?>


Предполагается, что данный скрипт должен быть добавлен в CRON.

Используется FreeBSD. Смысл такой, что я могу запустить несколько копий и приведённый ниже код не отрабатывается:

exec('ps -ef | grep -v grep | grep ' . __FILE__ . '  2>&1', $processes);
if ((isset($processes[1])) and (stripos($processes[1], __FILE__) !== false)) {
    echo "A copy of the script is already running!" . PHP_EOL;
}

Если я ставлю в крон, то каждую минуту по скрипту у меня запускается get_meta.php. Итого в час, у меня запущено 60 скриптов.
  • Вопрос задан
  • 119 просмотров
Пригласить эксперта
Ответы на вопрос 4
Вместо использования команды можно создавать файл и перед запуском скрипта проверять, создан ли он

if (file_exists('myscript.running')) {
   echo 'Скрипт уже работает!', PHP_EOL;
   return;
}
touch('myscript.running');

// Тут ваш код
Ответ написан
shurshur
@shurshur
Сисадмин, просто сисадмин...
Просто вынести содержимое блока while(true) { ... } из цикла и убрать sleep, тогда вместо бесконечного цикла скрипт будет делать то же самое всего один раз. После этого скрипт можно гонять через cron.

Вопрос чисто по php, остальные тэги лишние.
Ответ написан
Комментировать
@caballero
Программист
ну вы ж сами зацикливаете код PHP
шо то одно или бесконечный цикл в PHP или крон
Ответ написан
nokimaro
@nokimaro
Меня невозможно остановить, если я смогу начать.
простейший механизм лока на сокетах
при запуске скрипт резервирует себе порт (7600й) и держит его до тех пор пока не прекратит работу

$stream = @stream_socket_server('tcp://0.0.0.0:7600', $errno, $errmg) ;
if(!$stream) {
    echo "A copy of the script is already running!" . PHP_EOL;
    exit;
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы