PHP 框架基础知识

MVC框架基本工作原理考察点

MVC 即 Model(数据模型层,对数据的加工处理)、View(视图层,和用户交互的界面)、Controller (业务逻辑处理)
相关框架:ThinkPHP、Yii2、CI、Yaf、Phalcon
单一入口的工作原理:用一个处理程序文件处理所有的HTTP请求,根据请求时的参数的不同区分不同模块和操作的请求
优势:可以进行统一的安全性检;集中处理程序
劣势:URL不美观(URL重写);处理效率会稍低

MVC:ThinkPHP、Yii2、CI、Yaf、Phalcon
单一入口的工作原理:用一个处理程序文件处理所有的HTTP请求,根据请求时的参数的不同区分不同模块和操作的请求
优势:可以进行统一的安全性检;集中处理程序
劣势:URL不美观(URL重写);处理效率会稍低

模板引擎:模板引擎就是庞大的完善的正则表达式替换库
PHP是一种HTML内嵌式的在服务端执行的脚本语言,但是PHP有很多可以使PHP代码和HTML代码分开的模板引擎,例如:Smarty、Twig、Haml、Liquid等

PHP 传递数组到 JavaScript

php 传递数组到 js,使用 json 格式交互

var list = JSON.parse('<?php echo urlencode(json_encode($list));?>');

对于 php 的 json 与 js 的 json 格式不同(php 的数组 json 使用 方括号 [ ], js 的 json 全部使用 { } 、php 的 json_encode 会对 斜线进行转义,造成 json 在 js 中 被截断),使用下列方式处理

var list = eval(decodeURIComponent('<?php echo urlencode(json_encode($list));?>'));

PHP 二维数组 按照 Value 中某 key 进行排序 获得另一个 key 的排序

<?php
$arr = [
    ['id'=>1,'main'=>222],
    ['id'=>2,'main'=>333],
    ['id'=>2,'main'=>444],
    ['id'=>1,'main'=>111],
    ['id'=>3,'main'=>122],
    ];
    
    $a = array_column($arr,'main');
    $b = array_column($arr,'id');
    
    echo "<pre>";
    var_dump($a,$b);
    var_dump(array_multisort($a,SORT_DESC,$b));
    var_dump($a,$b);
?>

array_multisort() 先把第一个数组按照键值的大小排序,然后其它数组都按照第一个数组的调整策略进行调整。

优化一下则为

<?php

$arr = [
    ['id'=>1,'main'=>222],
    ['id'=>2,'main'=>333],
    ['id'=>2,'main'=>444],
    ['id'=>1,'main'=>111],
    ['id'=>3,'main'=>122],
    ];
    
    echo "<pre>";
    array_multisort(array_column($arr,'main'),SORT_DESC,$arr);
    var_dump($arr);
?>

简单测试一下 PHP mt_rand( ) 函数一秒钟重复值

<?php
echo "<pre>";

$start = microtime(true);
$end = microtime(true);
$rand = [];
$i = 0;
do{
    $theRand = mt_rand(0,99999);
    if(in_array($theRand,$rand)){
        $i=$i+1;
    }
    $rand[] = $theRand;
    $end = microtime(true);
}while(($end-$start)<1);

echo $i;
echo "<br>";
echo count($rand);
?>

多次测试后,

当随机数为 0 - 99999 时,每秒约能生成 25000 个随机数,重复的约为 3000

当随机数为 0 - 999999 时,每秒约能生成 25000 个随机数,重复的约为 300

机数为 0 - 9999999 时,每秒约能生成 25000 个随机数,重复的约为 30

一秒钟内生成两个随机数撞车的概率还是蛮大的

起因是做活动,订单号貌似重复了,高峰期一分钟八单

一些 PHP 函数

两个日期之间的全部日期

//两个日期之间的日期数组形式
function prDates($start,$end){
  $dt_start = strtotime($start);
  $dt_end = strtotime($end);
  $date = array();
  while ($dt_start<=$dt_end){
    $date[] = date('Y-m-d',$dt_start);
    $dt_start = strtotime('+1 day',$dt_start);
  }
  return $date;
}

位数补零

$number=sprintf ( "%02d",$number);

数组的指定key后面插入数据

function array_push_after_key($array, $data=null, $key=false){
  $data  = (array)$data;
  $offset  = ($key===false)?false:array_search($key, array_keys($array));
  $offset  = ($offset)?$offset:false;
  if($offset){
    return array_merge(
      array_slice($array, 0, $offset+1),
      $data,
      array_slice($array, $offset+1)
    );
  }else{  //找不到key,就直接加到末尾
    return array_merge($array, $data);
  }
}

PHP 正则匹配替换 HTML 的 IMG 标签 SRC 属性,添加图片域名

private function preg_match($img){
  $newImg = preg_replace('/(<img.+?src=")(.*?)/','$1'.base_url().'$2', $img);
  return $newImg;
}

PHP 图片压缩至指定尺寸 封装函数

/**
 * @param $img 图片地址
 * @param string $width 宽
 * @param string $height 高
 * @param string $ratio 保持原比例
 * @return string 生成的地址
 */
public function resize_fuc($img, $width, $height, $ratio)
{

	$info = get_img_info($img);
	$name = pathinfo($img)['filename'];
	$dirname = pathinfo($img)['dirname'];
	$ext = pathinfo($img)['extension'];

	$im = NULL;
	$type = strtolower($info['type']);

	if (!in_array($type, ['jpg', 'jpeg', 'gif', 'png'])) {
		return FALSE;
	}
	$type = ($type == 'jpg' ? 'jpeg' : $type);

	$scale = $info['width'] / $info['height'];

	if ($ratio == TRUE) {
		$forScale = $width / $height;
		$x = 0;
		$y = 0;
		if ($scale >= $forScale) {
			$width = (int)($height * $scale);
			$rate = $info['height']/$height;
		} else {
			$height = (int)($width / $scale);
			$rate = $info['width']/$width;
		}
	} else {
		$forScale = $width / $height;
		if ($scale >= $forScale) {
			$x = ($info['width'] - $info['height'] * $forScale) / 2;
			$y = 0;
			$rate = $info['height'] / $height;
		} else {
			$x = 0;
			$y = ($info['height'] - $info['width'] / $forScale) / 2;
			$rate = $info['width'] / $width;
		}
	}

	if($width>$info['width'] || $height>$info['height']){
		return;
	}


	$imageCreateFun = 'imagecreatefrom' . $type;
	$im = $imageCreateFun($img);
	$thumb = $dirname . '/' . $name . '_tmp' . "." . $ext;

	$imageFun = 'image' . $type;
	$imageFun($im, $thumb);

	$thumbNew = imagecreatetruecolor($width, $height);

	imagecopyresampled(
		$thumbNew, $im,
		0, 0, intval($x), intval($y),
		intval($width * 1), intval($height * 1), intval($width * $rate), intval($height * $rate)
	);

	$imageFun($thumbNew, $thumb);

	imagedestroy($im);
	imagedestroy($thumbNew);

	rename($thumb,$img);
	return $img;
}
function get_img_info($img) {
    if(!is_file($img) || !in_array(strtolower(pathinfo($img)['extension']),['jpg','jpeg','bmp','gif','png'])){
        return false;
    }
    $img_info = getimagesize($img);
    if ($img_info !== false) {
        $img_type = strtolower(substr(image_type_to_extension($img_info[2]), 1));
        $info = array("width" => $img_info[0], "height" => $img_info[1], "type" => $img_type, "mime" => $img_info['mime'], );
        return $info;
    } else {
        return false;
    }
}