图片 1

php实现redis的服务端的示例,php登录与退出登录实例代码

login.htm

大家都知道redis是用C来实现的,现在我用php来实现一个简单的仅支持SET和GET命令的redis服务端,主要是为了更好的了解redis的服务端和php的网络编程.

如果 PHP 的设置选项 register_globals 为
on,则相关的变量名将也会存在。从 PHP 4.2.0 版本开始,register_globals
的默认值被设为 off。

 代码如下

代码如下:

我们假设文件上传字段的名称为
userfile。名称可随意命名。

<!DOCTYPE html PUBLIC “-//W3C//DTD XHTML 1.0 Transitional//EN”
“;
<html xmlns=”;
<head>
<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″
/>
<title>无标题文档</title>
</head>

<?php
/**
 * 多进程阻塞式
 */
class Xtgxiso_server
{
    private $socket = false;
    private $process_num = 100;
    public $redis_kv_data = array();
    public $onMessage = null;

$_FILES[‘userfile’][‘name’]
客户端机器文件的原名称。

<body>
<form id=”form1″ name=”form1″ method=”post” action=””>
  <p>
    <label for=”user”></label>
    <input type=”text” name=”user” id=”user” />
  </p>
  <p>
    <label for=”pwd”></label>
    <input type=”text” name=”pwd” id=”pwd” />
  </p>
  <p>
    <input type=”submit” name=”button” id=”button” value=”提交”
/>
  </p>
</form>
</body>
</html>

    function __construct($host=”0.0.0.0″,$port=1215)
    {
        $this->socket =
stream_socket_server(“tcp://”.$host.”:”.$port,$errno, $errstr);
        if (!$this->socket) die($errstr.”–“.$errno);
        echo “listen $host $port \r\n”;
        ini_set(“memory_limit”, “128M”);
    }

$_FILES[‘userfile’][‘type’]
文件的 MIME 类型,需要浏览器提供该信息的支持,例如“image/gif”。

login.php

    private function parseRESP(&$conn){
        $line = fgets($conn);
        if($line === ” || $line === false)
        {
            return null;
        }
        $type = $line[0];
        $line =
mb_substr($line,1,-2);
        switch ( $type ){
            case “*”:
                $count = (int) $line;
                $data = array();
                for ($i = 1; $i <= $count; $i++) {
                    $data[] = $this->parseRESP($conn);
                }
                return $data;
            case “$”:
                if ($line == ‘-1’) {
                    return null;
                }
                $length = $line + 2;
                $data = ”;
                while ($length > 0) {
                    $block = fread($conn, $length);
                    if ($length !== strlen($block)) {
                        throw new Exception(‘RECEIVING’);
                    }
                    $data .= $block;
                    $length -= mb_strlen($block);
                }
                return mb_substr($data, 0, -2);
        }
        return $line;
    }

$_FILES[‘userfile’][‘size’]
已上传文件的大小,单位为字节。

 代码如下

    private function start_worker_process(){
        $pid = pcntl_fork();
        switch ($pid) {
            case -1:
                echo “fork error : {$i} \r\n”;
                exit;
            case 0:
                while ( 1 ) {
                    echo  “waiting…\n”;
                    $conn = stream_socket_accept($this->socket,
-1);
                    if ( !$conn ){
                        continue;
                    }
                   
//”*3\r\n$3\r\nSET\r\n$5\r\nmykey\r\n$7\r\nmyvalue\r\n”
                    while(1){
                        $arr = $this->parseRESP($conn);
                        if ( is_array($arr) ) {
                            if ($this->onMessage) {
                                call_user_func($this->onMessage,
$conn, $arr);
                            }
                        }else if ( $arr ){
                            if ($this->onMessage) {
                                call_user_func($this->onMessage,
$conn, $arr);
                            }
                        }else{
                            fclose($conn);
                            break;
                        }
                    }
                }
            default:
                $this->pids[$pid] = $pid;
                break;
        }
    }

$_FILES[‘userfile’][‘tmp_name’]
文件被上传后在服务端储存的临时文件名。

function showPage() //判断是否登录 未登录直接跳转至登录页面
{
 if(!isset($_SESSION[“user”]) && !isset($_SESSION[“pwd”]))
 {
  if(isset($_COOKIE[“user”]) && isset($_COOKIE[“pwd”]))
  {
   $sql = “select * from
pm_user where u_user=’$_COOKIE[user]'”;
   $query = mysql_query($sql);
   $isUser = is_array($row = mysql_fetch_array($query));
//判断用户名
   $isPwd = $isUser ? $row[“u_pwd”] == $_COOKIE[“pwd”] : false;
//判断密码
   if($isPwd)
   {
    $_SESSION[“user”]  = $_COOKIE[“user”];
    $_SESSION[“pwd”]   = $_COOKIE[“pwd”];
    $_SESSION[“id”]    = $_COOKIE[“id”];
    $_SESSION[“name”]  = $_COOKIE[“name”];
   }
  }
 }
 
 if(!isset($_SESSION[“user”]) && !isset($_SESSION[“pwd”]))
 {
  echo
‘<script>alert(“你还没登录!正在返回登录页面…”);location.href=”index.php”;</script>’;
  exit();
 }
}

    public function run(){
        for($i = 1; $i <= $this->process_num; $i++){
            $this->start_worker_process();
        }

$_FILES[‘userfile’][‘error’]
和该文件上传相关的错误代码。[‘error’] 是在 PHP 4.2.0 版本中增加的。

退出登录

        while(1){
            foreach
($this->pids as $i => $pid) {
                if($pid) {
                    $res = pcntl_waitpid($pid, $status,WNOHANG);

处理函数:

out.php

                    if ( $res == -1 || $res > 0 ){
                        $this->start_worker_process();
                        unset($this->pids[$pid]);
                    }
                }
            }
            sleep(1);
        }
    }

move_uploaded_file()
(PHP 4 >= 4.0.3, PHP 5)

 代码如下

}
$server =  new Xtgxiso_server();

move_uploaded_file — 将上传的文件移动到新位置

function loginOut() //登出函数
{
 if(isset($_GET[“login”]) == ‘out’)
 {
  $_SESSION[“user”]  = ”;
  $_SESSION[“pwd”]   = ”;
  $_SESSION[“id”]    = ”;
  $_SESSION[“name”]  = ”;
  session_destroy();
  echo ‘<script>alert(“退出成功!”);location.href=”index.php”;
</script>’;
 }
}

$server->onMessage = function($conn,$info) use($server){
    if ( is_array($info) ){
        if ( $info[“0”] == “SET” ) {
            $key = $info[1];
            $val = $info[2];
            $server->redis_kv_data[$key] = $val;
            fwrite($conn, “+OK\r\n”);
        }else if ( $info[“0”] == “GET” ){
            $key = $info[1];
            fwrite($conn,
“$”.strlen($server->redis_kv_data[$key]).”\r\n”.$server->redis_kv_data[$key].”\r\n”);
        }else{
            fwrite($conn,”+OK\r\n”);
        }
    }else{
        fwrite($conn,”+OK\r\n”);
    }
};

说明
bool move_uploaded_file ( string filename, string destination )

$server->run();
通过如下命令来测试PHP实现的性能:

本函数检查并确保由 filename 指定的文件是合法的上传文件(即通过 PHP 的
HTTP POST 上传机制所上传的)。如果文件合法,则将其移动为由 destination
指定的文件。

redis-benchmark -h 10.170.233.221 -p 1215 -t set -n 80000 -q

如果 filename
不是合法的上传文件,不会出现任何操作,move_uploaded_file() 将返回
FALSE。

图片 1

如果 filename
是合法的上传文件,但出于某些原因无法移动,不会出现任何操作,move_uploaded_file()
将返回 FALSE。此外还会发出一条警告。

 

如果目标文件已经存在,将会被覆盖。

看来还是不错的,大家有兴趣可以再实现其他命令!

示例:

 代码如下

if(move_uploaded_file($_FILES[“magfile”][“tmp_name”],
$uploaddir))
  {
    echo “Update OK!”;
  }

发表评论