【亚洲必赢娱乐第一平台】Linux下为RPM方式安装的PHP添加GD库支持,PHP实现的一致性哈希算法完整实例_php技巧_脚本之家

 target, ... } * @comment 位置对应节点,用于lookup中根据位置确定要访问的节点 */ private $_positionToTarget = array(); /** * Internal map of targets to lists of positions that target is hashed to. * @var array { target => [ position, position, ... ], ... } * @comment 节点对应位置,用于删除节点 */ private $_targetToPositions = array(); /** * Whether the internal map of positions to targets is already sorted. * @var boolean * @comment 是否已排序 */ private $_positionToTargetSorted = false; /** * Constructor * @param object $hasher Flexihash_Hasher * @param int $replicas Amount of positions to hash each target to. * @comment 构造函数,确定要使用的hash方法和需拟节点数,虚拟节点数越多,分布越均匀,但程序的分布式运算越慢 */ public function __construct(Flexihash_Hasher $hasher = null, $replicas = null) { $this->_hasher = $hasher ? $hasher : new Flexihash_Crc32Hasher(); if  $this->_replicas = $replicas; } /** * Add a target. * @param string $target * @chainable * @comment 添加节点,根据虚拟节点数,将节点分布到多个虚拟位置上 */ public function addTarget { if (isset($this->_targetToPositions[$target])) { throw new Flexihash_Exception("Target '$target' already exists."); } $this->_targetToPositions[$target] = array(); // hash the target into multiple positions for ($i = 0; $i < $this->_replicas; $i++) { $position = $this->_hasher->hash; $this->_positionToTarget[$position] = $target; // lookup $this->_targetToPositions[$target] []= $position; // target removal } $this->_positionToTargetSorted = false; $this->_targetCount++; return $this; } /** * Add a list of targets. * @param array $targets * @chainable */ public function addTargets { foreach  { $this->addTarget; } return $this; } /** * Remove a target. * @param string $target * @chainable */ public function removeTarget { if (!isset($this->_targetToPositions[$target])) { throw new Flexihash_Exception("Target '$target' does not exist."); } foreach ($this->_targetToPositions[$target] as $position) { unset($this->_positionToTarget[$position]); } unset($this->_targetToPositions[$target]); $this->_targetCount--; return $this; } /** * A list of all potential targets * @return array */ public function getAllTargets() { return array_keys($this->_targetToPositions); } /** * Looks up the target for the given resource. * @param string $resource * @return string */ public function lookup { $targets = $this->lookupList; if  throw new Flexihash_Exception; return $targets[0]; } /** * Get a list of targets for the resource, in order of precedence. * Up to $requestedCount targets are returned, less if there are fewer in total. * * @param string $resource * @param int $requestedCount The length of the list to return * @return array List of targets * @comment 查找当前的资源对应的节点, * 节点为空则返回空,节点只有一个则返回该节点, * 对当前资源进行hash,对所有的位置进行排序,在有序的位置列上寻找当前资源的位置 * 当全部没有找到的时候,将资源的位置确定为有序位置的第一个 * 返回所找到的节点 */ public function lookupList($resource, $requestedCount) { if  throw new Flexihash_Exception('Invalid count requested'); // handle no targets if (empty($this->_positionToTarget)) return array(); // optimize single target if ($this->_targetCount == 1) return array_unique(array_values($this->_positionToTarget)); // hash resource to a position $resourcePosition = $this->_hasher->hash; $results = array(); $collect = false; $this->_sortPositionTargets(); // search values above the resourcePosition foreach ($this->_positionToTarget as $key => $value) { // start collecting targets after passing resource position if (!$collect && $key > $resourcePosition) { $collect = true; } // only collect the first instance of any target if ($collect && !in_array { $results []= $value; } // return when enough results, or list exhausted if  == $requestedCount || count == $this->_targetCount) { return $results; } } // loop to start - search values below the resourcePosition foreach ($this->_positionToTarget as $key => $value) { if (!in_array { $results []= $value; } // return when enough results, or list exhausted if  == $requestedCount || count == $this->_targetCount) { return $results; } } // return results after iterating through both "parts" return $results; } public function __toString() { return sprintf( '%s{targets:[%s]}', get_class, implode(',', $this->getAllTargets; } // ---------------------------------------- // private methods /** * Sorts the internal mapping  by position */ private function _sortPositionTargets() { // sort by key  if not already if (!$this->_positionToTargetSorted) { ksort($this->_positionToTarget, SORT_REGULAR); $this->_positionToTargetSorted = true; } }}/** * Hashes given values into a sortable fixed size address space. * * @author Paul Annesley * @package Flexihash * @licence http://www.opensource.org/licenses/mit-license.php */interface Flexihash_Hasher{ /** * Hashes the given string into a 32bit address space. * * Note that the output may be more than 32bits of raw data, for example * hexidecimal characters representing a 32bit value. * * The data must have 0xFFFFFFFF possible values, and be sortable by * PHP sort functions using SORT_REGULAR. * * @param string * @return mixed A sortable format with 0xFFFFFFFF possible values */ public function hash;}/** * Uses CRC32 to hash a value into a signed 32bit int address space. * Under 32bit PHP this  overflows into negatives ints. * * @author Paul Annesley * @package Flexihash * @licence http://www.opensource.org/licenses/mit-license.php */class Flexihash_Crc32Hasher implements Flexihash_Hasher{ /*  * @see Flexihash_Hasher::hash() */ public function hash { return crc32; }}/** * Uses CRC32 to hash a value into a 32bit binary string data address space. * * @author Paul Annesley * @package Flexihash * @licence http://www.opensource.org/licenses/mit-license.php */class Flexihash_Md5Hasher implements Flexihash_Hasher{ /*  * @see Flexihash_Hasher::hash() */ public function hash { return substr; // 8 hexits = 32bit // 4 bytes of binary md5 data could also be used, but // performance seems to be the same. }}/** * An exception thrown by Flexihash. * * @author Paul Annesley * @package Flexihash * @licence http://www.opensource.org/licenses/mit-license.php */class Flexihash_Exception extends Exception{}

最近遇到一台装有Fedora Core 5.0 Linux操作系统的服务器,原来安装的Apache
2.0、PHP
5.1.2不支持GD库,PHP网页中用GD库生成的验证码图片、统计图都无法显示。我试过在此基础上安装PHP-gd-5.1.2-5.i386.rpm包后还是不行。于是,想到了先卸载已安装PHP的所有RPM包,再重装PHP的方法。于是动手尝试,问题解决。
  
  一、在/var目录下新建一个临时目录PHP,将Fedora
Core
5.0第2~5张光盘RPM目录中,以“PHP-”开头的RPM文件复制到/var/PHP目录中;
  
  二、在终端中执行以下命令(红字部分):
  1、查看已安装的PHP有哪些RPM包:
  [root@smis ~]# rpm -qa|grep
PHP
  PHP-pear-1.4.6-2
  PHP-5.1.2-5
  PHP-gd-5.1.2-5
  PHP-ldap-5.1.2-5
  
  2、卸载用上述命令查看后列出的RPM包:
  [root@smis ~]# rpm -e
PHP-pear-1.4.6-2
PHP-5.1.2-5
PHP-gd-5.1.2-5
PHP-ldap-5.1.2-5
  
  3、进入/var/PHP目录:
  [root@smis ~]# cd
/var/PHP
  
  4、列出/var/PHP目录下的文件:
  [root@smis PHP]# ls
  PHP-5.1.2-5.i386.rpm          
PHP-ncurses-5.1.2-5.i386.rpm
  PHP-bcmath-5.1.2-5.i386.rpm  
 PHP-odbc-5.1.2-5.i386.rpm
  PHP-dba-5.1.2-5.i386.rpm      
PHP-pdo-5.1.2-5.i386.rpm
  PHP-devel-5.1.2-5.i386.rpm    
PHP-pear-1.4.6-2.noarch.rpm
  PHP-gd-5.1.2-5.i386.rpm      
 PHP-pgsql-5.1.2-5.i386.rpm
  PHP-imap-5.1.2-5.i386.rpm    
 PHP-snmp-5.1.2-5.i386.rpm
  PHP-ldap-5.1.2-5.i386.rpm    
 PHP-soap-5.1.2-5.i386.rpm
  PHP-mbstring-5.1.2-5.i386.rpm
 PHP-xml-5.1.2-5.i386.rpm
  PHP-mysql-5.1.2-5.i386.rpm    
PHP-xmlrpc-5.1.2-5.i386.rpm
  
  5、安装你需要的组件的RPM包:
  [root@smis PHP]# rpm -ivh
PHP-5.1.2-5.i386.rpm
PHP-ncurses-5.1.2-5.i386.rpm
PHP-bcmath-5.1.2-5.i386.rpm
PHP-odbc-5.1.2-5.i386.rpm
PHP-dba-5.1.2-5.i386.rpm
PHP-pdo-5.1.2-5.i386.rpm
PHP-devel-5.1.2-5.i386.rpm
PHP-pear-1.4.6-2.noarch.rpm
PHP-gd-5.1.2-5.i386.rpm
PHP-pgsql-5.1.2-5.i386.rpm
PHP-snmp-5.1.2-5.i386.rpm
PHP-ldap-5.1.2-5.i386.rpm
PHP-soap-5.1.2-5.i386.rpm
PHP-mbstring-5.1.2-5.i386.rpm
PHP-xml-5.1.2-5.i386.rpm
PHP-mysql-5.1.2-5.i386.rpm
PHP-xmlrpc-5.1.2-5.i386.rpm
  warning: PHP-5.1.2-5.i386.rpm: Header V3
DSA signature: NOKEY, key ID 4f2a6fd2
  Preparing…              
 ###########################################
[100%]
     1:PHP                  
 ###########################################
[  6%]
     2:PHP-pdo              
 ###########################################
[ 12%]
     3:PHP-ncurses          
 ###########################################
[ 18%]
     4:PHP-bcmath            
###########################################
[ 24%]
     5:PHP-odbc              
###########################################
[ 29%]
     6:PHP-dba              
 ###########################################
[ 35%]
     7:PHP-devel            
 ###########################################
[ 41%]
     8:PHP-pear              
###########################################
[ 47%]
     9:PHP-gd                
###########################################
[ 53%]
    10:PHP-pgsql            
 ###########################################
[ 59%]
    11:PHP-snmp              
###########################################
[ 65%]
    12:PHP-ldap              
###########################################
[ 71%]
    13:PHP-soap              
###########################################
[ 76%]
    14:PHP-mbstring          
###########################################
[ 82%]
    15:PHP-xml              
 ###########################################
[ 88%]
    16:PHP-mysql            
 ###########################################
[ 94%]
    17:PHP-xmlrpc            
###########################################
[100%]
  
  6、重新启动Apache服务:
  [root@smis PHP]# service httpd restart
  停止 httpd:                                              
[确定]
  启动 httpd:                                              
[确定]
  
  7、完毕。

希望本文所述对大家PHP程序设计有所帮助。

发表评论

电子邮件地址不会被公开。 必填项已用*标注