static function ForkActions($func = false, $args = array()) { if (!defined("BX_FORK_AGENTS_AND_EVENTS_FUNCTION") || !function_exists(BX_FORK_AGENTS_AND_EVENTS_FUNCTION) || !function_exists("getmypid") || !function_exists("posix_kill")) { return false; } //Avoid to recurse itself if (defined("BX_FORK_AGENTS_AND_EVENTS_FUNCTION_STARTED")) { return false; } //Register function to execute in forked process if ($func !== false) { self::$forkActions[] = array($func, $args); return true; } //There is nothing to do if (empty(self::$forkActions)) { return true; } //Release session session_write_close(); $func = BX_FORK_AGENTS_AND_EVENTS_FUNCTION; $pid = $func(); //Parent just exits. if ($pid > 0) { return false; } //Fork was successfull let's do seppuku on shutdown if ($pid == 0) { register_shutdown_function(create_function('', 'posix_kill(getmypid(), 9);')); } //Mark start of execution // define("BX_FORK_AGENTS_AND_EVENTS_FUNCTION_STARTED", true); global $DB, $CACHE_MANAGER; $CACHE_MANAGER = new CCacheManager(); $DBHost = $DB->DBHost; $DBName = $DB->DBName; $DBLogin = $DB->DBLogin; $DBPassword = $DB->DBPassword; $DB = new CDatabase(); $DB->Connect($DBHost, $DBName, $DBLogin, $DBPassword); $app = \Bitrix\Main\Application::getInstance(); if ($app != null) { $con = $app->getConnection(); if ($con != null) { $con->connect(); } } $DB->DoConnect(); $DB->StartUsingMasterOnly(); foreach (self::$forkActions as $action) { call_user_func_array($action[0], $action[1]); } $DB->Disconnect(); $CACHE_MANAGER->_Finalize(); return null; }