PHP生成随机端口,且排除一些特定端口

  •   
  • 5809
  • PHP
  • 0
  • super_dodo
  • 2013/09/10

在项目的实际使用中,常常会遇到需要随机生成一个数值或字符串,但是又需要排除其中一些特定的值(默认值或已使用的值)。
举例1:在分配服务器的端口的时候,默认可以分配0-65535(高并发的情况下请留意65535这个设定值,此值为默认值,可根据系统状况适当的调整。)再给一些服务器应用角色分配端口的时候,需要随机生成一个端口号(鉴于安全性),但是常用的端口号需要排除,比如web服务的80端口,mysql的3306....
实现方法如下:

//计算机端口 - 1.系统保留端口(从0到1023) -2.动态端口(从1024到65535)
//直接生成一个数组
$ports_arr =  range(1024,65535);						
//受保护的端口,不能再生成使用
$privite_arr = array(3306,3389,8080,11211);				
//可用的端口数组
$enable_arr = array_diff($ports_arr, $privite_arr);		

//如果表里面已经存在了一些端口了,这时你还需要排除已使用的端口
//查询出已使用的端口 used_arr 去重(可滤过) used_arr = array_unique(used_arr);
//再和$enable_arr进行一次array_diff

//在可用的中间随机生成一个
$port_key = array_rand($enable_arr);
//array_rand() 函数从数组中随机选出一个或多个元素,并返回。第二个参数用来确定要选出几个元素。
//如果选出的元素不止一个,则返回包含随机键名的数组,否则返回该元素的键名。					
echo $post_key;
echo $enable_arr[$port_key];

补充说明,使用mt_rand能更高效的生成一个随机数,且返回值为该值.$random_number = mt_rand(1, 100);(待改进)

举例2:在权限控制的时候,系统需要默认给用户访问验证码,用户登陆页面,错误信息页面等的访问权限,该步骤先先给大家阐述一下思路,具体实现留作课后作业,今天教师节。

// 全站权限检测
protected function allowedAccess($access) {
	$allows = array('Site.Login','Site.Error','Site.Logout','Site.Captcha','Site.Index');
	return in_array($access, $allows);
}

//  检测权限
protected function beforeAction($action) {
	$access = $this->getAccess();
	//得到入口,如果不需要检测的$this->allowedAccess($access) 返回值为真 取反为假不执行if中语句
	if(!$this->allowedAccess($access)){
		//code进行检测
	}
	//通过检测
}

《无题》--李商隐

相见时难别亦难,东风无力百花残。春蚕到死丝方尽,蜡炬成灰泪始干。

晓镜但愁云鬓改,夜吟应觉月光寒。蓬山此去无多路,青鸟殷勤为探看。