From 95c5b9e1a83364ed431ca3adae49e038538cd545 Mon Sep 17 00:00:00 2001 From: Botanic Date: Wed, 23 Oct 2013 15:26:36 -0700 Subject: [PATCH] added fork on linux as well as implimented pid file to check for other running crons --HG-- branch : rc-botanic-webdev --- .../ryzom_ams/ams_lib/autoload/sync.php | 111 ++++++++++-------- 1 file changed, 64 insertions(+), 47 deletions(-) diff --git a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/sync.php b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/sync.php index c41985cfc..0a223bc48 100644 --- a/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/sync.php +++ b/code/ryzom/tools/server/ryzom_ams/ams_lib/autoload/sync.php @@ -14,58 +14,75 @@ class Sync{ * These changes are: createPermissions, createUser, change_pass, change_mail */ static public function syncdata ($display = true) { - - try { - $dbl = new DBLayer("lib"); - $statement = $dbl->executeWithoutParams("SELECT * FROM ams_querycache"); - $rows = $statement->fetchAll(); - foreach ($rows as $record) { + + if (function_exists('pcntl_fork')) { + $pid = pcntl_fork(); + } + $pidfile = '/tmp/ams_cron_pid'; + if(isset($pid)) { + // We're the main process. + } else { + if(!file_exists($pidfile)) { + $pid = getmypid(); + $file = fopen($pidfile, 'w'); - $db = new DBLayer($record['db']); - switch($record['type']) { - case 'createPermissions': - $decode = json_decode($record['query']); - $values = array('username' => $decode[0]); - //make connection with and put into shard db & delete from the lib - $sth = $db->execute("SELECT UId FROM user WHERE Login= :username;", $values); - $result = $sth->fetchAll(); - foreach ($result as $UId) { - $ins_values = array('id' => $UId['UId']); - $db->execute("INSERT INTO permission (UId, ClientApplication, AccessPrivilege) VALUES (:id, 'r2', 'OPEN');", $ins_values); - $db->execute("INSERT INTO permission (UId, ClientApplication, AccessPrivilege) VALUES (:id , 'ryzom_open', 'OPEN');", $ins_values); - } - break; - case 'change_pass': - $decode = json_decode($record['query']); - $values = array('user' => $decode[0], 'pass' => $decode[1]); - //make connection with and put into shard db & delete from the lib - $db->execute("UPDATE user SET Password = :pass WHERE Login = :user",$values); - break; - case 'change_mail': - $decode = json_decode($record['query']); - $values = array('user' => $decode[0], 'mail' => $decode[1]); - //make connection with and put into shard db & delete from the lib - $db->execute("UPDATE user SET Email = :mail WHERE Login = :user",$values); - break; - case 'createUser': - $decode = json_decode($record['query']); - $values = array('login' => $decode[0], 'pass' => $decode[1], 'mail' => $decode[2] ); - //make connection with and put into shard db & delete from the lib - $db->execute("INSERT INTO user (Login, Password, Email) VALUES (:login, :pass, :mail)",$values); - break; + fwrite($file, $pid); + fclose($file); + + try { + $dbl = new DBLayer("lib"); + $statement = $dbl->executeWithoutParams("SELECT * FROM ams_querycache"); + $rows = $statement->fetchAll(); + foreach ($rows as $record) { + + $db = new DBLayer($record['db']); + switch($record['type']) { + case 'createPermissions': + $decode = json_decode($record['query']); + $values = array('username' => $decode[0]); + //make connection with and put into shard db & delete from the lib + $sth = $db->execute("SELECT UId FROM user WHERE Login= :username;", $values); + $result = $sth->fetchAll(); + foreach ($result as $UId) { + $ins_values = array('id' => $UId['UId']); + $db->execute("INSERT INTO permission (UId, ClientApplication, AccessPrivilege) VALUES (:id, 'r2', 'OPEN');", $ins_values); + $db->execute("INSERT INTO permission (UId, ClientApplication, AccessPrivilege) VALUES (:id , 'ryzom_open', 'OPEN');", $ins_values); + } + break; + case 'change_pass': + $decode = json_decode($record['query']); + $values = array('user' => $decode[0], 'pass' => $decode[1]); + //make connection with and put into shard db & delete from the lib + $db->execute("UPDATE user SET Password = :pass WHERE Login = :user",$values); + break; + case 'change_mail': + $decode = json_decode($record['query']); + $values = array('user' => $decode[0], 'mail' => $decode[1]); + //make connection with and put into shard db & delete from the lib + $db->execute("UPDATE user SET Email = :mail WHERE Login = :user",$values); + break; + case 'createUser': + $decode = json_decode($record['query']); + $values = array('login' => $decode[0], 'pass' => $decode[1], 'mail' => $decode[2] ); + //make connection with and put into shard db & delete from the lib + $db->execute("INSERT INTO user (Login, Password, Email) VALUES (:login, :pass, :mail)",$values); + break; + } + $dbl->execute("DELETE FROM ams_querycache WHERE SID=:SID",array('SID' => $record['SID'])); + } + if ($display == true) { + print('Syncing completed'); } - $dbl->execute("DELETE FROM ams_querycache WHERE SID=:SID",array('SID' => $record['SID'])); } - if ($display == true) { - print('Syncing completed'); - } - } - catch (PDOException $e) { - if ($display == true) { - print('Something went wrong! The shard is probably still offline!'); - print_r($e); + catch (PDOException $e) { + if ($display == true) { + print('Something went wrong! The shard is probably still offline!'); + print_r($e); + } } + unlink($pidfile); } } + } }