function housekeeping_common($debug) { expire_cached_files($debug); expire_lock_files($debug); expire_error_log($debug); $count = update_feedbrowser_cache(); _debug("Feedbrowser updated, {$count} feeds processed."); purge_orphans(true); $rc = cleanup_tags(14, 50000); _debug("Cleaned {$rc} cached tags."); }
if (!init_connection($link)) { return; } // We disable stamp file, since it is of no use in a multiprocess update. // not really, tho for the time being -fox if (!make_stampfile('update_daemon.stamp')) { print "warning: unable to create stampfile"; } // Call to the feed batch update function // or regenerate feedbrowser cache if (rand(0, 100) > 30) { update_daemon_common($link); } else { $count = update_feedbrowser_cache($link); _debug("Feedbrowser updated, {$count} feeds processed."); purge_orphans($link, true); $rc = cleanup_tags($link, 14, 50000); _debug("Cleaned {$rc} cached tags."); _debug("Updating linked feeds..."); get_linked_feeds($link); } _debug("Elapsed time: " . (time() - $start_timestamp) . " second(s)"); db_close($link); // We are in a fork. // We wait a little before exiting to avoid to be faster than our parent process. sleep(1); unlink(LOCK_DIRECTORY . "/{$lock_filename}"); // We exit in order to avoid fork bombing. exit(0); } }
function housekeeping_common($debug) { expire_cached_files($debug); expire_lock_files($debug); expire_error_log($debug); $count = update_feedbrowser_cache(); _debug("Feedbrowser updated, {$count} feeds processed."); purge_orphans(true); $rc = cleanup_tags(14, 50000); _debug("Cleaned {$rc} cached tags."); PluginHost::getInstance()->run_hooks(PluginHost::HOOK_HOUSE_KEEPING, "hook_house_keeping", ""); }
/** * Update a feed batch. * Used by daemons to update n feeds by run. * Only update feed needing a update, and not being processed * by another process. * * @param mixed $link Database link * @param integer $limit Maximum number of feeds in update batch. Default to DAEMON_FEED_LIMIT. * @param boolean $from_http Set to true if you call this function from http to disable cli specific code. * @param boolean $debug Set to false to disable debug output. Default to true. * @return void */ function update_daemon_common($link, $limit = DAEMON_FEED_LIMIT, $from_http = false, $debug = true) { // Process all other feeds using last_updated and interval parameters // Test if the user has loggued in recently. If not, it does not update its feeds. if (DAEMON_UPDATE_LOGIN_LIMIT > 0) { if (DB_TYPE == "pgsql") { $login_thresh_qpart = "AND ttrss_users.last_login >= NOW() - INTERVAL '" . DAEMON_UPDATE_LOGIN_LIMIT . " days'"; } else { $login_thresh_qpart = "AND ttrss_users.last_login >= DATE_SUB(NOW(), INTERVAL " . DAEMON_UPDATE_LOGIN_LIMIT . " DAY)"; } } else { $login_thresh_qpart = ""; } // Test if the feed need a update (update interval exceded). if (DB_TYPE == "pgsql") { $update_limit_qpart = "AND ((\n\t\t\t\t\tttrss_feeds.update_interval = 0\n\t\t\t\t\tAND ttrss_feeds.last_updated < NOW() - CAST((ttrss_user_prefs.value || ' minutes') AS INTERVAL)\n\t\t\t\t) OR (\n\t\t\t\t\tttrss_feeds.update_interval > 0\n\t\t\t\t\tAND ttrss_feeds.last_updated < NOW() - CAST((ttrss_feeds.update_interval || ' minutes') AS INTERVAL)\n\t\t\t\t) OR ttrss_feeds.last_updated IS NULL)"; } else { $update_limit_qpart = "AND ((\n\t\t\t\t\tttrss_feeds.update_interval = 0\n\t\t\t\t\tAND ttrss_feeds.last_updated < DATE_SUB(NOW(), INTERVAL CONVERT(ttrss_user_prefs.value, SIGNED INTEGER) MINUTE)\n\t\t\t\t) OR (\n\t\t\t\t\tttrss_feeds.update_interval > 0\n\t\t\t\t\tAND ttrss_feeds.last_updated < DATE_SUB(NOW(), INTERVAL ttrss_feeds.update_interval MINUTE)\n\t\t\t\t) OR ttrss_feeds.last_updated IS NULL)"; } // Test if feed is currently being updated by another process. if (DB_TYPE == "pgsql") { $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < NOW() - INTERVAL '120 seconds')"; } else { $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < DATE_SUB(NOW(), INTERVAL 120 SECOND))"; } // Test if there is a limit to number of updated feeds $query_limit = ""; if ($limit) { $query_limit = sprintf("LIMIT %d", $limit); } $random_qpart = sql_random_function(); // We search for feed needing update. $result = db_query($link, "SELECT ttrss_feeds.feed_url,ttrss_feeds.id, ttrss_feeds.owner_uid,\n\t\t\t\t" . SUBSTRING_FOR_DATE . "(ttrss_feeds.last_updated,1,19) AS last_updated,\n\t\t\t\tttrss_feeds.update_interval \n\t\t\tFROM \n\t\t\t\tttrss_feeds, ttrss_users, ttrss_user_prefs\n\t\t\tWHERE\n\t\t\t\tttrss_feeds.owner_uid = ttrss_users.id\n\t\t\t\tAND ttrss_users.id = ttrss_user_prefs.owner_uid\n\t\t\t\tAND ttrss_user_prefs.pref_name = 'DEFAULT_UPDATE_INTERVAL'\n\t\t\t\t{$login_thresh_qpart} {$update_limit_qpart}\n\t\t\t {$updstart_thresh_qpart}\n\t\t\tORDER BY {$random_qpart} {$query_limit}"); $user_prefs_cache = array(); if ($debug) { _debug(sprintf("Scheduled %d feeds to update...\n", db_num_rows($result))); } // Here is a little cache magic in order to minimize risk of double feed updates. $feeds_to_update = array(); while ($line = db_fetch_assoc($result)) { $feeds_to_update[$line['id']] = $line; } // We update the feed last update started date before anything else. // There is no lag due to feed contents downloads // It prevent an other process to update the same feed. $feed_ids = array_keys($feeds_to_update); if ($feed_ids) { db_query($link, sprintf("UPDATE ttrss_feeds SET last_update_started = NOW()\n\t\t\t\tWHERE id IN (%s)", implode(',', $feed_ids))); } // For each feed, we call the feed update function. while ($line = array_pop($feeds_to_update)) { if ($debug) { _debug("Feed: " . $line["feed_url"] . ", " . $line["last_updated"]); } // We setup a alarm to alert if the feed take more than 300s to update. // => HANG alarm. if (!$from_http && function_exists('pcntl_alarm')) { pcntl_alarm(300); } update_rss_feed($link, $line["id"], true); // Cancel the alarm (the update went well) if (!$from_http && function_exists('pcntl_alarm')) { pcntl_alarm(0); } sleep(1); // prevent flood (FIXME make this an option?) } // Send feed digests by email if needed. if (DAEMON_SENDS_DIGESTS) { send_headlines_digests($link); } purge_orphans($link); }
static function updaterandomfeed_real($dbh) { // Test if the feed need a update (update interval exceded). if (DB_TYPE == "pgsql") { $update_limit_qpart = "AND ((\n ttrss_feeds.update_interval = 0\n AND ttrss_feeds.last_updated < NOW() - CAST((ttrss_user_prefs.value || ' minutes') AS INTERVAL)\n ) OR (\n ttrss_feeds.update_interval > 0\n AND ttrss_feeds.last_updated < NOW() - CAST((ttrss_feeds.update_interval || ' minutes') AS INTERVAL)\n ) OR ttrss_feeds.last_updated IS NULL\n OR last_updated = '1970-01-01 00:00:00')"; } else { $update_limit_qpart = "AND ((\n ttrss_feeds.update_interval = 0\n AND ttrss_feeds.last_updated < DATE_SUB(NOW(), INTERVAL CONVERT(ttrss_user_prefs.value, SIGNED INTEGER) MINUTE)\n ) OR (\n ttrss_feeds.update_interval > 0\n AND ttrss_feeds.last_updated < DATE_SUB(NOW(), INTERVAL ttrss_feeds.update_interval MINUTE)\n ) OR ttrss_feeds.last_updated IS NULL\n OR last_updated = '1970-01-01 00:00:00')"; } // Test if feed is currently being updated by another process. if (DB_TYPE == "pgsql") { $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < NOW() - INTERVAL '5 minutes')"; } else { $updstart_thresh_qpart = "AND (ttrss_feeds.last_update_started IS NULL OR ttrss_feeds.last_update_started < DATE_SUB(NOW(), INTERVAL 5 MINUTE))"; } $random_qpart = sql_random_function(); // we could be invoked from public.php with no active session if ($_SESSION["uid"]) { $owner_check_qpart = "AND ttrss_feeds.owner_uid = '" . $_SESSION["uid"] . "'"; } else { $owner_check_qpart = ""; } // We search for feed needing update. $result = $dbh->query("SELECT ttrss_feeds.feed_url,ttrss_feeds.id\n FROM\n ttrss_feeds, ttrss_users, ttrss_user_prefs\n WHERE\n ttrss_feeds.owner_uid = ttrss_users.id\n AND ttrss_users.id = ttrss_user_prefs.owner_uid\n AND ttrss_user_prefs.pref_name = 'DEFAULT_UPDATE_INTERVAL'\n {$owner_check_qpart}\n {$update_limit_qpart}\n {$updstart_thresh_qpart}\n ORDER BY {$random_qpart} LIMIT 30"); $feed_id = -1; require_once "rssfuncs.php"; $num_updated = 0; $tstart = time(); while ($line = $dbh->fetch_assoc($result)) { $feed_id = $line["id"]; if (time() - $tstart < ini_get("max_execution_time") * 0.7) { update_rss_feed($feed_id, true); ++$num_updated; } else { break; } } // Purge orphans and cleanup tags purge_orphans(); cleanup_tags(14, 50000); if ($num_updated > 0) { print json_encode(array("message" => "UPDATE_COUNTERS", "num_updated" => $num_updated)); } else { print json_encode(array("message" => "NOTHING_TO_UPDATE")); } }
function import($file = false, $owner_uid = 0) { purge_orphans(); if (!$file) { header("Content-Type: text/html"); $owner_uid = $_SESSION["uid"]; if ($_FILES['starred_file']['error'] != 0) { print_error(T_sprintf("Upload failed with error code %d", $_FILES['starred_file']['error'])); return; } $tmp_file = false; if (is_uploaded_file($_FILES['starred_file']['tmp_name'])) { $tmp_file = tempnam(CACHE_DIR . '/upload', 'starred'); $result = move_uploaded_file($_FILES['starred_file']['tmp_name'], $tmp_file); if (!$result) { print_error(__("Unable to move uploaded file.")); return; } } else { print_error(__('Error: please upload OPML file.')); return; } if (is_file($tmp_file)) { $doc = json_decode(file_get_contents($tmp_file), true); unlink($tmp_file); } else { print_error(__('No file uploaded.')); return; } } else { $doc = json_decode(file_get_contents($file), true); } if ($file) { $sql_set_marked = strtolower(basename($file)) == 'starred.json' ? 'true' : 'false'; _debug("will set articles as starred: {$sql_set_marked}"); } else { $sql_set_marked = strtolower($_FILES['starred_file']['name']) == 'starred.json' ? 'true' : 'false'; } if ($doc) { if (isset($doc['items'])) { $processed = 0; foreach ($doc['items'] as $item) { // print_r($item); $guid = db_escape_string(mb_substr($item['id'], 0, 250)); $title = db_escape_string($item['title']); $updated = date('Y-m-d h:i:s', $item['updated']); $last_marked = date('Y-m-d h:i:s', mb_substr($item['crawlTimeMsec'], 0, 10)); $link = ''; $content = ''; $author = db_escape_string($item['author']); $tags = array(); $orig_feed_data = array(); if (is_array($item['alternate'])) { foreach ($item['alternate'] as $alt) { if (isset($alt['type']) && $alt['type'] == 'text/html') { $link = db_escape_string($alt['href']); } } } if (is_array($item['summary'])) { $content = db_escape_string($item['summary']['content'], false); } if (is_array($item['content'])) { $content = db_escape_string($item['content']['content'], false); } if (is_array($item['categories'])) { foreach ($item['categories'] as $cat) { if (strstr($cat, "com.google/") === FALSE) { array_push($tags, sanitize_tag($cat)); } } } if (is_array($item['origin'])) { if (strpos($item['origin']['streamId'], 'feed/') === 0) { $orig_feed_data['feed_url'] = db_escape_string(mb_substr(preg_replace("/^feed\\//", "", $item['origin']['streamId']), 0, 200)); $orig_feed_data['title'] = db_escape_string(mb_substr($item['origin']['title'], 0, 200)); $orig_feed_data['site_url'] = db_escape_string(mb_substr($item['origin']['htmlUrl'], 0, 200)); } } $processed++; $imported += (int) $this->create_article($owner_uid, $guid, $title, $link, $updated, $content, $author, $sql_set_marked, $tags, $orig_feed_data, $last_marked); if ($file && $processed % 25 == 0) { _debug("processed {$processed} articles..."); } } if ($file) { _debug(sprintf("All done. %d of %d articles imported.", $imported, $processed)); } else { print "<p style='text-align : center'>" . T_sprintf("All done. %d out of %d articles imported.", $imported, $processed) . "</p>"; } } else { print_error(__('The document has incorrect format.')); } } else { print_error(__('Error while parsing document.')); } if (!$file) { print "<div align='center'>"; print "<button dojoType=\"dijit.form.Button\"\n\t\t\t\tonclick=\"dijit.byId('starredImportDlg').execute()\">" . __('Close this window') . "</button>"; print "</div>"; } }
function purge_old_posts($link) { $user_id = $_SESSION["uid"]; $result = db_query($link, "SELECT id,purge_interval FROM ttrss_feeds\n\t\t\tWHERE owner_uid = '{$user_id}'"); while ($line = db_fetch_assoc($result)) { $feed_id = $line["id"]; $purge_interval = $line["purge_interval"]; if ($purge_interval == 0) { $purge_interval = get_pref($link, 'PURGE_OLD_DAYS'); } if ($purge_interval > 0) { purge_feed($link, $feed_id, $purge_interval); } } purge_orphans($link); }