作者: 蓝冰

  • wordpress发送邮件过慢或无法发送问题

    为了能够用上我爱水煮鱼大人最新版的微信机器人插件,必须得把php升级为7.2才可以,所以就开始了大胆的尝试,幸亏有阿里云磁盘快照,先备份个快照,随便折腾,大不了一键还原。

    升级完php7.2《AMH4.2面板PHP升级7.2.0》之后网站可以正常打开了,一切似乎都正常,但是在留言的时候,浏览器一直在转圈圈,看了下后台,留言是成功了的,但是就是一直在转圈圈,最后终于显示出了留言,然后就开始百度,发现应该是发送邮件过慢导致的。

    以下是解决方案:

    登录ssh管理后台,请检查hosts,

    cat /etc/hosts

    结果发现:
    127.0.0.1          localhost.localdomain localhost

    中并没有hostname,将其加入,查看主机名称直接命令:

    hostname

    这里加入主机名称为:testhost,则改过后的内容则为:
    127.0.0.1         localhost.localdomain localhost testhost

    接着,重启sendmail。

    service sendmail restart

    完成此步骤后还可以解决一个sendmail和sm-client启动慢的问题,然后,留言就一下子就顺畅了。

  • AMH4.2面板PHP升级7.2.0

    此方法仅是我小白本人尝试成功的方法,不保证会不会出现其他意料之外的问题,所以,开始前记得备份全站。

    一. 下载和解压PHP7.2.0

    wget http://cn2.php.net/distributions/php-7.2.0.tar.gz
    tar -zxvf php-7.2.0.tar.gz
    cd php-7.2.0

    二. 编译PHP7.2.0

    ./configure --prefix=/usr/local/php --with-config-file-path=/usr/local/php --enable-mbstring --enable-ftp --with-gd --with-jpeg-dir=/usr --with-png-dir=/usr --with-mysql=mysqlnd --with-mysqli=mysqlnd --with-pdo-mysql=mysqlnd --with-pear --enable-sockets --with-freetype-dir=/usr --with-zlib --with-libxml-dir=/usr --with-xmlrpc --enable-zip --enable-fpm --enable-xml --enable-sockets --with-gd --with-zlib --with-iconv --enable-zip --with-freetype-dir=/usr/lib/ --enable-soap --enable-pcntl --enable-cli --with-curl

    说明:由于PHP7.2不再支持mysql,而是用mysqli取代。因此会出现warning。不过没关系,如果需要安装php的mysql扩展,文章后面会有说明。

    编译完成之后,执行安装命令

    make && make install

    安装过程大约需要20分钟时间,请耐心等待。

    三、配置PHP

    在之前编译的源码包中,找到 php.ini-production,复制到/usr/local/php下,并改名为php.ini:

    cp php.ini-production /usr/local/php/php.ini

    [可选项] 设置让PHP错误信息打印在页面上

    vim /usr/local/php/php.ini

    display_errors = On

     

    修改/usr/local/php/etc/php-fpm.conf
    添加脚本授权
    listen.owner = www
    listen.group = www
    listen.mode = 0660

    修改/usr/local/php/etc/php-fpm-template.conf
    添加脚本授权
    listen.owner = www
    listen.group = www
    listen.mode = 0660

    如果已有站点  如果在AMH面板环境中存在站点,还需要将/usr/local/php/etc/fpm目录中,有站点域名标示的.conf文件进行添加上面的3行脚本。如果没有站点就不需要,因为模板我们添加了,添加的新站点会自动添加。
    listen.owner = www
    listen.group = www
    listen.mode = 0660

    四、PHP7.2的MySQL扩展

    由于PHP7.2不再支持mysql,而是用mysqli取代,下面安装php的mysql扩展。

    下载安装包:mysql-24d32a0.tar.gz 解压,并进入目录

    tar -zxvf mysql-24d32a0.tar.gz
    cd mysql-24d32a0
    /usr/local/php/bin/phpize  #使用phpize初始化

    编译mysql扩展,使用mysql native driver 作为mysql链接库

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

    接下来,安装

    make && make install

    最后,编辑php.ini文件,在最后面加入 extension=mysql.so 即可。

    vim /usr/local/php/php.ini

    重启PHP,查看phpinfo()

    /etc/init.d/php-fpm restart 

    五、Linux PHP7的openssl扩展安装

    Linux环境下使用PHPmailer发送邮件时,出现如下错误:

    SMTP –
    > ERROR: Failed to connect to server: Unable to find the socket transport “ssl” – did you forget to enable it when you configured PHP? (32690)

    出现这个问题的原因是当初编译安装PHP缺少了ssl库。

    可以重新再次编译PHP,加上–enable-openssl参数即可。

    但是如果只为了安装这一个扩展就去重新编译,未免有点麻烦,其实可以简单一点,只要安装openssl.so扩展就可以了。

    1、找到之前编译安装PHP的安装包。

    2、解压并进入文件夹

    cd php7.2.0/ext/openssl

    3、运行 phpize

    /usr/local/php/bin/phpize

    备注,如果出现如下错误:Cannot find config.m4.

    Make sure that you run ‘/usr/local/php/bin/phpize’ in the top level source directory of the module

    【解决办法】cp ./config0.m4 ./config.m4 即可解决。

    4、编译和安装

    ./configure --with-openssl --with-php-config=/usr/local/php/bin/php-config
    make && make install

    5、然后进入最后提示的目录。

    6、将 openssl.so 复制到PHP的扩展目录下

    cp openssl.so /usr/local/php/include/php/ext

    7、找到php.ini,在最后面添加如下内容

    extension=openssl.so

    8、重启php-fpm和nginx/apache,查看phpinfo();

    好了,大功告成。

    如果网站留言有问题,请参考是不是这个原因,《wordpress发送邮件过慢或无法发送问题》

    PS:升级之后好像AMH4.2的SSL插件的https功能有问题,无法访问,没找到解决方案,所以我又还原了。

  • bootstrap的a页面指定tab,点击more,跳去b页面指定的tab

    如图实现目标: a页面的tab1标签页中点击more 跳去b页面的tab1,同理类比其他两个tab。

    这里为什么是more跳过去的呢,因为tab nav上面的tab1,tab2,tab3,是用来对应自己在同个页面的标签页的。

    使用框架: bootstrap的v3版本的tabs标签页

    https://v3.bootcss.com/javascript/#tabs

    老生常谈:  为当中某个标签页的<li>元素指定 “active”类名就可以激活当前对象  当然也可以用:first,:last,:eq(2)等的jq为指定的<li>元素中的<a>激活显示对应的标签页

     $(function () {  
         $('#myTab a:first').tab('show');//初始化显示第一个tab  
         $('#myTab a:last').tab('show');//初始化显示最后一个tab  
         $('#myTab li:eq(2) a').tab('show');//选中第三个tab  
         $('#myTab a[href="#wanted"]').tab('show');//选中你想要的tab 
    
      $('#myTab a').click(function (e) {  
        e.preventDefault();//阻止默认行为  
        $(this).tab('show');//显示当前选中的链接及关联的content  
      })  
    })  

    实现目标: 需要跨页面实现tab的选中。实现思路: a页面通过url传参(参数是tab的名称),然后在b页面进行截断获取再进行选中(通过在url传参的做法前提是不影响后台传数据)

    <!--a页面-->
    <ul class="nav nav-pills nav-justified" id="myTab">
       <li role="presentation" class="active">
           <a href="#tab1">tab1</a>
       </li>
       <li role="presentation">
           <a href="#tab2">tab2</a>
       </li>
       <li role="presentation">
           <a href="#tab3">tab3</a>
       </li>
    </ul>
    <div class="tab-content">
       <div role="tabpanel" class="tab-pane active" id="tab1">
            <p>tab1 content</p>
            <a href="./detail.html?type=tab1" class="btn btn-lg">
               more
            </a>
        </div>
        <div role="tabpanel" class="tab-pane" id="tab2">
            <p>tab1 content</p>
            <a href="./detail.html?type=tab2" class="btn btn-lg">
               more
            </a>
        </div>
        <div role="tabpanel" class="tab-pane" id="tab3">
            <p>tab1 content</p>
            <a href="./detail.html?type=tab3" class="btn btn-lg">
               more
            </a>
        </div>
    </div>
    <!--b页面-->
    <ul class="nav nav-pills nav-justified" id="myTab">
       <li role="presentation" class="active">
           <a href="#tab1">tab1</a>
       </li>
       <li role="presentation">
           <a href="#tab2">tab2</a>
       </li>
       <li role="presentation">
           <a href="#tab3">tab3</a>
       </li>
    </ul>
    <div class="tab-content">
       <div role="tabpanel" class="tab-pane active" id="tab1">
            <p>tab1 content</p>
            <nav aria-label="...">
               <ul class="pagination">
                    <li class="disabled">
                        <a href="#" aria-label="Previous">
                            <span aria-hidden="true">&lt;</span>
                        </a>
                    </li>
                    <li>
                        <a href="#">1 <span class="sr-only">(current)</span></a>
                    </li>
                    <li>
                        <a href="#">2</a>
                    </li>
                    <li>
                        <a href="#">3</a>
                    </li>
                </ul>
            </nav>
        </div>
        <div role="tabpanel" class="tab-pane" id="tab2">
            <p>tab2 content</p>
            <nav aria-label="...">
               <ul class="pagination">
                    <li class="disabled">
                        <a href="#" aria-label="Previous">
                            <span aria-hidden="true">&lt;</span>
                        </a>
                    </li>
                    <li>
                        <a href="#">1 <span class="sr-only">(current)</span></a>
                    </li>
                    <li>
                        <a href="#">2</a>
                    </li>
                    <li>
                        <a href="#">3</a>
                    </li>
                </ul>
            </nav>
        </div>
        <div role="tabpanel" class="tab-pane" id="tab3">
            <p>tab3 content</p>
            <nav aria-label="...">
               <ul class="pagination">
                    <li class="disabled">
                        <a href="#" aria-label="Previous">
                            <span aria-hidden="true">&lt;</span>
                        </a>
                    </li>
                    <li>
                        <a href="#">1 <span class="sr-only">(current)</span></a>
                    </li>
                    <li>
                        <a href="#">2</a>
                    </li>
                    <li>
                        <a href="#">3</a>
                    </li>
                </ul>
            </nav>
        </div>
    </div>
    <script>
        //标签页的点击切换
        $('#myTab a').click(function (e) {
            e.preventDefault()
            $(this).tab('show')
        })
         //判断a页面中是哪个tab标签页的more跳过来的
         var ur=location.href;
         var type=ur.split('?')[1].split("=")[1];
         switch (type){
            case 'tab1':
                $('#myTab a[href="#tab1"]').tab('show')
                break;
            case 'tab2':
                $('#myTab a[href="#tab2"]').tab('show')
                break;
            case 'tab3':
                $('#myTab a[href="#tab3"]').tab('show')
                break;
         }     
    </script>

    结论: 看思路+代码  感想: 感觉除了用if,else if,else,或者是switch来区分对待它们之外,或许还有什么能节省代码量,或者提高性能,或者提高语句覆盖的方法来弄,看以后学深了就更新。

    示例Demo

  • 免越狱在iPhone里安装旧版APP

    第一步,在itunes里找到APP并复制链接,如图

    第二步,在浏览器里打开这个地址,并复appID,就是图中选中的数字

    第三步,将你获得appID与我给你提供的网址里边的ID替换,并打开,如图
    https://api.unlimapps.com/v1/apple_apps/【你获得的appID】/versions

    第四步,下载并安装Fiddler软件点击下载Fiddler
    (安装后如不能正常打开,请安装.net framework框架)

    配置一下Fiddler,单击“Tools”选择”Fiddler Options”
    然后在”HTTPS” “Decrypt HTTPS traffic”前面打勾(弹出对话框点”Yes”)然后点“OK”,如图

    这样Fiddler就配置好了。

    第五步,打开iTunes,进入你要下载的软件界面。

    第六步,然后在Fiddler左下角命令栏里输入”bpu MZBuy.woa“拦截命令 并回车

    第七步,在iTunes点击下载,返回Fiddler就会看到已经拦截下载成功并单击这条被拦截的信息。

    点击右边选项卡”Inspectors” 然后点击“TextView”图中箭头所指为目前软件最新版本ID,修改为刚刚查到的软件版本ID,然后点击绿色方框里的“Run to Completion”放行。

    回到iTunes可以看到,旧版本微信开始下载了。

    下载完成后,在iTunes资料库里可以看到下载好的旧版本软件,右键显示简介可以看到下载的软件版本(右键选择“在Windows资源管理器中显示”可以找到下载软件所在文件夹),然后用iTunes同步或者第三方助手安装到手机中即可。

    这些步骤第一次操作起来可能感觉有点儿繁琐,但熟悉以后其实很简单,主要分为三个步骤
    1、Fiddler输入拦截命令;
    2、iTunes搜索APP并下载;
    3、返回Fiddler,修改拦截信息里面的软件版本ID并放行。

  • 页面滚到一定高度时导航栏固定

    实现原理:利用jquery得到当前的滚动高度,判断当前滚动高度大于某个高度时,对导航栏设置其样式,将导航栏固定。否则,还原导航栏的样式。

    具体示例代码如下:

    <!DOCTYPE html>
    <html lang="en">
    <head>
    <meta charset="UTF-8">
    <title>无标题文档</title>
    <style>
    body,p,div,ul,li{margin:0px;padding:0px;}
    p{text-align:center;}
    .nav{border:1px solid green;position:relative;height:30px;}
    .nav ul{list-style-type:none;height:30px;background:#333;}
    .nav ul li{float:left;width:100px;text-align:center;height:30px;line-height:30px;}
    .nav ul li a:link{color:white;text-decoration:none;}
    .nav ul li a{display:block;}
    .nav ul li a:hover{background:#f60;}
    .show{background:#f60;}
    .fixednav{position:fixed;top:0px;left:0px;width:100%;}
    .nav ul li>ul li{background:blue;}
    </style>
    <script src="https://cdn.bootcss.com/jquery/1.12.4/jquery.min.js"></script>
    <script>
     $(function(){
    var nav=$(".nav"); //得到导航对象
    var win=$(window); //得到窗口对象
    var sc=$(document);//得到document文档对象。
    win.scroll(function(){
      if(sc.scrollTop()>=60){
        nav.addClass("fixednav"); 
       $(".navTmp").fadeIn(); 
      }else{
       nav.removeClass("fixednav");
       $(".navTmp").fadeOut();
      }
    })  
          //鼠标经过li对象时,查找li下的ul.
     $("ul li").hover(function(){
    $(this).find("ul").show();
     },function(){
    $(this).find("ul").hide();
     })
     })
    </script>
    </head>
    <body>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <div class="navTmp" style="display:none;height:30px;"></div>
    <div class="nav">
      <ul>
        <li class="show"><a href="#">首页</a></li>
        <li><a href="#">随笔</a>
    <ul style="display:none;">
    <li><a href="#">人生感悟</a></li>
        <li><a href="#">成功励志</a></li>
        <li><a href="#">生活锁事</a></li>
        </ul>
    </li>
        <li><a href="#">素材</a></li>
        <li><a href="#">编程</a></li>
      </ul>
    </div>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    <p>我爱学习</p>
    </body>
    </html>

     

  • js判断是否在微信浏览器中打开

    用JS来判断,直接上代码

    function is_weixn(){  
        var ua = navigator.userAgent.toLowerCase();  
        if(ua.match(/MicroMessenger/i)=="micromessenger") {  
            return true;  
        } else {  
            return false;  
        }  
    } 

    通过测试完全通过,无论是android 还是iphone,ipad 都可以,当然我们除了用js来判断之外,用其它语言来判断就更简单了,比如PHP

    function is_weixin(){  
        if ( strpos($_SERVER['HTTP_USER_AGENT'], 'MicroMessenger') !== false ) {  
                return true;  
        }    
        return false;  
    } 
  • 删除CentOS更新后的旧内核

    在CentOS更新后,并不会自动删除旧内核。所以在启动选项中会有多个内核选项,可以手动使用以下命令删除多余的内核:
    1.查看系统当前内核版本:

    # uname -a

    Linux localhost 2.6.18-274.18.1.el5 #1 SMP Thu Feb 9 12:45:52 EST 2012 i686 i686 i386 GNU/Linux
    2.查看系统中全部的内核RPM包:

    # rpm -qa | grep kernel

    kernel-devel-2.6.18-194.el5
    kernel-devel-2.6.18-274.18.1.el5
    kernel-headers-2.6.18-274.18.1.el5
    kernel-2.6.18-194.el5
    kernel-2.6.18-274.18.1.el5
    3.删除旧内核的RPM包

    yum remove kernel-2.6.18-194.el5
    yum remove kernel-devel-2.6.18-194.el5

    4.重启系统

    # reboot

    注意:不需要手动修改/boot/grub/menu.lst