%PDF- %PDF-
| Direktori : /home/bitrix/www/bitrix/modules/cluster/classes/general/ |
| Current File : /home/bitrix/www/bitrix/modules/cluster/classes/general/queue.php |
<?php
IncludeModuleLangFile(__FILE__);
class CClusterQueue
{
public static function Add($group_id, $command, $param1, $param2, $param3)
{
global $DB;
$sql_group_id = "'".intval($group_id)."'";
$sql_command = "'".$DB->ForSQL($command, 50)."'";
$sql_param1 = CClusterQueue::QuoteParam($param1);
$sql_param2 = CClusterQueue::QuoteParam($param2);
$sql_param3 = CClusterQueue::QuoteParam($param3);
$DB->StartUsingMasterOnly();
$DB->Query("
INSERT INTO b_cluster_queue (
TIMESTAMP_X, GROUP_ID, COMMAND, PARAM1, PARAM2, PARAM3
) values (
".$DB->CurrentTimeFunction().", ".$sql_group_id.", ".$sql_command.", ".$sql_param1.", ".$sql_param2.", ".$sql_param3."
)
");
$DB->StopUsingMasterOnly();
}
public static function QuoteParam($str)
{
global $DB;
if(is_bool($str))
return "'b:".($str === true? "t": "f")."'";
elseif(is_string($str))
return "'s:".$DB->ForSQL($str, 250)."'";
else
return "null";
}
public static function UnQuoteParam($str)
{
if(strlen($str) > 0)
{
$prefix = substr($str, 0, 2);
if($prefix === "s:")
return substr($str, 2);
if($prefix === "b:")
return substr($str, 2) === "t";
}
return null;
}
public 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 = CMain::GetServerUniqID()."_cluster_queue_".BX_CLUSTER_GROUP;
if (!empty($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();
}
}