• Модуль: cluster
  • Путь к файлу: ~/bitrix/modules/cluster/classes/general/queue.php
  • Класс: CClusterQueue
  • Вызов: CClusterQueue::Run
static function Run()
{
	global $DB;
	$DB->StartUsingMasterOnly();
	do
	{
		//read data
		$ids = array();
		$queue = array();
		$rs = $DB->Query($DB->TopSql("
			SELECT *
			FROM b_cluster_queue
			WHERE GROUP_ID = ".BX_CLUSTER_GROUP."
			ORDER BY ID
		", 100));
		while ($ar = $rs->Fetch())
		{
			$queueKey = $ar["COMMAND"]."|".$ar["PARAM1"]."|".$ar["PARAM2"]."|".$ar["PARAM3"];
			$queue[$queueKey] = $ar;
			$ids[] = intval($ar["ID"]);
		}

		$uid = $DB->DBName."_cluster_queue_".BX_CLUSTER_GROUP;

		if ($ids)
		{
			$lock = $DB->Query("SELECT GET_LOCK('".$uid."', 0) as L")->Fetch();
			if ($lock["L"] == "0")
			{
				$DB->StopUsingMasterOnly();
				return false;
			}
		}

		//clean cache
		foreach ($queue as $ar)
		{
			$class_name = $ar["COMMAND"];
			if (class_exists($class_name))
			{
				$object = new $class_name;
				$object->QueueRun(
					CClusterQueue::UnQuoteParam($ar["PARAM1"]),
					CClusterQueue::UnQuoteParam($ar["PARAM2"]),
					CClusterQueue::UnQuoteParam($ar["PARAM3"])
				);
			}
		}

		//mark as done
		if ($ids)
		{
			$DB->Query("DELETE FROM b_cluster_queue WHERE ID in (".implode(",", $ids).")");
			$DB->Query("SELECT RELEASE_LOCK('".$uid."')");
		}
	}
	while ($queue);
	$DB->StopUsingMasterOnly();
}