X

由于无法提供服务器的高昂费用,博客即将迁移到github pages...

点击右上的X可以临时关闭此框并阻止跳转^_^

现在带您过去 秒后跳转...

我是如何将mac OS X(10.11.6)的PHP版本升级到5.6.29的


    由于项目和学习的需要,本机曾经升级到了5.5.38已经不够折腾了,所以时候升级一波5.6了(没必要到7的时候,我是不会去升级的)。
    首先直接去搜索引擎找便捷的方法呗,直接就选中了一款来自“简书”的文章,因为它就简单的一条命令:

    curl -s http://php-osx.liip.ch/install.sh | bash -s 5.6
    

    看到这个地址,我心里就放心了!因为上一个版本也是liip的。
    我首先看了一下这个install.sh的内容,确定没有什么危险,里面其实就是检测一下设备的系统版本和cpu类型是否可以升级。
    环境检测没问题就去下载了一个叫做“packager.tgz”的压缩包,然后解压,运行里面的pythony脚本。

    #TYPE = 5.6-10.10
    sudo packager.py install $TYPE-frontenddev
    

    (…继续阅读这篇文章…)

实现寻找两个字符串的最大公子串的方法

    昨天在做土巴兔的校招笔试题的时候遇到的题目,就这一个编程题,然而当时却没有拿下,把它和字符串匹配中的子串包含给弄混了,哎!
    废话少说,上代码!

     $maxlen){	//当本次计数长度大于最大记录时
                        $maxlen = $count;	//更新最大计数长度
                        $start1 = $i;		//更新本次比较的字符串1起点
                        $start2 = $j;		//更新本次比较的字符串2起点
                    }
                }
            }
        }    
        return substr($str1,$start1,$maxlen);	//直接返回字符串1,从$start1起点往后$maxlen最大匹配长度个数的子串
    }
    
    $str1 = 'abcdefgabc';
    $str2 = 'defghijabc';
    echo MaxSubCommonStr($str1,$str2);
    ?>
    

    没什么含金量,只是写出来练练手,思路照搬过来的。

PHP常用算法的方法实现(冒泡、选择、插入、快排、二分查找)

    以前说起写算法,基本上都是拿C语言来写,因为用C可以更清楚的理解各种排序算法和数据结构。今天遍换成使用PHP语言来写几个常用的算法。
    这次要写的算法包括:

    • 冒泡排序
    • 插入排序
    • 选择排序(直接)
    • 快速排序
    • 二分查找

    冒泡:

    < ?php
    $arr = array(4,3,5,6,8,0,10,15,11);
    echo implode(' ',$arr);
    //冒泡排序 最坏 平均O(N^2) 最好O(N)
    function BubbleSort($arr){
    	$length = count($arr);
    	if($length <= 1){
    		return $arr;
    	}
    	for($i=0;$i<$length;$i++){
    		for($j=0;$j<$length-$i-1;$j++){
    			if($arr[$j] > $arr[$j+1]){
    				$tmp = $arr[$j];
    				$arr[$j] = $arr[$j+1];
    				$arr[$j+1] = $tmp;
    			}
    		}
    	}
    	return $arr;
    }
    echo "\nBubbleSort:\n";
    echo implode(' ',BubbleSort($arr))."\n";
    ?>
    

    (…继续阅读这篇文章…)

一种较好的实现PHP异步发送邮件的实现

    前些天在写我的TR-System(社团招新管理系统)的时候,用到了邮箱验证用户注册,也就是注册成功后,需要访问收到的邮件中的URL进行用户激活。这个事件发生在用户提交注册请求之后,系统需要立即发送一封邮件用于激活,但是系统在调用PHPMailer的时候需要进行SMTP连接邮箱系统(用的腾讯企业邮),往往在这个时候会出现等待的情况。如果让用户来承担这个等待时间,体验也太差了!,没见过哪个系统上注册个用户,还需要慢慢等待系统告诉我到底有没有注册成功。
    一开始在写的时候,直接在POST请求中处理,写入数据库后就调用sendEmail方法,情况是这样的:
    1.提交注册 --> 2.写入数据库 --> 3.发送Email --> 4.注册成功。
    这样在用户看来是有一个漫长的等待的。
    实际上应该为:

    1.提交注册 --> 2.写入数据库 --> 3.注册成功。
    ||||||||||||||||||-->发送Email

    这样的才是一个拥有良好用户体验的系统 ^_^ 。
    若是在Java等环境下,咱们可以很好利用多线程,分出来一个任务让另一个线程去完成。
    但是!PHP这个单线程环境下,没有new Thread来搞这个事情啊。 不过,换一个角度,线程不行的,我就给个新进程呗。当然不是在当前进程创建新进程。
    (…继续阅读这篇文章…)

通用笔试-PHP测试编程题[2题]

    水仙花数

    题目描述:
    春天是鲜花的季节,水仙花就是其中最迷人的代表,数学上有个水仙花数,他是这样定义的:
    “水仙花数”是指一个三位数,它的各位数字的立方和等于其本身,比如:153=1^3+5^3+3^3。
    现在要求输出所有在m和n范围内的水仙花数。

    输入
    输入数据有多组,每组占一行,包括两个整数m和n(100< =m<=n<=999)。

    输出
    对于每个测试实例,要求输出所有在给定范围内的水仙花数,就是说,输出的水仙花数必须大于等于m,并且小于等于n,如果有多个,则要求从小到大排列在一行内输出,之间用一个空格隔开;
    如果给定的范围内不存在水仙花数,则输出no;
    每个测试实例的输出占一行。

    样例输入

    100 120
    300 380

    样例输出

    no
    370 371

    < ?php
    echo "Please Input\n";
    $in = '';
    while($in != "\n"){
    	$first = false;
    	// $stdin = fopen("php://stdin",'r');
        // $in = fgets($stdin);
        $in = fgets(STDIN);//使用标准输入
        $args[] = explode(' ',trim($in));
    }
    // fclose($stdin);
    array_pop($args);
    foreach ($args as $item) {
    	if($item[0] <100 || $item[1]>999 || $item[0]>=$item[1]) {
    	  	echo "输入参数不合法!\n";
    	   	exit(0);
    	}
    	$start = $item[0];
    	$end = $item[1];
    	$res = array();
    	while($start < = $end){
    		$a = floor($start/100);
    		$b = floor(($start-$a*100)/10);
    		$c = $start%10;
    		if($start == ($a*$a*$a+$b*$b*$b+$c*$c*$c)){
    		    $res[] = $start;
    		}
    		$start += 1;
    	}
    	echo empty($res)?"No\n":implode(' ',$res)."\n";
    }
    ?>
    

    第二题:
    (…继续阅读这篇文章…)

[作业练习]带数据库的简易购物车

    在前一次作业的基础上([作业]JavaBean+Jsp简易购物车实现),加上数据库来管理商品和购买记录。
    最后结果展示:http://demo.dshui.wang/tomcat/ShopCartDemo/
    首先,建立数据表:

    #用户表
    CREATE TABLE `cart_users` (
      `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
      `username` varchar(80) NOT NULL DEFAULT '',
      `password` varchar(220) NOT NULL DEFAULT '',
      PRIMARY KEY (`id`),
      UNIQUE KEY `username` (`username`)
    ) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8;
     (...继续阅读这篇文章...)

[作业]Servlet简易聊天室

    简单例子-Servlet聊天室,所用工具:NetBeans IDE(配备GlassFish)
    本次例子重在思路,页面未做任何美化。
    最后结果展示:http://demo.dshui.wang/tomcat/First_chat_room/
    首先,需要一个登陆页面。
    Login.jsp

    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <%
        Cookie[] cookies = request.getCookies();
        String uname = "";
        String upwd = "";
        if(cookies!=null){
            for(int i=0;i
    
    
        
            牛逼的登陆界面
            
        
        
            
    用户名:
    密码:
    记住信息

    新建一个用来处理登录信息的Servlet: Main.java 所有的处理都在DoPost()完成

    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package User;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    /**
     *
     * @author Administrator
     */
    public class Main extends HttpServlet {
    
        /**
         * Processes requests for both HTTP
         * GET and
         * POST methods.
         *
         * @param request servlet request
         * @param response servlet response
         * @throws ServletException if a servlet-specific error occurs
         * @throws IOException if an I/O error occurs
         */
        protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            PrintWriter out = response.getWriter();
            try {
                /* TODO output your page here. You may use following sample code. */
            } finally {            
                out.close();
            }
        }
    
        // 
        /**
         * Handles the HTTP
         * GET method.
         *
         * @param request servlet request
         * @param response servlet response
         * @throws ServletException if a servlet-specific error occurs
         * @throws IOException if an I/O error occurs
         */
        @Override
        protected void doGet(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            processRequest(request, response);
        }
    
        /**
         * Handles the HTTP
         * POST method.
         *
         * @param request servlet request
         * @param response servlet response
         * @throws ServletException if a servlet-specific error occurs
         * @throws IOException if an I/O error occurs
         */
        @Override
        protected void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            //processRequest(request, response);
            String username,password,remember;
            HttpSession session = request.getSession(true);
            username = (String) request.getParameter("username");
            password = (String) request.getParameter("password");
            remember = (String) request.getParameter("remember");
            System.out.println("remember:"+remember);
            System.out.println(username);
            System.out.println(password);
            if(username != null && username.equals("201321092028") && password.equals("123456"))
            {
                if(remember != null && remember.equals("true"))
                {
                    Cookie cookie1 = new Cookie("remname",username);
                    Cookie cookie2 = new Cookie("rempwd",password);
                    cookie1.setMaxAge(60*60*24*5);
                    cookie2.setMaxAge(60*60*24*5);
                    response.addCookie(cookie1);
                    response.addCookie(cookie2);
                }
                session.setAttribute("UserName",username);
                session.setAttribute("IsLogin","true");
                response.sendRedirect("LoginSuccess.jsp");
            }else if(username != null && username.equals("201321092027") && password.equals("123456"))
            {
                if(remember.equals("true"))
                {
                    Cookie cookie1 = new Cookie("remname",username);
                    Cookie cookie2 = new Cookie("rempwd",password);
                    cookie1.setMaxAge(60*60*24*5);
                    cookie2.setMaxAge(60*60*24*5);
                    response.addCookie(cookie1);
                    response.addCookie(cookie2);
                }
                session.setAttribute("UserName",username);
                session.setAttribute("IsLogin","true");
                response.sendRedirect("LoginSuccess.jsp");
            }
            else
            {
                session.setAttribute("IsLogin","false");
                response.sendRedirect("LoginFail.jsp");
            }
        }
    
        /**
         * Returns a short description of the servlet.
         *
         * @return a String containing servlet description
         */
        @Override
        public String getServletInfo() {
            return "Short description";
        }// 
    }
    
    

    如果登录失败,跳转到LoginFail.jsp

    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    
    
        
            
            
            请告诉他,登录失败了
        
        
            嗨,登陆失败了哟,3秒后跳转到登录页重新登陆哟! 点击此处直接跳转
        
    
    

    登录成功,则跳转到FrameSet窗口框架 LoginSuccess.jsp

    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <%
      session = request.getSession(true);
      String username = "";
      if(session.getAttribute("UserName") != null)
      {
          username = session.getAttribute("UserName").toString();
      }
      if(username != null && !username.equals(""))
      {
          if(!session.getAttribute("IsLogin").equals("true"))
          {System.out.println(session.getAttribute("IsLogin").toString());
              response.sendRedirect("Login.jsp");
          }
      }else{
          response.sendRedirect("Login.jsp");
      }
     %>
    
    
        
            
            
        
    
    

    上面的Frame加载了两个页面,一个是用来展示Messagebox聊天记录的,一个是用户的输入框
    Messagebox.Java

    /*
     * To change this template, choose Tools | Templates
     * and open the template in the editor.
     */
    package User;
    
    import java.io.IOException;
    import java.io.PrintWriter;
    import javax.servlet.ServletException;
    import javax.servlet.http.Cookie;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpSession;
    
    /**
     *
     * @author Administrator
     */
    public class messagebox extends HttpServlet {
    
        /**
         * Processes requests for both HTTP GET and POST
         * methods.
         *
         * @param request servlet request
         * @param response servlet response
         * @throws ServletException if a servlet-specific error occurs
         * @throws IOException if an I/O error occurs
         */
        protected void processRequest(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            response.setContentType("text/html;charset=UTF-8");
            request.setCharacterEncoding("UTF-8");
            PrintWriter out = response.getWriter();
            try {
                /* TODO output your page here. You may use following sample code. */
                HttpSession session = request.getSession(true);
                String username = "";
                if(session.getAttribute("UserName") != null)
                {
                    username = session.getAttribute("UserName").toString();
                }
                if(username != null && !username.equals(""))
                {
                    if(!session.getAttribute("IsLogin").equals("true"))
                    {System.out.println(session.getAttribute("IsLogin").toString());
                        response.sendRedirect("Login.jsp");
                        //request.getRequestDispatcher("/Login.html").forward(request, response);
                    }
                }else{
                    response.sendRedirect("Login.jsp");
                }
                String words = (String) getServletConfig().getServletContext().getAttribute("Words");
                String messages = "";
                if(request.getParameter("usermessages") != null)
                {
                    messages = request.getParameter("usermessages");
                }
                if (words == null) {
                    words = "系统提示:可以聊天\n";
                } else if(!messages.equals("")){
                    words = (String) getServletConfig().getServletContext().getAttribute("Words") + username + " 说:"+messages + "\n";
                }
                getServletConfig().getServletContext().setAttribute("Words", words);
                String temp = (String) getServletConfig().getServletContext().getAttribute("online");
                if(temp==null)temp="0";
                out.println("");
                out.println("");
                out.println("Servlet messagebox");
                out.println("");
                out.println("");
                out.println("");
                out.println("

    当前在线:"); out.println(temp); out.println("人

    "); out.println(""); out.println(""); out.println(""); } finally { out.close(); } } // /** * Handles the HTTP GET method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Handles the HTTP POST method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Returns a short description of the servlet. * * @return a String containing servlet description */ @Override public String getServletInfo() { return "Short description"; }// }

    用户填写框:userinput.jsp

    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <% session = request.getSession(true);%>
    
    
        
            
            输入框
        
        
            
    退出登陆

    我们还需要一个退出登录的功能:Loginout.jsp

    <%@page contentType="text/html" pageEncoding="UTF-8"%>
    <% 
        session = request.getSession(true);
        session.removeAttribute("UserName");
        session.removeAttribute("IsLogin");
    %>
    
    
        
            
            
            Logout
        
        
            

    成功退出!

    注意了,既然是聊天室的话,也要知道当前有多少人在线吧,这个用监听来实现:SessionListrner.java

    /*
     * To change this license header, choose License Headers in Project Properties.
     * To change this template file, choose Tools | Templates
     * and open the template in the editor.
     */
    package Listener;
    
    import javax.servlet.annotation.WebListener;
    import javax.servlet.http.HttpSessionAttributeListener;
    import javax.servlet.http.HttpSessionBindingEvent;
    import javax.servlet.http.HttpSessionEvent;
    import javax.servlet.http.HttpSessionListener;
    
    /**
     * Web application lifecycle listener.
     *
     * @author Anthony
     */
    @WebListener()
    public class SessionListenr implements HttpSessionListener, HttpSessionAttributeListener {
    
        @Override
        public void sessionCreated(HttpSessionEvent se) {
            
        }
    
        @Override
        public void sessionDestroyed(HttpSessionEvent se) {
            
        }
    
        @Override
        public void attributeAdded(HttpSessionBindingEvent event) {
            if(event.getName().equals("UserName"))
            {
                String current = (String) event.getSession().getServletContext().getAttribute("online");
                String info = (String) event.getSession().getServletContext().getAttribute("Words");
                if(info==null)info ="";
                if(current == null) current="0";
                int c=Integer.parseInt(current);
                c++;
                current = String.valueOf(c);
                event.getSession().getServletContext().setAttribute("online", current);
                event.getSession().getServletContext().setAttribute("Words", info+event.getValue()+" 加入聊天室\n");
            }
        }
    
        @Override
        public void attributeRemoved(HttpSessionBindingEvent event) {
            if(event.getName().equals("UserName"))
            {
                String current = (String) event.getSession().getServletContext().getAttribute("online");
                String info = (String) event.getSession().getServletContext().getAttribute("Words");
                if(info==null)info ="";
                if(current==null)current = "0";
                int c = Integer.parseInt(current);
                c--;
                current = String.valueOf(c);
                event.getSession().getServletContext().setAttribute("online", current);
                event.getSession().getServletContext().setAttribute("Words", info+event.getValue()+" 离开了聊天室\n");
            }
        }
    
        @Override
        public void attributeReplaced(HttpSessionBindingEvent event) {
            //throw new UnsupportedOperationException("Not supported yet."); //To change body of generated methods, choose Tools | Templates.
        }
    }
    

    附上NetBean项目工程:
    链接: http://pan.baidu.com/s/1qWL2xRm 密码: 22wa

1/2 1 2