#!/usr/bin/php <?php /* * rebuild.php - rebuilds all static files * This is much different than the one in vichan because we have way more static files. It will not work without pcntl_fork. * You must specify the things you want to rebuild. By default the script does nothing. * Example of how to use: * php rebuild.php --cache --js --indexes --processes 5 * That will clear the cache, rebuild all JS files and all indexes, and fork 5 processes to do it faster. * I removed the quiet option, it's useless. Just use output redirection. */ require dirname(__FILE__) . '/inc/cli.php'; $start = microtime(true); // parse command line $opts = getopt('', Array('board:', 'themes', 'js', 'indexes', 'threads', 'processes:', 'cache', 'postmarkup', 'api')); $options = Array(); $global_locale = $config['locale']; // Do only one board? $options['board'] = isset($opts['board']) ? $opts['board'] : (isset($opts['b']) ? $opts['b'] : false); // Clear the cache? $options['cache'] = isset($opts['cache']); // Rebuild themes (catalogs)? $options['themes'] = isset($opts['themes']); // Rebuild JS? $options['js'] = isset($opts['js']); // Rebuild indexes? (e.g. /b/index.html) $options['indexes'] = isset($opts['indexes']); // Rebuild threads? (e.g. /b/res/1.html) $options['threads'] = isset($opts['threads']); // Rebuild all post markup? (e.g. /b/res/1.html#2) $options['postmarkup'] = isset($opts['postmarkup']); // Rebuild API pages? (e.g. /b/res/1.json') $options['api'] = isset($opts['api']); // How many processes? $options['processes'] = isset($opts['processes']) ? $opts['processes'] : 1; echo "== Tinyboard + vichan {$config['version']} ==\n"; if ($options['cache']) { echo "Clearing template cache...\n"; load_twig(); $twig->clearCacheFiles(); } if($options['themes']) { echo "Regenerating theme files...\n"; rebuildThemes('all'); } if($options['js']) { echo "Generating Javascript file...\n"; buildJavascript(); } $main_js = $config['file_script']; $boards = listBoards(); //$boards = array(array('uri'=>'test'), array('uri'=>'tester'), array('uri'=>'testing')); $boards_m = array_chunk($boards, floor(sizeof($boards)/$options['processes'])); function doboard($board) { global $global_locale, $config, $main_js, $options; $config['mask_db_error'] = false; if (!$options['api']) $config['api']['enabled'] = false; echo "Opening board /{$board['uri']}/...\n"; // Reset locale to global locale $config['locale'] = $global_locale; init_locale($config['locale'], 'error'); openBoard($board['uri']); $config['try_smarter'] = false; if($config['file_script'] != $main_js && $options['js']) { // different javascript file echo "(/{$board['uri']}/) Generating Javascript file...\n"; buildJavascript(); } if ($options['indexes']) { echo "(/{$board['uri']}/) Creating index pages...\n"; buildIndex(); } if($options['postmarkup']) { $query = query(sprintf("SELECT `id` FROM ``posts_%s``", $board['uri'])) or error(db_error()); while($post = $query->fetch()) { echo "(/{$board['uri']}/) Rebuilding #{$post['id']}...\n"; rebuildPost($post['id']); } } if ($options['threads']) { $query = query(sprintf("SELECT `id` FROM ``posts_%s`` WHERE `thread` IS NULL", $board['uri'])) or error(db_error()); while($post = $query->fetch()) { echo "(/{$board['uri']}/) Rebuilding #{$post['id']}...\n"; @buildThread($post['id']); } } } $children = array(); foreach ($boards_m as $i => $bb) { $pid = pcntl_fork(); if ($pid == -1) { die('Fork failed?'); } else if ($pid) { echo "Started PID #$pid...\n"; $children[] = $pid; } else { unset($pdo); $i = 0; $total = sizeof($bb); sql_open(); foreach ($bb as $i => $b) { $i++; doboard($b); echo "I'm on board $i/$total\n"; } break; } } printf("Complete! Took %g seconds\n", microtime(true) - $start); unset($board); foreach ($children as $child) { pcntl_waitpid($child, $status); unset($children[$child]); } //modLog('Rebuilt everything using tools/rebuild.php');