<?php
/**
 * FT Story Cleanup (vBulletin Scheduled Task)
 */

if (!defined(&#039;VB_AREA&#039;))
{
	exit;
}
$db->query_write("
	INSERT INTO ft_story_cleanup_log
		(phase, note, dateline)
	VALUES
		(&#039;start&#039;, &#039;cron basladi&#039;, " . TIMENOW . ")
");

error_log(&#039;FT Story cleanup START &#039; . date(&#039;d-m-Y H:i:s&#039;));

global $vbulletin;
if (!is_object($vbulletin) || !is_object($vbulletin->db))
{
	// cron ortamı hazır değilse sessiz çık
	return;
}

$db  = $vbulletin->db;
$now = TIMENOW;

$limit = 200; // tek çalışmada kaç story temizlensin

$base = @realpath(DIR . &#039;/ft_story_uploads&#039;);

$deletedStories    = 0;
$deletedFiles      = 0;
$deletedViews      = 0;
$deletedMedia      = 0;
$deletedText       = 0;
$deletedReactions  = 0;
$deletedOrphans    = 0;

// expire olan story&#039;leri al
$res = $db->query_read("
	SELECT storyid
	FROM ft_story
	WHERE expiretime <= $now
	LIMIT $limit
");

$storyids = array();

while ($row = $db->fetch_array($res))
{
	$storyid = intval($row[&#039;storyid&#039;]);
	if ($storyid > 0)
	{
		$storyids[] = $storyid;
	}
}

if (!empty($storyids))
{
	$idlist = implode(&#039;,&#039;, $storyids);

	// Önce local dosya yollarını topla
	$mres = $db->query_read("
		SELECT storyid, filepath, thumbpath
		FROM ft_story_media
		WHERE storyid IN ($idlist)
	");

	$paths = array();

	while ($m = $db->fetch_array($mres))
	{
		if (!empty($m[&#039;filepath&#039;]))
		{
			$paths[] = $m[&#039;filepath&#039;];
		}
		if (!empty($m[&#039;thumbpath&#039;]))
		{
			$paths[] = $m[&#039;thumbpath&#039;];
		}
	}

	// Fiziksel dosyaları sil
	foreach ($paths as $rel)
	{
		$rel = ltrim((string)$rel, &#039;/&#039;);

		// sadece bizim klasör
		if (strpos($rel, &#039;ft_story_uploads/&#039;) !== 0)
		{
			continue;
		}

		$abs  = DIR . &#039;/&#039; . $rel;
		$real = @realpath($abs);

		if ($real && $base && strpos($real, $base) === 0 && file_exists($real))
		{
			if (@unlink($real))
			{
				$deletedFiles++;
			}
		}
	}

	// DB temizliği: önce bağlı tablolar
	$db->query_write("DELETE FROM ft_story_view WHERE storyid IN ($idlist)");
	$deletedViews += intval($db->affected_rows());

	$db->query_write("DELETE FROM ft_story_reaction WHERE storyid IN ($idlist)");
	$deletedReactions += intval($db->affected_rows());

	$db->query_write("DELETE FROM ft_story_text WHERE storyid IN ($idlist)");
	$deletedText += intval($db->affected_rows());

	$db->query_write("DELETE FROM ft_story_media WHERE storyid IN ($idlist)");
	$deletedMedia += intval($db->affected_rows());

	$db->query_write("DELETE FROM ft_story WHERE storyid IN ($idlist)");
	$deletedStories += intval($db->affected_rows());
}

/*
 * Orphan cleanup
 * Ana story kaydı silinmiş ama alt tablolarda yetim kayıt kalmışsa temizle
 */
$db->query_write("
	DELETE v
	FROM ft_story_view AS v
	LEFT JOIN ft_story AS s ON (s.storyid = v.storyid)
	WHERE s.storyid IS NULL
");
$deletedOrphans += intval($db->affected_rows());

$db->query_write("
	DELETE r
	FROM ft_story_reaction AS r
	LEFT JOIN ft_story AS s ON (s.storyid = r.storyid)
	WHERE s.storyid IS NULL
");
$deletedOrphans += intval($db->affected_rows());

$db->query_write("
	DELETE t
	FROM ft_story_text AS t
	LEFT JOIN ft_story AS s ON (s.storyid = t.storyid)
	WHERE s.storyid IS NULL
");
$deletedOrphans += intval($db->affected_rows());

$db->query_write("
	DELETE m
	FROM ft_story_media AS m
	LEFT JOIN ft_story AS s ON (s.storyid = m.storyid)
	WHERE s.storyid IS NULL
");
$deletedOrphans += intval($db->affected_rows());

if (function_exists(&#039;log_cron_action&#039;))
{
	log_cron_action(
		"FT Story cleanup: deleted_stories=$deletedStories deleted_files=$deletedFiles deleted_views=$deletedViews deleted_media=$deletedMedia deleted_text=$deletedText deleted_reactions=$deletedReactions deleted_orphans=$deletedOrphans",
		0
	);
}
/*Log dosyasına kaydetsin*/
if (function_exists(&#039;log_cron_action&#039;))
{
	log_cron_action(
		"FT Story cleanup: deleted_stories=$deletedStories deleted_files=$deletedFiles deleted_views=$deletedViews deleted_media=$deletedMedia deleted_text=$deletedText deleted_reactions=$deletedReactions deleted_orphans=$deletedOrphans",
		0
	);
}

error_log(
	"FT Story cleanup END: deleted_stories=$deletedStories deleted_files=$deletedFiles deleted_views=$deletedViews deleted_media=$deletedMedia deleted_text=$deletedText deleted_reactions=$deletedReactions deleted_orphans=$deletedOrphans"
);

file_put_contents(
	DIR . &#039;/ft_story_cleanup_test.log&#039;,
	date(&#039;d-m-Y H:i:s&#039;) . " | stories=$deletedStories | files=$deletedFiles | views=$deletedViews | media=$deletedMedia | text=$deletedText | reactions=$deletedReactions | orphans=$deletedOrphans\n",
	FILE_APPEND
);

/*DB&#039;ye yazdır*/
$db->query_write("
	INSERT INTO ft_story_cleanup_log
		(phase, note, dateline)
	VALUES
	(
		&#039;end&#039;,
		&#039;stories=$deletedStories files=$deletedFiles views=$deletedViews media=$deletedMedia text=$deletedText reactions=$deletedReactions orphans=$deletedOrphans&#039;,
		" . TIMENOW . "
	)
");

Add a code snippet to your website: www.paste.org