存档

‘php学习’ 分类的存档

vpp 2019 funding 申请

2020年4月7日 没有评论

1,linux实现按秒执行php脚本,实现高可用脚本调用
2,用户上传目录,实现单个文件夹下图片根据指定最大数量来自动生成下一个目录,提高io瓶颈
3,实现https加密,提高网站安全性
4,优化店铺评分系统(wilson算法)
5,去年服务器有一次攻击,优化了系统中存在的高危漏洞
6,实现百万数据库模糊搜索百毫秒反应
7,实现用户上传图片临时和正式目录分离
8,对mysql日志进行分析,监控慢查询sql匹配以进行优化
9,实现服务器内存监控,对于异常情况及时报警
10,linux脚本实现nginx软件平滑升级
11,实现mysql主从同步和读写分离(我们没做,但是可以贴代码)
12,去年实现的其它有技术含量的(还在通过qq记录整理中)

php自动裁剪图片,根据指定大小裁剪居中缩略图

2020年3月12日 没有评论
function image_center_crop($source,$target,$width,$height,$quality=100){
		if(!is_file($source)) {return false;}
		/* 根据类型载入图像 */
		switch(exif_imagetype($source)){
			case IMAGETYPE_JPEG:$image=imagecreatefromjpeg($source);break;
			case IMAGETYPE_PNG:$image=imagecreatefrompng($source);break;
			case IMAGETYPE_GIF:$image=imagecreatefromgif($source);break;
		}
		if(!isset($image)) {return false;}
		/* 获取图像尺寸信息 */
		$target_w=$width;
		$target_h=$height;
		$source_w=imagesx($image);
		$source_h=imagesy($image);
		/* 计算裁剪宽度和高度 */
		$judge=(($source_w/$source_h)>($target_w/$target_h));
		$resize_w=$judge?($source_w * $target_h)/$source_h:$target_w;
		$resize_h=!$judge?($source_h * $target_w)/$source_w:$target_h;
		$start_x=$judge?($resize_w-$target_w)/2:0;
		$start_y=!$judge?($resize_h-$target_h)/2:0;
		
		/* 绘制居中缩放图像 */
		$resize_img=imagecreatetruecolor($resize_w,$resize_h);
		imagecopyresampled($resize_img,$image, 0, 0, 0, 0,$resize_w,$resize_h,$source_w,$source_h);
		$target_img=imagecreatetruecolor($target_w,$target_h);
		imagecopy($target_img,$resize_img, 0, 0,$start_x,$start_y,$resize_w,$resize_h);
		/* 将图片保存至文件 */
		if(!file_exists(dirname($target))) mkdir(dirname($target),0777,true);
		imagejpeg($target_img,$target,$quality);
		return is_file($target);
	}

以上php代码可以实现php自动裁剪图片,根据指定大小裁剪居中缩略图。

分类: php学习 标签: , ,

php根据传递指定字符串,返回utf-8模式下的拆分字符串(具体效果请体验)

2020年2月25日 没有评论
/*
传递指定字符串,返回utf-8模式下的拆分字符串(具体效果请体验)
$split_len根据几个字符来拆分
$lowerStr是否需要返回转小写的str
$returnStrLen是否需要返回拆分之后的每个字符长度(以utf-8计算)
*/
function myImplodeStr($str,$split_len=1,$lowerStr=true,$returnStrLen=true){
	$str=str_replace(' ','',$str);
	if(!$str){return array();}
	$len=mb_strlen($str,'UTF-8');
	if($len<=$split_len) {return array($str);}
	else {
		$returnArr=array();
		/*方法1*/
		for($i=0;$i<$len;$i++){
			$s=mb_substr($str,$i,$len-$i,'UTF-8');
			if($returnStrLen){$returnArr[]=array($lowerStr?strtolower($s):$s,mb_strlen($s,'UTF-8'));}
			else {$returnArr[]=$lowerStr?strtolower($s):$s;}
		}
		/*方法2
		如果返回数组不计算字符utf-8模式下的长度,在单次或多次执行函数的情况下,方法1比方法2效率要高
		当超过1000次执行后,方法2效率高(方法1使用了mb_strlen($s,'UTF-8'))
		preg_match_all('/.{'.$split_len.'}|[^\x00]{1,'.$split_len.'}$/us',$str,$arr);
		$len=count($arr[0]);
		for($i=0;$i<$len;$i++){
			$tempStr='';
			$s_len=0;
			for($m=$i;$m<$len;$m++){
				$tempStr.=$lowerStr?strtolower($arr[0][$m]):$arr[0][$m];
				$s_len++;
			}
			if($returnStrLen){$returnArr[]=array($tempStr,$s_len);}
			else {$returnArr[]=$tempStr;}
		}
		*/
		return $returnArr;
	}
}
echo '<pre>';
var_dump(myImplodeStr('湖北:联保联供 守好百姓"菜篮子"',1,true,false));

执行效果:
array(16) {
  [0]=>
  string(42) "湖北:联保联供守好百姓"菜篮子""
  [1]=>
  string(39) "北:联保联供守好百姓"菜篮子""
  [2]=>
  string(36) ":联保联供守好百姓"菜篮子""
  [3]=>
  string(35) "联保联供守好百姓"菜篮子""
  [4]=>
  string(32) "保联供守好百姓"菜篮子""
  [5]=>
  string(29) "联供守好百姓"菜篮子""
  [6]=>
  string(26) "供守好百姓"菜篮子""
  [7]=>
  string(23) "守好百姓"菜篮子""
  [8]=>
  string(20) "好百姓"菜篮子""
  [9]=>
  string(17) "百姓"菜篮子""
  [10]=>
  string(14) "姓"菜篮子""
  [11]=>
  string(11) ""菜篮子""
  [12]=>
  string(10) "菜篮子""
  [13]=>
  string(7) "篮子""
  [14]=>
  string(4) "子""
  [15]=>
  string(1) """
}
分类: php学习 标签: ,

php版本的wilson score得分算法类

2019年11月25日 没有评论

来源:https://github.com/jkromski/wilson-score-interval

<?php
	class WilsonScoreInterval{
		var $positive,$negative,$confidence,$n,$p,$z;
		function setVar($positive,$negative,$confidence=0.95){//2个参数分别为总评数和差评数
			$this->positive=intval($positive);
			$this->negative=intval($negative);
			$this->confidence=floatval($confidence);
			$this->n=$this->positive+$this->negative;
			$this->z=$this->pnorm(1-(1-$this->confidence)/2);
			$this->p=$this->n>0?1.0*$this->positive/$this->n:null;
		}
		function getLowerBound(){return $this->n>0?$this->multiplier()*($this->innerLeft()-$this->innerRight()):0;}
		function getUpperBound(){return $this->n>0?$this->multiplier()*($this->innerLeft()+$this->innerRight()):0;}
		function score(){return $this->getLowerBound();}
		function getInterval(){return array(0=>$this->getLowerBound(),1=>$this->getUpperBound());}
		function pnorm($qn){
			$b=array(
				1.570796288,0.03706987906,-0.8364353589e-3,-0.2250947176e-3,0.6841218299e-5,0.5824238515e-5,
				-0.104527497e-5,0.8360937017e-7,-0.3231081277e-8,0.3657763036e-10,0.6936233982e-12
			);
			if($qn<0.0 || $qn>1.0 || $qn==0.5) {return 0.0;}
			$w1=$qn>0.5?1.0-$qn:$qn;
			$w3=-log(4.0*$w1*(1.0-$w1));
			$w1=$b[0];
			for($i=1;$i<=10;$i++){$w1+=$b[$i]*pow($w3,$i);}
			return $qn>0.5?sqrt($w1*$w3):-sqrt($w1*$w3);
		}
		function multiplier(){return 1/(1+(pow($this->z,2)/$this->n));}
		function innerLeft(){return $this->p+(pow($this->z,2)/(2*$this->n));}
		function innerRight(){return $this->z*sqrt(($this->p*(1-$this->p)/$this->n)+(pow($this->z,2)/(4*pow($this->n,2))));}
	}
?>

使用方法:

<?php
	require 'wilsonscore.class.php';
	$WilsonScoreInterval=new WilsonScoreInterval();

	$WilsonScoreInterval->setVar(10,1);//2个参数分别为总评数和差评数
	$wilsonScore=substr($WilsonScoreInterval->score(),0,5);
	die($wilsonScore.'x');
?>

顺道贴上GitHub上的原味Wilson score代码类

<?php
namespace ScoreInterval;
class WilsonScoreInterval{
    protected $positive; // Count of Positive results
    protected $negative; // Count of Negative results
    protected $confidence; // Level of Confidence
    protected $n; // Count of Total results
    protected $p; // Positive results out of total results
    protected $z; // Quantile of the standard normal distribution
    /**
     * @param mixed $positive
     * @param mixed $negative
     * @param mixed $confidence
     */
    public function __construct($positive, $negative, $confidence = 0.95){
        $this->positive = intval($positive);
        $this->negative = intval($negative);
        $this->confidence = floatval($confidence);
        $this->n = $this->positive + $this->negative;
        $this->z = $this->pnorm(1 - (1 - $this->confidence) / 2);
        $this->p = $this->n > 0 ? 1.0 * $this->positive / $this->n : null;
    }
    /**
     * @return float|int
     */
    public function getLowerBound(){ return $this->n > 0 ? $this->multiplier() * ($this->innerLeft() - $this->innerRight()) : 0; }
    /**
     * @return float|int
     */
    public function getUpperBound(){ return $this->n > 0 ? $this->multiplier() * ($this->innerLeft() + $this->innerRight()) : 0; }
    /**
     * @return float|int
     */
    public function score(){ return $this->getLowerBound(); }
    /**
     * @return array
     */
    public function getInterval(){ return array(0 => $this->getLowerBound(), 1 => $this->getUpperBound()); }
    /**
     * @link https://github.com/abscondment/statistics2/blob/master/lib/statistics2/base.rb#L89
     * @param $qn
     * @return float
     */
    protected function pnorm($qn){
        $b = array(
            1.570796288, 0.03706987906, -0.8364353589e-3, -0.2250947176e-3,
            0.6841218299e-5, 0.5824238515e-5, -0.104527497e-5, 0.8360937017e-7,
            -0.3231081277e-8, 0.3657763036e-10, 0.6936233982e-12
        );
        if ($qn < 0.0 || $qn > 1.0 || $qn == 0.5) {
            return 0.0;
        }
        $w1 = $qn > 0.5 ? 1.0 - $qn : $qn;
        $w3 = - log(4.0 * $w1 * (1.0 - $w1));
        $w1 = $b[0];
        for ($i = 1; $i <= 10; $i++) {
            $w1 += $b[$i] * pow($w3, $i);
        }
        return $qn > 0.5 ? sqrt($w1 * $w3) : -sqrt($w1 * $w3);
    }
    /**
     * @return float
     */
    private function multiplier(){ return 1 / (1 + (pow($this->z, 2) / $this->n)); }
    /**
     * @return float
     */
    private function innerLeft(){ return $this->p + (pow($this->z, 2) / (2 * $this->n)); }
    /**
     * @return float
     */
    private function innerRight(){ return $this->z * sqrt(($this->p * (1 - $this->p) / $this->n) + (pow($this->z, 2) / (4 * pow($this->n, 2)))); }
}
分类: php学习 标签: , ,

linux系统ubuntu如何实现按秒执行定时任务crontab

2019年10月11日 没有评论

在linux系统ubuntu下现在要实现按秒执行定时任务,可惜在系统默认的文件夹下面有按分钟,小时,周,天,月执行,但是无按分钟执行,这个时候就需要我们自己来实现了。

比如我们要实现按每10分钟执行一次,那么就需要操作:
sudo vim /etc/crontab

*/1 * * * * root /usr/bin/php -f /www/test.php
*/1 * * * * root sleep 10; /usr/bin/php -f /www/test.php
*/1 * * * * root sleep 20; /usr/bin/php -f /www/test.php
*/1 * * * * root sleep 30; /usr/bin/php -f /www/test.php
*/1 * * * * root sleep 40; /usr/bin/php -f /www/test.php
*/1 * * * * root sleep 50; /usr/bin/php -f /www/test.php

以上操作即可实现:linux系统ubuntu如何实现按秒执行定时任务crontab

css.php