#!/opt/local/bin/php <?php // Демонизация процесса $child_pid = pcntl_fork(); if ($child_pid == -1) { die('Error while forking process.'); } elseif ($child_pid) { // Выходим из родительского, привязанного к консоли, процесса exit; } require_once '/www/server/php/common.php'; // Минимальный интервал между запросами define('VKTIMEOUT', 10); define('QUEUE_PACK', 30); define('EMPTY_QUEUE_TIMEOUT', 60); // Получаем имя бота if (!isset($argv[1]) || !Config::get('bot:'. $argv[1])) { die('Wrong bot name: '. @$argv[1]); } $bot_name = ucfirst($argv[1]); // Инициализация бота по имени $vk = new Vkontakte($bot_name); // Данные о работе бота $stats = array( 'started_job' => time(), 'eneded_job' => time(), 'pid' => getmypid(), 'good_results' => 0, 'bad_results' => 0, 'queue_size' => 0, 'last_request' => '' ); // Устанавливаем коннект с БД $db = Db::getInstance(); // Бот работает все время while (true) { // Получаем список песен для загрузки, помечаем в очереди, что мы их взяли в работу $db->q('BEGIN'); $queue = $db->getRows($db->q("SELECT * FROM beathaven.queue WHERE status=0 ORDER BY priority DESC, times_failed ASC LIMIT ". QUEUE_PACK)); $ids = array(); foreach ($queue as $t) { $ids[] = $t['track_id']; } $db->q('UPDATE beathaven.queue SET status=1 WHERE track_id IN('. implode(',', $ids) .')'); $db->q('COMMIT'); if (!$queue || count($queue) == 0) { sleep(EMPTY_QUEUE_TIMEOUT); } else { $stats['queue_size'] = count($queue); foreach ($queue as $t) { $t1 = microtime(true); echo "#{$t['track_id']} {$t['track_title']} -- "; $ok = $vk->getTracks($t['track_title']); if (strpos($vk->getHtml(), 'searchOffset') === false) { echo "Session kaput!\n"; die; } if ($ok) { echo "OK\n"; $db->q("UPDATE beathaven.queue SET status=3 WHERE track_id=". $t['track_id']); $file_name = Config::get('app:Parser:good_html_dir'). $t['track_id'] .'.html'; $stats['good_results']++; } else { echo "FAILED\n"; $db->q("UPDATE beathaven.queue SET status = 2, times_failed = times_failed + 1 WHERE track_id=". $t['track_id']); $file_name = Config::get('app:Parser:bad_html_dir'). $t['track_id'] .'.html'; $stats['bad_results']++; } file_put_contents($file_name, $vk->getHtml()); chmod($file_name, 0777); $stats['last_request'] = $t['track_title']; $stats['queue_size']--; $stats['eneded_job'] = time(); $bot_stats_file_name = Config::get('app:Parser:bot_stats_dir'). $bot_name .'.json'; file_put_contents($bot_stats_file_name, json_encode($stats)); chmod($bot_stats_file_name, 0777); $t2 = microtime(true); if ($t2 - $t1 < VKTIMEOUT) { sleep(ceil(VKTIMEOUT - ($t2 - $t1))); } } } }