📄 remote.php
字号:
<?php/** * PEAR_Remote * * PHP versions 4 and 5 * * LICENSE: This source file is subject to version 3.0 of the PHP license * that is available through the world-wide-web at the following URI: * http://www.php.net/license/3_0.txt. If you did not receive a copy of * the PHP License and are unable to obtain it through the web, please * send a note to license@php.net so we can mail you a copy immediately. * * @category pear * @package PEAR * @author Stig Bakken <ssb@php.net> * @author Greg Beaver <cellog@php.net> * @copyright 1997-2005 The PHP Group * @license http://www.php.net/license/3_0.txt PHP License 3.0 * @version CVS: $Id: Remote.php,v 1.34.2.15.2.3 2006/05/22 10:19:33 cellog Exp $ * @link http://pear.php.net/package/PEAR * @since File available since Release 0.1 *//** * needed for PEAR_Error */require_once 'PEAR.php';require_once 'PEAR/Config.php';/** * This is a class for doing remote operations against the central * PEAR database. * * @nodep XML_RPC_Value * @nodep XML_RPC_Message * @nodep XML_RPC_Client * @category pear * @package PEAR * @author Stig Bakken <ssb@php.net> * @author Greg Beaver <cellog@php.net> * @copyright 1997-2005 The PHP Group * @license http://www.php.net/license/3_0.txt PHP License 3.0 * @version Release: @package_version@ * @link http://pear.php.net/package/PEAR * @since Class available since Release 0.1 */class PEAR_Remote extends PEAR{ // {{{ properties var $config = null; var $cache = null; /** * @var PEAR_Registry * @access private */ var $_registry; // }}} // {{{ PEAR_Remote(config_object) function PEAR_Remote(&$config) { $this->PEAR(); $this->config = &$config; $this->_registry = &$this->config->getRegistry(); } // }}} // {{{ setRegistry() function setRegistry(&$reg) { $this->_registry = &$reg; } // }}} // {{{ getCache() function getCache($args) { $id = md5(serialize($args)); $cachedir = $this->config->get('cache_dir'); $filename = $cachedir . DIRECTORY_SEPARATOR . 'xmlrpc_cache_' . $id; if (!file_exists($filename)) { return null; } $fp = fopen($filename, 'rb'); if (!$fp) { return null; } if (function_exists('file_get_contents')) { fclose($fp); $content = file_get_contents($filename); } else { $content = fread($fp, filesize($filename)); fclose($fp); } $result = array( 'age' => time() - filemtime($filename), 'lastChange' => filemtime($filename), 'content' => unserialize($content), ); return $result; } // }}} // {{{ saveCache() function saveCache($args, $data) { $id = md5(serialize($args)); $cachedir = $this->config->get('cache_dir'); if (!file_exists($cachedir)) { System::mkdir(array('-p', $cachedir)); } $filename = $cachedir.'/xmlrpc_cache_'.$id; $fp = @fopen($filename, "wb"); if ($fp) { fwrite($fp, serialize($data)); fclose($fp); } } // }}} // {{{ clearCache() function clearCache($method, $args) { array_unshift($args, $method); array_unshift($args, $this->config->get('default_channel')); // cache by channel $id = md5(serialize($args)); $cachedir = $this->config->get('cache_dir'); $filename = $cachedir.'/xmlrpc_cache_'.$id; if (file_exists($filename)) { @unlink($filename); } } // }}} // {{{ call(method, [args...]) function call($method) { $_args = $args = func_get_args(); $server_channel = $this->config->get('default_channel'); $channel = $this->_registry->getChannel($server_channel); if (!PEAR::isError($channel)) { $mirror = $this->config->get('preferred_mirror'); if ($channel->getMirror($mirror)) { if ($channel->supports('xmlrpc', $method, $mirror)) { $server_channel = $server_host = $mirror; // use the preferred mirror $server_port = $channel->getPort($mirror); } elseif (!$channel->supports('xmlrpc', $method)) { return $this->raiseError("Channel $server_channel does not " . "support xml-rpc method $method"); } } if (!isset($server_host)) { if (!$channel->supports('xmlrpc', $method)) { return $this->raiseError("Channel $server_channel does not support " . "xml-rpc method $method"); } else { $server_host = $server_channel; $server_port = $channel->getPort(); } } } else { return $this->raiseError("Unknown channel '$server_channel'"); } array_unshift($_args, $server_channel); // cache by channel $this->cache = $this->getCache($_args); $cachettl = $this->config->get('cache_ttl'); // If cache is newer than $cachettl seconds, we use the cache! if ($this->cache !== null && $this->cache['age'] < $cachettl) { return $this->cache['content']; } if (extension_loaded("xmlrpc")) { $result = call_user_func_array(array(&$this, 'call_epi'), $args); if (!PEAR::isError($result)) { $this->saveCache($_args, $result); } return $result; } elseif (!@include_once 'XML/RPC.php') { return $this->raiseError("For this remote PEAR operation you need to load the xmlrpc extension or install XML_RPC"); } array_shift($args); $username = $this->config->get('username'); $password = $this->config->get('password'); $eargs = array(); foreach($args as $arg) { $eargs[] = $this->_encode($arg); } $f = new XML_RPC_Message($method, $eargs); if ($this->cache !== null) { $maxAge = '?maxAge='.$this->cache['lastChange']; } else { $maxAge = ''; } $proxy_host = $proxy_port = $proxy_user = $proxy_pass = ''; if ($proxy = parse_url($this->config->get('http_proxy'))) { $proxy_host = @$proxy['host']; if (isset($proxy['scheme']) && $proxy['scheme'] == 'https') { $proxy_host = 'https://' . $proxy_host; } $proxy_port = @$proxy['port']; $proxy_user = @urldecode(@$proxy['user']); $proxy_pass = @urldecode(@$proxy['pass']); } $shost = $server_host; if ($channel->getSSL()) { $shost = "https://$shost"; } $c = new XML_RPC_Client('/' . $channel->getPath('xmlrpc') . $maxAge, $shost, $server_port, $proxy_host, $proxy_port, $proxy_user, $proxy_pass); if ($username && $password) { $c->setCredentials($username, $password); } if ($this->config->get('verbose') >= 3) { $c->setDebug(1); } $r = $c->send($f); if (!$r) { return $this->raiseError("XML_RPC send failed"); } $v = $r->value(); if ($e = $r->faultCode()) { if ($e == $GLOBALS['XML_RPC_err']['http_error'] && strstr($r->faultString(), '304 Not Modified') !== false) { return $this->cache['content']; } return $this->raiseError($r->faultString(), $e); } $result = XML_RPC_decode($v); $this->saveCache($_args, $result); return $result; } // }}} // {{{ call_epi(method, [args...]) function call_epi($method) { do { if (extension_loaded("xmlrpc")) { break; } if (OS_WINDOWS) { $ext = 'dll'; } elseif (PHP_OS == 'HP-UX') {
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -