草特直接置顶
今日闯子哥发来消息:
- 我为了 测supervisor
- 我搭建个tp6
- 妈的 我伪静态也配置了
- 老是重定向到首页
- 服了
经过他的一番折腾,终于找除了问题所在
//闯子哥:我之前用的都是这个tp5 laravel 都行, 就tp6 没用过,关键我以前用这个屡试不爽
location / {
try_files $uri $uri/ /index.php$args;
}
//最终是因为上面的配置tp6不起作用! 于是更改为以下配置,才得以解决,草特直接香舍!
location / {
if (!-e $request_filename) {
rewrite ^(.*)$ /index.php?s=/$1 last;
}
}
一、array_merge() 数组合并函数
定义:array_merge() 函数把一个或多个数组合并为一个数组。(您可以向函数输入一个或者多个数组。)
注释:如果两个或更多个数组元素有相同的键名,则最后的元素会覆盖其他元素。
如果两个数组都是索引数组,则不会覆盖
如果您仅向 array_merge() 函数输入一个数组,且键名是整数,则该函数将返回带有整数键名的新数组,其键名以 0 开始进行重新索引。
该函数与 array_merge_recursive() 函数之间的不同是在处理两个或更多个数组元素有相同的键名的情况。array_merge_recursive() 不会进行键名覆盖,而是将多个相同键名的值递归组成一个数组。
$a1=array("red","green");
$a2=array("blue","yellow");
$a3=array("CC","DD");
$b1=array("a"=>"sa","b"=>"sb");
$b2=array("a"=>"qa","b"=>"qb");
$b3=array("a"=>"wa","c"=>"ww");
print_r(array_merge($a1,$a2)); //Array ( [0] => red [1] => green [2] => blue [3] => yellow )
print_r(array_merge($a1,$a2,$a3)); //Array ( [0] => red [1] => green [2] => blue [3] => yellow [4] => CC [5] => DD )
print_r(array_merge($b1,$b2)); //Array ( [a] => qa [b] => qb )
print_r(array_merge($b1,$b2,$a3)); // Array ( [a] => qa [b] => qb [0] => CC [1] => DD )
print_r(array_merge($b1,$b2,$b3)); // Array ( [a] => wa [b] => qb [c] => ww )
二、获取文件扩展名
//plan A
function get_ext(string $url){
//$url = 'http://www.sina.com.cn/abc/de/fg.html?id=1&ajksfg&aakzsdfj';
$a = parse_url($url); //Array ( [scheme] => http [host] => www.sina.com.cn [path] => /abc/de/fg.html [query] => id=1&ajksfg&aakzsdfj )
$file = basename($a['path']); //fg.html
$b = explode('.',$file);
return array_pop($b);
}
//plan B
function get_ext(string $url){
//$url = 'http://www.sina.com.cn/abc/de/fg.html?id=1&ajksfg&aakzsdfj';
$a = basename($url); //fg.html?id=1&ajksfg&aakzsdfj
$b = explode('?',$a);; //Array ( [0] => fg.html [1] => id=1&ajksfg&aakzsdfj )
$ext = explode('.',$b[0]);
return array_pop($ext);
}
三、遍历一个文件夹下的所有文件和子文件夹
function my_scandir($dir){
$files = array();
if(is_dir($dir)){
if ($handle = opendir($dir)){
while (($file = readdir($handle))!= false){
if ($file != "." && $file != "..") {
if (is_dir($dir."/".$file)){
$files[$file] = my_scandir($dir."/".$file);
} else{
$files[] = $dir."/".$file;
}
}
}
closedir($handle);
return $files;
}
}
}
四、编写一个函数,递归遍历,实现无限分类
function tree($arr,$pid=0,$level=0){
static $list = array();
foreach ($arr as $v) {
//如果是顶级分类,则将其存到$list中,并以此节点为根节点,遍历其子节点
if ($v['parent_id'] == $pid) {
$v['level'] = $level;
$list[] = $v;
tree($arr,$v['cat_id'],$level+1);
}
}
return $list;
}
五、获取上个月最后一天
function get_last_month_last_day($date = ''){
if ($date != '') {
$time = strtotime($date);
} else {
$time = time();
}
$day = date('j',$time);//获取该日期是当前月的第几天
return date('Y-m-d',strtotime("-{$day} days",$time));
}
六、php中WEB上传文件的原理是什么,如何限制上传文件的大小?
上传文件的表单使用post方式,并且要在form中添加enctype=‘multipart/form-data’。
一般可以加上隐藏域:,位置在file域前面。
value的值是上传文件的客户端字节限制。可以避免用户在花时间等待上传大文件之后才发现文件过大上传失败的麻烦。
使用file文件域来选择要上传的文件,当点击提交按钮之后,文件会被上传到服务器中的临时目录,在脚本运行结束时会被销毁,所以应该在脚本结束之前,将其移动到服务器上的某个目录下,可以通过函数move_uploaded_file()来移动临时文件,要获取临时文件的信息,使用$_FILES。
- 限制上传文件大小的因素有:
- 客户端的隐藏域MAX_FILE_SIZE的数值(可以被绕开)。
- 服务器端的upload_max_filesize,post_max_size和memory_limit。这几项不能够用脚本来设置。
七、双引号和单引号的区别
- 双引号解释变量,单引号不解释变量
- 双引号里插入单引号,其中单引号里如果有变量的话,变量解释
- 双引号的变量名后面必须要有一个非数字、字母、下划线的特殊字符,或者用{}讲变量括起来,否则会将变量名后面的部分当做一个整体,引起语法错误
- 双引号解释转义字符,单引号不解释转义字符,但是解释’\和\
- 能使单引号字符尽量使用单引号,单引号的效率比双引号要高(因为双引号要先遍历一遍,判断里面有没有变量,然后再进行操作,而单引号则不需要判断)
八、常用的超全局变量
- $_GET ----->get传送方式
- $_POST ----->post传送方式
- $_REQUEST ----->可以接收到get和post两种方式的值
- $GLOBALS ----->所有的变量都放在里面
- $_FILES ----->上传文件使用
- $_SERVER ----->系统环境变量
- $_SESSION ----->会话控制的时候会用到
- $_COOKIE ----->会话控制的时候会用到
九、 语句include和require的区别
- require是无条件包含,也就是如果一个流程里加入require,无论条件成立与否都会先执行require,当文件不存在或者无法打开的时候,会提示错误,并且会终止程序执行
- include有返回值,而require没有(可能因为如此require的速度比include快),如果被包含的文件不存在的话,那么会提示一个错误,但是程序会继续执行下去
- 注意:包含文件不存在或者语法错误的时候require是致命的,而include不是
- require_once,include_once表示了只包含一次,避免了重复包含
redis 和 memache 缓存的区别
1.数据类型
redis支持多种数据类型(5种):hash string list set zset
memcache 只支持key-value
2.持久性
redis 支持两种持久化方式 RDB、AOF
memcache 不支持持久化
3.分布式存储
redis支持master-slave复制模式
memcache可以使用一致性hash做分布式
4.value大小不同
memcache是一个内存缓存,key的长度小于250字符,单个item存储要小于1M,不适合虚拟机使用
5.线程模型
memcache是master+worker的线程模型,其中master完成网络监听后投递到worker线程,由worker线程处理
redis是单进程单线程模型,即单个线程完成所有的事情
这两种实现造成下面的差异,即redis更容易实现多种数据结构,类似列表,集合,hash,有序集合等,由于是单线程的,如果单实例部署redis,不能全面用到服务器多核的优势,通常部署时,都会通过多实例的方式去部署
6.内存管理
redis:redis没有自己得内存池,而是直接使用时分配,即什么时候需要什么时候分配,内存管理的事交给内核,自己只负责取和释放,直接malloc和free即可。内存管理没有什么特殊的算法,通过使用google的jmalloc库来做内存管理(申请,释放)
memcache:memcached是有自己得内存池的,即预先分配一大块内存,然后接下来分配内存就从内存池中分配,这样可以减少内存分配的次数,提高效率,这也是大部分网络服务器的实现方式,只不过各个内存池的管理方式根据具体情况而不同。使用了类似linux的内存管理,即slab内存管理方式。
7.其他
redis支持事务,频道(发布-订阅),集群;memcache不支持
十、Memcache的特征和特性
1)协议简单。
2)基于libevent的事件处理。
3)内置内存存储方式。
4)Memcached不互相通信的分布式。
(1)单个item 最大的数据为1MB。
(2)单进程最大的使用内存为2GB,需要更多内存时可开多个端口。
(3)Memcached是多线程,非阻塞io复用的网络模型,Redis是单线程。
(4)键长最大为250字节。
十一、用PHP写出显示客户端IP与服务器IP的代码
$_SERVER[‘SERVER_ADDR’] 服务器
$_SERVER[‘REMOTE_ADDR’]客户端
function getOnlineIP(){
if (getenv('HTTP_CLIENT_IP')) return getenv('HTTP_CLIENT_IP');
if (getenv('HTTP_X_FORWARDED_FOR')) return getenv('HTTP_X_FORWARDED_FOR');
if ($_SERVER["REMOTE_ADDR"]) return $_SERVER["REMOTE_ADDR"];
if (!empty($HTTP_SERVER_VARS['REMOTE_ADDR'])) return $HTTP_SERVER_VARS['REMOTE_ADDR'];
}
十二、写个函数用来对二维数组排序。
function array_sort_by_any_row($array_name, $row_id, $order_type){
$array_temp=array();
foreach($array_name as $key=>$value){
$array_temp[$key]=$value[$row_id];
}
if($order_type==="ASC"){ //顺序
asort($array_temp);
} else {
arsort($array_temp);
}
$result_array=array();
foreach($array_temp as $key=>$value){
$result_array[$key]=$array_name[$key];
}
return $result_array;
}
$arr = array(
array('num'=>5, 'value'=>6),
array('num'=>2, 'value'=>39),
array('num'=>36, 'value'=>29)
);
$sortarr = array_sort_by_any_row($arr, 'num', 'DESC');
print_r($sortarr);
十三、JS获取扫描枪内容
window.onload = function(e){
var code = "";
var lastTime,nextTime;
var lastCode,nextCode;
document.onkeypress = function(e) {
nextCode = e.which;
nextTime = new Date().getTime();
if(lastCode != null && lastTime != null && nextTime - lastTime <= 30) {
code += String.fromCharCode(lastCode);
} else if(lastCode != null && lastTime != null && nextTime - lastTime > 100){
code = "";
}
lastCode = nextCode;
lastTime = nextTime;
};
this.onkeypress = function(e){
if(e.which == 13){
console.log(code);
code = "";
}
};
};