public function onPacket($p) { if ($p['op'] === 'spawnInstance') { $fullname = $p['appfullname']; $fullname = str_replace('-', ':', $fullname); if (strpos($fullname, ':') === false) { $fullname .= ':'; } list($app, $name) = explode(':', $fullname, 2); Daemon::$appResolver->appInstantiate($app, $name); } elseif ($p['op'] === 'importFile') { $path = $p['path']; Daemon_TimedEvent::add(function ($event) use($path) { $self = Daemon::$process; if (Daemon::supported(Daemon::SUPPORT_RUNKIT_IMPORT)) { runkit_import($path, RUNKIT_IMPORT_FUNCTIONS | RUNKIT_IMPORT_CLASSES | RUNKIT_IMPORT_OVERRIDE); } else { $this->appInstance->log('Cannot import \'' . $path . '\': runkit_import is not callable.'); } $event->finish(); }, 5); } elseif ($p['op'] === 'call') { if (strpos($p['appfullname'], '-') === false) { $p['appfullname'] .= '-'; } list($app, $name) = explode('-', $p['appfullname'], 2); if ($app = Daemon::$appResolver->getInstanceByAppName($app, $name)) { $app->RPCall($p['method'], $p['args']); } } }
/** * Overrides native PHP functions. * @return void */ public function overrideNativeFuncs() { if (Daemon::supported(Daemon::SUPPORT_RUNKIT_INTERNAL_MODIFY)) { runkit_function_rename('header', 'header_native'); function header() { if (Daemon::$req && Daemon::$req instanceof HTTPRequest) { return call_user_func_array(array(Daemon::$req, 'header'), func_get_args()); } } runkit_function_rename('is_uploaded_file', 'is_uploaded_file_native'); function is_uploaded_file() { if (Daemon::$req && Daemon::$req instanceof HTTPRequest) { return call_user_func_array(array(Daemon::$req, 'isUploadedFile'), func_get_args()); } } runkit_function_rename('move_uploaded_file', 'move_uploaded_file_native'); function move_uploaded_file() { if (Daemon::$req && Daemon::$req instanceof HTTPRequest) { return call_user_func_array(array(Daemon::$req, 'moveUploadedFile'), func_get_args()); } } runkit_function_rename('headers_sent', 'headers_sent_native'); function headers_sent() { if (Daemon::$req && Daemon::$req instanceof HTTPRequest) { return Daemon::$req->headers_sent(); } } runkit_function_rename('headers_list', 'headers_list_native'); function headers_list() { if (Daemon::$req && Daemon::$req instanceof HTTPRequest) { return Daemon::$req->headers_list(); } } runkit_function_rename('setcookie', 'setcookie_native'); function setcookie() { if (Daemon::$req && Daemon::$req instanceof HTTPRequest) { return call_user_func_array(array(Daemon::$req, 'setcookie'), func_get_args()); } } register_shutdown_function(array($this, 'shutdown')); runkit_function_rename('register_shutdown_function', 'register_shutdown_function_native'); function register_shutdown_function($cb) { if (Daemon::$req) { return Daemon::$req->registerShutdownFunction($cb); } } runkit_function_copy('create_function', 'create_function_native'); runkit_function_redefine('create_function', '$arg,$body', 'return __create_function($arg,$body);'); function __create_function($arg, $body) { static $cache = array(); static $maxCacheSize = 64; static $sorter; if ($sorter === NULL) { $sorter = function ($a, $b) { if ($a->hits == $b->hits) { return 0; } return $a->hits < $b->hits ? 1 : -1; }; } $crc = crc32($arg . "" . $body); if (isset($cache[$crc])) { ++$cache[$crc][1]; return $cache[$crc][0]; } if (sizeof($cache) >= $maxCacheSize) { uasort($cache, $sorter); array_pop($cache); } $cache[$crc] = array($cb = eval('return function(' . $arg . '){' . $body . '};'), 0); return $cb; } } }