linux环境安装php fileinfo扩展

windows环境安装扩展比较简单,只需要把dll拷贝到扩展目录,修改php.ini中相应的扩展就好了

1.我们从fileinfo的源码来安装这个扩展。fileinfo的源码在php源码的“src/ext/fileinfo”的目录下面,可以用find来找到具体的路径

find / -name fileinfo

2.cd 到该位置(根据自己的具体情况来)

cd /usr/local/src/php7/ext/fileinfo/

3.不要离开php安装源码的ext/fileinfo目录,执行以下命令

/usr/local/php/bin/phpize

4.执行

./configure --with-php-config=/usr/local/php/bin/php-config

注意这里面php-config=后面的是你php-config所在的路径,一定要填对
5.编译安装

make && make install  

6.进入php.ini,添加一句

extension=fileinfo.so  

7.重启PHP

/etc/init.d/php-fpm reload  

8.输出phpinfo(),出现下图表示安装成功

thinkphp5、php使用redis实现session共享替代session(分布式)

原生写法

方法一:
找到配置文件php.ini,修改为下面内容,保存并重启服务

session.save_handler = redis
session.save_path = "tcp://127.0.0.1:6379"

方法二:
直接在代码中加入以下内容:

ini_set("session.save_handler", "redis");
ini_set("session.save_path", "tcp://127.0.0.1:6379");

注:如果配置文件redis.conf里设置了连接密码requirepass,save_path需要这样写tcp://127.0.0.1:6379?auth=authpwd ,否则保存session的时候会报错。

示例代码:

//ini_set("session.save_handler", "redis");
//ini_set("session.save_path", "tcp://127.0.0.1:6379");
session_start();
//存入session
$_SESSION['class'] = array('name' => 'toefl', 'num' => 8);
//连接redis
$redis = new redis();
$redis->connect('127.0.0.1', 6379);
//检查session_id
echo 'session_id:' . session_id() . ';
//redis存入的session(redis用session_id作为key,以string的形式存储)
echo 'redis_session:' . $redis->get('PHPREDIS_SESSION:' . session_id()) . ';

//php获取session值
echo 'php_session:' . json_encode($_SESSION['class']);

thinkphp5框架

'session' => [
    'prefix'     => 'module',
    'type'       => 'redis',
    'auto_start' => true,
     // redis主机
    'host'       => '127.0.0.1',
     // redis端口
    'port'       => 6379,
     // 密码
    'password'   => '',
]

下拉加载刷新thinkphp代码设计(防游品味)

具体demo这里就不提供了,具体效果可以去游品味上看,只说一下设计原理,大家将就看一下。

代码中的下一页和总页码都是后台计算得到的。

首先是JS代码如下:

<script>
   $(function(){
      //数据是否在加载中
      var isLoading = false;
      //加载次数
      var count = 0;
      //滚动加载次数
      var scrollCount = 2;
      //检测
      function loadMore(){
         $(window).scroll(function(e){
            //只需滚动加载5次
            if(count > scrollCount) return;

            var domH = $(document).height();
            var sTop = $(document.body).scrollTop();
            var h = $(window).height();
            if(domH < (sTop + h + 300)){
               loadMoreGame();
            }
         });
      }

      //加载更多游戏
      function loadMoreGame(){
         //如果正在加载中,则返回
         if(isLoading) return;
         isLoading = true;
         var $loadMore = $("#loadMore");
         var url = $loadMore.attr("next-page");

         var next = $loadMore.attr("next");//获取下一页
         var pagenum = $loadMore.attr("pagenum");//总页码
         
         if(parseInt(next)>parseInt(pagenum)){
            $(".loading").text("没有了");
            return;
         }

         $.ajax({
            url:url,
            success:function(result){
               if(result){
                  var $obj = $("<div>"+result+"</div>");
                  $obj.find(".section-bd .evaluate-list .item").appendTo($(".evaluate-list"));
                  var nurl = $obj.find(".ypw-load-more").attr("next-page");
                  //设置下一页的url
                  $loadMore.attr("next-page",nurl);

                  var next = $obj.find(".ypw-load-more").attr("next");
                  $loadMore.attr("next",next);


                  isLoading = false;
                  //加载次数增加一次
                  count ++;
                  if(count > scrollCount){
                     $loadMore.find(".loading").hide();
                     //大于5次则点击加载
                     $loadMore.find(".load").show().click(function(){
                        $loadMore.find(".loading").show();
                        $(this).hide();
                        //加载更多游戏
                        loadMoreGame();
                     });
                  }
               }
            }
         });
      }
   })
</script>

html代码大致如下:

   <div class="section-bd">
     <ul class="list evaluate-list">
            <volist name="data" id="item">
   <li class="item">
      <div class="evaluate-sub-pic">
         <img src="/static/wap_new/images/avatar.png" alt="" class="evaluate-avatar">
      </div>
      <div class="evaluate-sub-desc">
         <div class="evaluate-header">
            <h3 class="evaluate-name">{fy_$item.username}</h3>
            <div class="evaluate-view">
               <i class="icon icon-eye"></i> {fy_$item.fpclick}
            </div>
            <small class="evaluate-time">{fy_$item.fpcreatetime|date="Y-m-d h:i",###}</small>
         </div>
         <div class="evaluate-body">
            <h5 class="comment-title"><a style="font-size: .3rem;" href="/home/forum/detail/id/{fy_$item.fpid}">{fy_$item.fptitle}</a></h5>
            <div class="comment">
               {fy_$item.fpcontent|strip_tags|iconv_substr=0,60,'utf-8'}
            </div>
         </div>
         <div class="evaluate-footer">
             <ul class="group-link">
                <li class="link link-divider">
                     <a href="#">
                        <i class="icon icon-comment"></i>
                        {fy_$item.frnum}
                     </a>
                </li>
                <li class="link">
                   <a href="#">
                      <i class="icon icon-like"></i>
                      {fy_$item.fpclick}
                   </a>
                </li>
             </ul>
         </div>
      </div>
   </li>
            </volist>
</ul>
    <div  class="ypw-load-more" pagenum="{fy_$pagenum}" next="{fy_$next}" id="loadMore" next-page="/home/forum/forum_list?p={fy_$next}">
     <div class="loading" style="display: none;" >
      正在加载 请稍后···
     </div>
     <div class="load" style="display: none;">
      <span>点击加载更多</span>
     </div>
    </div>
    <!-- /.evaluate-list -->
   </div>

接口返回代码设计:

<div class="section-bd">
<ul class="list evaluate-list">
   <volist name="data" id="item">
      <li class="item">
         <div class="evaluate-sub-pic">
            <img src="/static/wap_new/images/avatar.png" alt="" class="evaluate-avatar">
         </div>
         <div class="evaluate-sub-desc">
            <div class="evaluate-header">
               <h3 class="evaluate-name">{fy_$item.username}</h3>
               <div class="evaluate-view">
                  <i class="icon icon-eye"></i> {fy_$item.fpclick}
               </div>
               <small class="evaluate-time">{fy_$item.fpcreatetime|date="Y-m-d h:i",###}</small>
            </div>
            <div class="evaluate-body">
               <h5 class="comment-title"><a style="font-size: .3rem;" href="/home/forum/detail/id/{fy_$item.fpid}">{fy_$item.fptitle}</a></h5>
               <div class="comment">
                  {fy_$item.fpcontent|strip_tags|iconv_substr=0,60,'utf-8'}
               </div>
            </div>
            <div class="evaluate-footer">
               <ul class="group-link">
                  <li class="link link-divider">
                     <a href="#">
                        <i class="icon icon-comment"></i>
                        {fy_$item.frnum}
                     </a>
                  </li>
                  <li class="link">
                     <a href="#">
                        <i class="icon icon-like"></i>
                        {fy_$item.fpclick}
                     </a>
                  </li>
               </ul>
            </div>
         </div>
      </li>
   </volist>
   <div class="ypw-load-more" pagenum="{fy_$pagenum}" next="{fy_$next}" id="loadMore" next-page="/home/forum/forum_list?p={fy_$next}">
      <div class="loading" >
         正在加载 请稍后···
      </div>
   </div>
</ul>
</div>

PHP根据经纬度计算俩点之间的距离的俩种方法

直接上代码

/**
 * @param $lat1
 * @param $lng1
 * @param $lat2
 * @param $lng2
 * @return int
 */
function getDistance($lat1, $lng1, $lat2, $lng2){

 //将角度转为狐度

 $radLat1=deg2rad($lat1);//deg2rad()函数将角度转换为弧度

 $radLat2=deg2rad($lat2);

 $radLng1=deg2rad($lng1);

 $radLng2=deg2rad($lng2);

 $a=$radLat1-$radLat2;

 $b=$radLng1-$radLng2;

 $s=2*asin(sqrt(pow(sin($a/2),2)+cos($radLat1)*cos($radLat2)*pow(sin($b/2),2)))*6378.137;

 return $s;

}

/**
 * @param $lat1
 * @param $lon1
 * @param $lat2
 * @param $lon2
 * @param float $radius 星球半径
 * @return float
 */
function distance($lat1, $lon1, $lat2,$lon2,$radius = 6378.137)
{
 $rad = floatval(M_PI / 180.0);

 $lat1 = floatval($lat1) * $rad;
 $lon1 = floatval($lon1) * $rad;
 $lat2 = floatval($lat2) * $rad;
 $lon2 = floatval($lon2) * $rad;

 $theta = $lon2 - $lon1;

 $dist = acos(sin($lat1) * sin($lat2) +
 cos($lat1) * cos($lat2) * cos($theta)
 );

 if ($dist < 0 ) {
 $dist += M_PI;
 }

 return $dist = $dist * $radius;
}
$lat1 = '31.253411';
$lon1 = '121.518998';

$lat2 = '31.277117';
$lon2 = '120.744587';

echo getDistance($lat1, $lon1, $lat2, $lon2); // 73.734589823361

echo distance($lat1, $lon1, $lat2, $lon2); // 73.734589823354

php字符串转数组及数组转字符串的常用方法(implode()和explode())

php中掌握常用函数很重要,相信这俩个函数大家一定不很陌生,这里就做一个简单说明介绍:

1.数组元素组合为字符串 implode()

implode() 函数返回由数组元素组合成的字符串。

implode(separator,array)

separator 可选。规定数组元素之间放置的内容。默认是 “”(空字符串)。

array 必需。要组合为字符串的数组。

例子:

1
2
3
4
<?php
$arr = array('Hello','World!','I','love','Shanghai!');
echo implode(" ",$arr);
?>

输出:Hello World! I love Shanghai!

2.字符串打散为数组:explode()

explode() 函数把字符串打散为数组。

explode(separator,string,limit)

separator 必需。规定在哪里分割字符串。
string 必需。要分割的字符串。
limit 可选。规定所返回的数组元素的数目。

例子:

1
2
3
4
<?php
$str = "Hello world. I love Shanghai!";
print_r (explode(" ",$str));
?>

输出:Array ( [0] => Hello [1] => world. [2] => I [3] => love [4] => Shanghai! )

PHP中使用substr()截取字符串出现中文乱码问题(mb_substr)

在PHP开发中,经常会执行字符串的截取操作,遇到这些需求时,我们经常会想到使用substr()方法来实现,substr()对全英文字符串的截取是比较适合的。

但字符串只要出现中文字符,就有可能导致PHP substr中文乱码,因为中文UTF-8编码,每个汉字占3字节,而GB2312占2字节,英文占1字节,截取位数不准确,substr()硬生生地将一个中文字符“锯”成两半,造成断开的字符会把其后的..拉过来一起做一个字,所以出现了PHP substr中文乱码。

这个时候我们就要想点办法了。

其实可以用mb_substr()/mb_strcut()这个函数,mb_substr()/mb_strcut()的用法与substr()相似,只是在mb_substr()/mb_strcut最后要加入多一个参数,以设定字符串的编码,但是一般的服务器都没打开php_mbstring.dll,需要在php.ini在把php_mbstring.dll打开。

  echo mb_substr("php中文字符encode",0,4,"utf-8");

如果未指定最后一个编码参数,会是三个字节为一个中文,这就是utf-8编码的特点,若加上utf-8字符集说明,所以,是以一个字为单位来截取的。

使用的时候要注意php文件的编码,和网页显示时的编码。使用这个mb_substr方法要事先知道字符串的编码,如果不知道编码,就需要判断,mbstring库还提供了mb_check_encoding来检验字符串编码,但还不完善。

php错误:operator not supported for strings in原因及解决方法

php报错

PHP Fatal error:  [] operator not supported for strings in ……

错误原因

在对某一个变量进行第二次赋值的时候,也就是在同一页面内对同一变量第二次赋值,但值的类型前后不一致会导致这个错误,可以在第二次赋值前重新进行一次声明变量类型.
简单的来说,就是同一页面内,同一变量前后赋值的类型不一致所导致的。

比如:
$a = “abc”;
$a[] = “def”;

解决方法

检查你的代码中是否有上例中的书写方式,请在每次赋值前声明一次变量或用unset()函数销毁变量

例:
$a=”abc”;
unset($a);
$a[] = “def”;

php中定界符的使用<<<

在php编程过程中,有时难免会输出或者包含大量html和javascript的情况,如果用传统的方法,需要大量转义字符,很容易出现错误造成麻烦,这时候使用定界符就很容易解决。

定界符的作用:

1.PHP定界符的作用就是按照原样,包括换行格式什么的,输出在其内部的东西;

2.在PHP定界符中的任何特殊字符都不需要转义;

3.PHP定界符中的PHP变量会被正常的用其值来替换。

像下面这种样子

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
$str=<<<Eof
 <!DOCTYPE html>
 <html>
 <head>
 <title></title>
 </head>
 <body>
  测试文本
 </body>
 </html>
Eof;
?>

看起来很贱,但也需要有些地方注意一下:

1.在<<<之后的字符Eof是自己定义的,随便什么都是可以的,但是结尾处的字符一定要和他一样,他们是成对出现的,就像{}这样的——这是最基本的;

2.结尾的一行(如上例的Eof;),一定要另起 一行,并且改行除了Eof;这个定界符结尾标识之外不能有任何其他字符,前后都不能有,包括空格。如果在本行最前或者最后出现空格,制表符的话,你会收到 一个这样的错误信息:Parse error: parse error, unexpected $end in……,提示你语法错误;

3.如果在定界符中间出现有PHP的变量,你只需要像在其它字符串中输出一样写就行了.

php中mysql常用统计数据行数的方法

mysql查询行数的语法是:select count() from table;

但注意的是该 SQL 语法用于统计某一字段的数据行数,COUNT() 内不能是多个字段,但可以是 * 号。

下面例子:

1
2
3
4
5
6
7
8
9
10
11
<?php
$conn = @mysql_connect("localhost","root","root123");
if (!$conn){
    die("连接数据库失败:" . mysql_error());
}
 
mysql_select_db("test", $conn);
$sql = "SELECT COUNT(id) FROM user";
$row = mysql_fetch_array( mysql_query($sql) );
echo "共有用户: ",$row[0]," 位";
?>

上面用到mysql_query()和mysql_fetch_array()俩个函数,相信大家一看就会明白。下面附上这俩个函数的说明

mysql_query发送一条 MySQL 查询  返回一个资源类型

mysql_fetch_array从结果集中取得一行作为关联数组,或数字数组,或二者兼有  返回一个数据