Memcache 入门教程 Memcache php 缓存技术

 更新时间:2016年11月25日 16:28  点击:1617

Memcache是什么
Memcache是danga.com的一个项目,最早是为 LiveJournal 服务的,目前全世界不少人使用这个缓存项目来构建自己大负载的网站,来分担数据库教程的压力。
它可以应对任意多个连接,使用非阻塞的网络IO。由于它的工作机制是在内存中开辟一块空间,然后建立一个HashTable,Memcached自管理这些HashTable。
Memcache官方网站:http://www.danga.com/memcached,更多详细的信息可以来这里了解

为什么会有Memcache和memcached两种名称?
其实Memcache是这个项目的名称,而memcached是它服务器端的主程序文件名,知道我的意思了把~~~~。一个是项目名称,一个是主程序文件名,在网上看到了很多人不明白,于是混用了。

Memcache的安装
分为两个过程:memcache服务器端的安装和memcached客户端的安装。
所谓服务器端的安装就是在服务器(一般都是linux系统)上安装Memcache实现数据的存储
所谓客户端的安装就是指php教程(或者其他程序,Memcache还有其他不错的api接口提供)去使用服务器端的Memcache提供的函数,需要php添加扩展。

PHP的Memcache

复制代码 代码如下:
< ?php
//连接

$mem = new Memcache;
$mem->connect("192.168.0.200", 12000);

//保存数据

$mem->set('key1', 'This is first value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val ."<br />";

//替换数据

$mem->replace('key1', 'This is replace value', 0, 60);
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br />";

//保存数组

$arr = array('aaa', 'bbb', 'ccc', 'ddd');
$mem->set('key2', $arr, 0, 60);
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br />";

//删除数据

$mem->delete('key1');
$val = $mem->get('key1');
echo "Get key1 value: " . $val . "<br />";

//清除所有数据

$mem->flush();
$val2 = $mem->get('key2');
echo "Get key2 value: ";
print_r($val2);
echo "<br />";

//关闭连接
$mem->close();
?>

如果正常的话,浏览器将输出:

Get key1 value: This is first value
Get key1 value: This is replace value
Get key2 value: Array ( [0] => aaa [1] => bbb [2] => ccc [3] => ddd )
Get key1 value:
Get key2 value:

程序代码分析

初始化一个Memcache的对象:

$mem = new Memcache;

连接到我们的Memcache服务器端,第一个参数是服务器的IP地址,也可以是主机名,第二个参数是Memcache的开放的端口:

$mem->connect("192.168.0.200", 12000);

保存一个数据到Memcache服务器上,第一个参数是数据的key,用来定位一个数据,第二个参数是需要保存的数据内容,这里是一个字符串,第三个参数是一个标记,一般设置为0或者MEMCACHE_COMPRESSED就行了,第四个参数是数据的有效期,就是说数据在这个时间内是有效的,如果过去这个时间,那么会被Memcache服务器端清除掉这个数据,单位是秒,如果设置为0,则是永远有效,我们这里设置了60,就是一分钟有效时间:
$mem->set(‘key1‘, ‘This is first value', 0, 60);

从Memcache服务器端获取一条数据,它只有一个参数,就是需要获取数据的key,我们这里是上一步设置的key1,现在获取这个数据后输出输出:

$val = $mem->get('key1′);
echo "Get key1 value: " . $val;

现在是使用replace方法来替换掉上面key1的值,replace方法的参数跟set是一样的,不过第一个参数key1是必须是要替换数据内容的key,最后输出了:

$mem->replace(‘key1′, ‘This is replace value', 0, 60);
$val = $mem->get(‘key1′);
echo "Get key1 value: " . $val;

同样的,Memcache也是可以保存数组的,下面是在Memcache上面保存了一个数组,然后获取回来并输出

$arr = array(‘aaa', ‘bbb', ‘ccc', ‘ddd');
$mem->set(‘key2′, $arr, 0, 60);
$val2 = $mem->get(‘key2′);
print_r($val2);

现在删除一个数据,使用delte接口,参数就是一个key,然后就能够把Memcache服务器这个key的数据删除,最后输出的时候没有结果

$mem->delete(‘key1′);
$val = $mem->get(‘key1′);
echo "Get key1 value: " . $val . "<br>";

最后我们把所有的保存在Memcache服务器上的数据都清除,会发现数据都没有了,最后输出key2的数据为空,最后关闭连接

$mem->flush();
$val2 = $mem->get(‘key2′);
echo "Get key2 value: ";
print_r($val2);
echo "<br>";

Memcache的使用
使用Memcache的网站一般流量都是比较大的,为了缓解数据库的压力,让Memcache作为一个缓存区域,把部分信息保存在内存中,在前端能够迅速的进行存取。那么一般的焦点就是集中在如何分担数据库压力和进行分布式,毕竟单台Memcache的内存容量的有限的。我这里简单提出我的个人看法,未经实践,权当参考。

分布式应用
Memcache本来支持分布式,我们客户端稍加改造,更好的支持。我们的key可以适当进行有规律的封装,比如以user为主的网站来说,每个用户都有User ID,那么可以按照固定的ID来进行提取和存取,比如1开头的用户保存在第一台Memcache服务器上,以2开头的用户的数据保存在第二胎Mecache服务器上,存取数据都先按照User ID来进行相应的转换和存取。

但是这个有缺点,就是需要对User ID进行判断,如果业务不一致,或者其他类型的应用,可能不是那么合适,那么可以根据自己的实际业务来进行考虑,或者去想更合适的方法。

减少数据库压力
这个算是比较重要的,所有的数据基本上都是保存在数据库当中的,每次频繁的存取数据库,导致数据库性能极具下降,无法同时服务更多的用户,比如MySQL,特别频繁的锁表,那么让Memcache来分担数据库的压力吧。我们需要一种改动比较小,并且能够不会大规模改变前端的方式来进行改变目前的架构。

我考虑的一种简单方法:
后端的数据库操作模块,把所有的Select操作提取出来(update/delete/insert不管),然后把对应的SQL进行相应的hash算法计算得出一个hash数据key(比如MD5或者SHA),然后把这个key去Memcache中查找数据,如果这个数据不存在,说明还没写入到缓存中,那么从数据库把数据提取出来,一个是数组类格式,然后把数据在set到Memcache中,key就是这个SQL的hash值,然后相应的设置一个失效时间,比如一个小时,那么一个小时中的数据都是从缓存中提取的,有效减少数据库的压力。缺点是数据不实时,当数据做了修改以后,无法实时到前端显示,并且还有可能对内存占用比较大,毕竟每次select出来的数据数量可能比较巨大,这个是需要考虑的因素。

Memcache的安全
我们上面的Memcache服务器端都是直接通过客户端连接后直接操作,没有任何的验证过程,这样如果服务器是直接暴露在互联网上的话是比较危险,轻则数据泄露被其他无关人员查看,重则服务器被入侵,因为Mecache是以root权限运行的,况且里面可能存在一些我们未知的bug或者是缓冲区溢出的情况,这些都是我们未知的,所以危险性是可以预见的。为了安全起见,我做两点建议,能够稍微的防止黑客的入侵或者数据的泄露。

内网访问
最好把两台服务器之间的访问是内网形态的,一般是Web服务器跟Memcache服务器之间。普遍的服务器都是有两块网卡,一块指向互联网,一块指向内网,那么就让Web服务器通过内网的网卡来访问Memcache服务器,我们Memcache的服务器上启动的时候就监听内网的IP地址和端口,内网间的访问能够有效阻止其他非法的访问。
# memcached -d -m 1024 -u root -l 192.168.0.200 -p 11211 -c 1024 -P /tmp/memcached.pid
Memcache服务器端设置监听通过内网的192.168.0.200的ip的11211端口,占用1024MB内存,并且允许最大1024个并发连接

设置防火墙
防火墙是简单有效的方式,如果却是两台服务器都是挂在网的,并且需要通过外网IP来访问Memcache的话,那么可以考虑使用防火墙或者代理程序来过滤非法访问。
一般我们在Linux下可以使用iptables或者FreeBSD下的ipfw来指定一些规则防止一些非法的访问,比如我们可以设置只允许我们的Web服务器来访问我们Memcache服务器,同时阻止其他的访问。

# iptables -F
# iptables -P INPUT DROP
# iptables -A INPUT -p tcp -s 192.168.0.2 –dport 11211 -j ACCEPT
# iptables -A INPUT -p udp -s 192.168.0.2 –dport 11211 -j ACCEPT

上面的iptables规则就是只允许192.168.0.2这台Web服务器对Memcache服务器的访问,能够有效的阻止一些非法访问,相应的也可以增加一些其他的规则来加强安全性,这个可以根据自己的需要来做。

//发送留言

require("global.func.php教程");
$fid=isset($_GET["id"])?intval($_GET["id"]):0;
$page=isset($_GET["page"])?intval($_GET["page"]):1;
if($_SERVER["REQUEST_METHOD"]=="POST")
{
 if(!file_exists("1.php"))
 {
  writeFile("1.php",$array=array());
 }
 $arr=require("1.php");
 $post=array();
 unset($_POST["Submit"]);
 foreach($_POST as $k=>$v)
 {
  $post[$k]=addslashes(htmlspecialchars($v));
 }
 $post["content"]=str_replace(" ","<br>",$post["content"]);
 $post["id"]=count($arr)+1;
 $post["date"]=time();
 $post["fid"]=$fid;
 $post["ip"]=$_SERVER["REMOTE_ADDR"];
 $arr[]=$post;

 writeFile("1.php",$arr);
 
 echo "<script>location.href="index.php?page=$page"</script>";
 exit;
}
?>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<title>发帖</title>
<script>
var arr=new Array();

     function ckusername()
     {
      if(document.form1.username.value.length<3)
      {
       document.getElementById("user_msg").innerHTML="<font color="red"><b>用户名不能小于3个字符</b></font>";
       arr[0]=1;
      }else
      {
      document.getElementById("user_msg").innerHTML="<font color="green"><b>√</b></font>";
      arr[0]=0;
      }
      
      
     }
     function ckcontent()
     {
      
      if(document.form1.content.value.length<8||document.form1.content.value.length>255)
      {
       document.getElementById("content_msg").innerHTML="<font color="red"><b>内容8-255个字符</b></font>";
       arr[1]=1;
      }else
      {
       document.getElementById("content_msg").innerHTML="<font color="green"><b>√</b></font>";
       arr[1]=0;
      }
     }
     
     function c()
     {
      if(arr.length<2)
      {
       return false;
      }
      for(x in arr)
      {
       if(arr[x]==1)
       {
        return false;
       }
      }
      
      form1.submit();
     
     }
     
</script>
</head>
<body>
<form name="form1" method="post" action="">
  <table width="100%"  border="0">
    <tr>
      <td>用户
      <input name="username" type="text" id="id" onBlur="ckusername()" ></td>
    </tr>
 <tr>
      <td><div id="user_msg"></div>
      </td>
    </tr>
    <tr>
      <td><textarea name="content" cols="100" rows="6" id="content" onBlur="ckcontent()"></textarea></td>
    </tr>
 <tr>
      <td><div id="content_msg"></div>
      </td>
    </tr>
    <tr>
      <td><div align="center">
        <input type="button" name="Submit" value="提交" onClick="c();">
      </div></td>
    </tr>
  </table>
</form>
</body>

</html>

<?php
ini_set("display_errors",0);
require("global.func.php");
?>

显示像163评论
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.111cn.net/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<style>
.b{
border:1px dotted #e3e3e3;
word-wrap:break-word;
word-break:break-all;
}


</style>

<title>PPC备用论坛(递归限制15层+主题)</title>
</head>
<body>
<?php
echo "<a href="post.php?page=1"> 发帖</a><br>";
if(file_exists("1.php"))
{
 $__array=require("1.php");
}
else
{
 $__array=array();
}
$page=isset($_GET["page"])?intval($_GET["page"]):1;
$pagesize=5;
$offset=($page-1)*$pagesize;
$__str="";
function getTotal()
{
 global $__array;
 $i=0;
 foreach($__array as $k=>$v)
 {
  if($v["fid"]==0)
  {
   $i=$i+1;
  }
 }
 return $i;
}
function getFid0()
{
 global $__array,$__str;
 
 foreach ($__array as $k=>$v)
 {
  if($v["fid"]==0)
  {
   $fid0[]=$v;
  }
  
 }
 return array_reverse($fid0);
}
$fid0=getFid0();
function show($fid0,$pagesize,$offset)
{
 global $__str,$page;
 foreach (array_slice($fid0,$offset,$pagesize,true) as $k=>$v)
 {
  
   $__str.="<blockquote class="b"><p>";
   $__str.=$v["ip"]."用户:".$v["username"]."内容:".$v["content"]."<a id="a1" href="post.php?id=".$v["id"]."&page=$page">回复</a>";
   showChild($v["id"]);
   $__str.="</p></blockquote>";
   
  
  
 }
}

function showChild($id,$i=0)
{
 global $__array,$__str,$page,$offset;
 
 
 if($i==15)//递归层数
 {
  return;
 }
 $i++;
 foreach($__array as $k=>$v)
 {
  if($v["fid"]==$id)
  {
   $__str.= "<blockquote class="b"><p id="a1">";
   $__str.= $__array[$k]["ip"]."用户:".$__array[$k]["username"]."内容:".$__array[$k]["content"]."<a href="post.php?id=".$v["id"]."&page=$page">回复</a>";
   showChild($v["id"],$i);
   $__str.= "</p></blockquote>";
  }
 }
}

show($fid0,$pagesize,$offset);
$total=getTotal();

echo $__str;
pageft($total,$pagesize,"index.php");
echo "<br>".$pagenav;
?>
</body>
</html>

global.func.php文件代码如下

<?php

function writeFile($id,$array)
{
 $content="<?php return ".var_export($array,true)."?>";
 return safe_file_put_contents($id,$content);
}
/**
*写入文件
*@param string $filename
*@param string $contents
*@return boolean
*/
function safe_file_put_contents($filename,&$contents)
{
 $fp=fopen($filename,"wb");
 if($fp)
 {
  flock($fp,LOCK_EX);
  fwrite($fp,$contents);
  flock($fp,LOCK_UN);
  fclose($fp);
  return true;
 }else
 {
  return false;
 }
}


/**
*读取文件
*@param string $filename
*@return $data|false
*/
function safe_file_get_contents($filename)
{
 $fp=fopen($filename,"rb");
 if($fp)
 {
  flock($fp,LOCK_SH);
  clearstatcache();
  $filesize=filesize($filename);
  if($filesize>0)
  {
   $data=fread($fp,$filesize);
  }else
  {
   $data=false;
  }
  flock($fp,LOCK_UN);
  fclose($fp);
  return $data;
 }else
 {
  return false;
 }
}
function pageft($total,$displaypg=10,$url=''){
global $page,$firstcount,$pagenav,$_SERVER;

$GLOBALS["displaypg"]=$displaypg;

if(!$page) $page=1;

if(!$url){ $url=$_SERVER["REQUEST_URI"];}

$parse_url=parse_url($url);
@$url_query=$parse_url["query"];
if($url_query){
$url_query=ereg_replace("(^|&)page=$page","",$url_query);

$url=str_replace($parse_url["query"],$url_query,$url);

if($url_query) $url.="&page"; else $url.="page";
}else {
$url.="?page";
}

$lastpg=ceil($total/$displaypg);
$page=min($lastpg,$page);
$prepg=$page-1;
$nextpg=($page==$lastpg ? 0 : $page+1);
if(!$page) $page=1;
$firstcount=($page-1)*$displaypg;


$pagenav.=" <a href='$url=1' class='s1'>首页</a> ";
if($prepg) $pagenav.=" <a href='$url=$prepg' class='s1'>上页</a> "; else $pagenav.="上页 ";
if($nextpg) $pagenav.=" <a href='$url=$nextpg' class='s1'>下页</a> "; else $pagenav.="下页 ";
$pagenav.=" <a href='$url=$lastpg' class='s1'>尾页</a>";

$pagenav.=" 到 <select name='topage' size='1' onchange='window.location="$url="+this.value'> ";
for($i=1;$i<=$lastpg;$i++){
if($i==$page) $pagenav.="<option value='$i' selected>$i</option> ";
else $pagenav.="<option value='$i'>$i</option> ";
}
$pagenav.="</select> 页";
}
?>

//保存的1.php文件数数组形式,如下格式

<?php return array (
  0 =>
  array (
    'username' => 'test',
    'content' => '111cn.net',
    'id' => 1,
    'date' => 1253853347,
    'fid' => 0,
    'ip' => '116.226.2.200',
  ),
  1 =>
  array (
    'username' => 'aaaaaaaaaaad',
    'content' => 'www.111cn.net',
    'id' => 2,
    'date' => 1253857672,
    'fid' => 0,
    'ip' => '116.226.6.188',
  ),
 
)?>

 

本篇实例主要是讲到关于如何使用php中正则表达试来获取我们想要的东西,上面的实例就是要把文章内容字符串的链接地址与图片地址全部取出来,所有我们要正则就方便多了。
 代码如下 复制代码

  $body ='<img src="Image/2009112422220515.gif" alt="楼盘网loupan"  border="0" />';
  $Link ='fdas<a href="http://www.111cn.net" target="_blank">网页制作教程教程</a>';
  $array ="aa,bb,cc,ee,ff,ss,ffa,ees,fde,ecd";
  $v =explode( ',',$array);
   if( is_array( $v) )
  {
   
    $vlen = sizeof( $v )-1;     
    $mt = mt_rand(1,$vlen );   
    $motype =$v[$mt];
  }
  else
  {
   $motype = $array;
  }
 

     $Link = preg_match_all('/<a(.*?)href="(.*?)"/i',$Link,$link_array);
     preg_match_all("/(src|SRC)=["|'| ]{0,}(Image/(.*).(gif|jpg|jpeg|png|bmp))/isU",$body,$img_array);
 
  print_r( $img_array[2][0] );
  echo '<hr/>';
  echo $link_array[2][0];


  本站原创教程,转载注明来源www.111cn.net

 

PHP3 Cryption是一个非常容易被破解,不安全的加密功能,不应该是非常重要的东西用。虽然加密是好的,它不会阻碍对尖端开裂程序的严格考验。

不过,试试吧...这是一个伟大的方式来加密和解密字符串。与许多隐窝功能,这是双向的。基于一个密码,您可以加密或解密。您也可以解密或加密过无数次,通过循环或其他方法。字母表中的字符也是变化的。所有这些事情让你修改和巩固加密。

关于这最佳的部分?您可以加密与解密或一张纸和一支铅笔一块。这需要相当长一点,但你并不需要一台电脑是附近使用它,如果你曾经失去的代码,如果你还记得你的技术可以解密。

我写在约一小时这些功能,经过几次不成功的和令人沮丧的尝试,并获得了更长的时间我没有出路的。成功的那天后的最佳方式做它突然实现。

请注意,这不会加密/解密无形字符(空格),如换行符(n)或标签(吨)!很抱歉,但我尝试。如果你找到一个办法,请让我知道!
* /
highlight_file(“crypto.php教程”);

 代码如下 复制代码

$ralphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz1234567890 !,.:;?~@#$%^&*()_+-=][}{/><"'";
$alphabet = $ralphabet . $ralphabet;


class Crypto {

function encrypt ($password,$strtoencrypt) {

global $ralphabet;
global $alphabet;

for( $i=0; $i<strlen($password); $i++ )
{
$cur_ps教程wd_ltr = substr($password,$i,1);
$pos_alpha_ary[] = substr(strstr($alphabet,$cur_pswd_ltr),0,strlen($ralphabet));
}

$i=0;
$n = 0;
$nn = strlen($password);
$c = strlen($strtoencrypt);

while($i<$c)
{
$encrypted_string .= substr($pos_alpha_ary[$n],strpos($ralphabet,substr($strtoencrypt,$i,1)),1);

$n++;
if($n==$nn) $n = 0;
$i++;
}

return $encrypted_string;

}

 


function decrypt ($password,$strtodecrypt) {

global $ralphabet;
global $alphabet;

for( $i=0; $i<strlen($password); $i++ )
{
$cur_pswd_ltr = substr($password,$i,1);
$pos_alpha_ary[] = substr(strstr($alphabet,$cur_pswd_ltr),0,strlen($ralphabet));
}

$i=0;
$n = 0;
$nn = strlen($password);
$c = strlen($strtodecrypt);

while($i<$c)
{
$decrypted_string .= substr($ralphabet,strpos($pos_alpha_ary[$n],substr($strtodecrypt,$i,1)),1);

$n++;
if($n==$nn) $n = 0;
$i++;
}

return $decrypted_string;


}


function cryption_table ($password) {

global $ralphabet;
global $alphabet;

for( $i=0; $i<strlen($password); $i++ )
{
$cur_pswd_ltr = substr($password,$i,1);
$pos_alpha_ary[] = substr(strstr($alphabet,$cur_pswd_ltr),0,strlen($ralphabet));
}


print "<table border=1 cellpadding="0" cellspacing="0">n";

print "<tr><td></td>";
for( $j=0; $j<strlen($ralphabet); $j++ )
{
print "<td align="center"><font size="2" face="arial">" . substr($ralphabet,$j,1) . "</td>n";
}
print "</tr>";


for( $i=0; $i<count($pos_alpha_ary); $i++ )
{
print "<tr><td align="right"><font size="2"><b>" . ($i+1) . "|</b></font></td>";
for( $k=0; $k<strlen($pos_alpha_ary[$i]); $k++ )
{
print "<td align="center"><font size="2" face="arial">" . substr($pos_alpha_ary[$i],$k,1) . "</td>n";
}
print "</tr>";
}

print "</table>n";

}

} // end class Crypto

// Example written by Macro Zeng
// 网络技术主管座右铭:三人行其必有我师焉。http://www.111cn.net
$ct = new Crypto;
//$ct->cryption_table($password);
echo "<form action=$PHP_SELF method=post>";
if ($mod == 2) {
$strtodecrypt = $ct->encrypt ($password,$strtoencrypt);
echo 'Encrypted String(加密后的字段): ';
echo "<input type=text name=strtodecrypt size=45 value=$strtodecrypt>
";
echo "密码锁: <input type=text name=password size=6 value=$password>";
echo "<input type=submit value="Decrypt(解密)">";
}
else {
$strtoencrypt = $ct->decrypt ($password,$strtodecrypt);
echo 'String to Encrypt(需要加密的字段): ';
echo "<input type=text name=strtoencrypt size=45 value=$strtoencrypt>
";
echo "密码锁: <input type=text name=password size=6 value=$password>";
echo "<input type=submit value="Encrypt(加密)">";
echo "<input type=hidden name=mod value=2>";
}
echo "</form>";

 

注明这款php教程文件压缩代码他要借助于zip.exe文件哦,所以我们要把zip.exe压缩文件给拿出来哦。

<?php

if ( !IsSet($_GET['dirname']) )
{
 show_input_form() ;
}
else
{
 // check if empty
 if ( empty($_GET['dirname']) )
 {
  hg_exit("请输入文件夹名!") ;
 }

 // check valid dirname
 if ( FALSE !== strpos($_GET['dirname'], "/") )
 {
  hg_exit(""/" 是非法的文件夹名!") ;
 }
 if ( FALSE !== strstr($_GET['dirname'], "..") )
 {
  hg_exit("".." 是非法的文件夹名!") ;
 }

 // check valid dir
 if ( !is_dir($_GET['dirname']) )
 {
  hg_exit(""{$_GET['dirname']}" 不是一个有效的文件夹!") ;
 }

 $szData = "" ;
 $szInfo = "" ;

 $file_count = @ZipDir($_GET['dirname'], &$szData, &$szInfo) ;
 $info_size_16byte = @sprintf("%016d", @strlen($szInfo)) ;
 $szData = @sprintf("%016d",$file_count) . $info_size_16byte . $szInfo . $szData ;
 $filename = $_GET['dirname'] . ".dat" ;
 if ( function_exists(gzencode) )
 {
  $szData = gzencode($szData) ;
  $filename .= ".gz" ;
 }
 
 Header("Content-type: application/octet-stream");
 Header("Accept-Ranges: bytes");
 Header("Accept-Length: " . strlen($szData));
 Header("Content-Disposition: attachment; filename=$filename");

 echo $szData ;
}


function show_input_form()
{
 echo HtmlHead("文件打包") ;
 echo "<form name="input">n"
  . "请输入要打包的文件夹,注意,仅当前目录下的文件夹才可以下载!<p>n"
  . "<input name="dirname">n"
  . "<input type="button" value="确定" onClick="show_download_link(dirname.value);">n"
  . "</form>n" ;
 echo "<script>n"
  . "input.dirname.focus();n"
  . "function show_download_link(dir)n"
  . "{"
  . "   var top = (screen.height-200)/2 ;n"
  . "   var left = (screen.width-300)/2 ;n"
  . "   newwin=window.open('', '', 'width=300,height=200,top=' + top + ',left=' + left + ', resizable=0,scrollbars=auto');n"
  . "   url = "{$_SERVER['PHP_SELF']}" + "?dirname=" + dir ;n"
  . "   newwin.document.write('<a href=' + url + '>点击此链接下载,<br>或者右键点击此处选择"另存为"</a>');n"
  . "}"
  . "</script>n" ;
 echo HtmlFoot() ;
}


function ZipDir($szDirName, &$szData, &$szInfo)
{
 // write dir header
 $szInfo .= "$szDirName|[dir]n" ;
 $file_count = 0 ;
 $hDir = OpenDir($szDirName) ;
 while ( $file = ReadDir($hDir) )
 {
  if ( $file=="." || $file==".." ) continue ;

  $szCurFile = "$szDirName/$file" ;

  if ( Is_Dir($szCurFile) )
  {
   $file_count += ZipDir($szCurFile, &$szData, &$szInfo) ;
  }
  else if ( Is_File($szCurFile) )
  {
   $hCurFile = fopen($szCurFile, "rb") ;
   $size = filesize($szCurFile) ;
   $szStream = fread( $hCurFile, $size ) ;
   fclose($hCurFile) ;
   $file_count++ ;

   // write info
   $szInfo .= "$szCurFile|$sizen" ;

   // write data
   $szData .= $szStream ;
  }
 }

 // write dir footer
 $szInfo .= "$szDirName|[/dir]n" ;
 return $file_count ;
}


function hg_exit($str)
{
 echo HtmlHead("Error, exit!") ;
 echo "<h5>" . $str . "</h5>" ;
 echo HtmlFoot() ;
 exit ;
}


function HtmlHead($title)
{
 return "<html>nn<head>n"
  . "<meta http-equiv="Content-Type" content="text/html; charset=gb2312">n"
  . "<style type="text/css教程">n"
  . "body,input,td{font:12px verdana}n"
  . "</style>n"
  . "</head>nn<body>nn" ;
}


function HtmlFoot()
{
 return Copyright() . "n</body>nn</html>" ;
}


function Copyright()
{
 return "<center><font size="5" face="楷体_GB2312" color="red">使用完请立即删除本文件,以避免被其它人发现使用!</font></center>n"
  . "<br><hr color="#003388">n"
  . "<center>n"
  . "<p style="font-family:verdana; font-size:12px">Contact us: n"
  . "<a href="http://www.111cn.net/" target="_blank">http://www.111cn.net/</a></p>n"
  . "</center>n"
  . "</body>n"
  . "n"
  . "</html>" ;
}

?>

[!--infotagslink--]

相关文章

  • Lua语言新手简单入门教程

    这篇文章主要给大家介绍的是关于Lua语言新手入门的简单教程,文中通过示例代码一步步介绍的非常详细,对各位新手们的入门提供了一个很方便的教程,需要的朋友可以参考借鉴,下面随着小编来一起学习学习吧。...2020-06-30
  • PHP分布式框架如何使用Memcache同步SESSION教程

    本教程主要讲解PHP项目如何用实现memcache分布式,配置使用memcache存储session数据,以及memcache的SESSION数据如何同步。 至于Memcache的安装配置,我们就不讲了,以前...2016-11-25
  • OPPO R9s如何开启Real原声技术?OPPO R9s开启Real原声技术教程

    本篇文章介绍了OPPO R9s如何开启Real原声技术的方法,有需要的小伙伴可以进来看一看。 OPPO R9s如何开启Real原声技术?Real原声技术是R9s自带的音质提升技术,开启之后...2016-12-31
  • PHP+memcache实现消息队列案例分享

    memche消息队列的原理就是在key上做文章,用以做一个连续的数字加上前缀记录序列化以后消息或者日志。然后通过定时程序将内容落地到文件或者数据库。php实现消息队列的用处比如在做发送邮件时发送大量邮件很费时间的问...2014-05-31
  • C#线程入门教程之单线程介绍

    这篇文章主要介绍了C#线程入门教程之单线程介绍,本文讲解了什么是进程、什么是线程、什么是多线程等内容,并给出了一个单线程代码示例,需要的朋友可以参考下...2020-06-25
  • CocosCreator入门教程之用TS制作第一个游戏

    这篇文章主要介绍了CocosCreator入门教程之用TS制作第一个游戏,对TypeScript感兴趣的同学,一定要看一下...2021-04-16
  • php入门教程(类实例教程)

    这里主要讲到关于在php教程类的调用,申请明,使用以前各种类的实例方法与操作过程,让你清楚的知道php类的construct destruct clone call wake sleep用法。 简单购物车...2016-11-25
  • php入门教程,?号表达式

    下面举一个很简单的?表达式的实现吧,其实它就是简单的if else哦。 <? $a = 5; //定义变数a=5 $b = 3; //定义变数b=5 $c = ($a==$b) ? ("yes") : ("no"); //如果...2016-11-25
  • 一看就懂的ReactJs基础入门教程-精华版

    现在最热门的前端框架有AngularJS、React、Bootstrap等。自从接触了ReactJS,ReactJs的虚拟DOM(Virtual DOM)和组件化的开发深深的吸引了我,下面来跟我一起领略ReactJs的风采吧~~ 文章有点长,耐心读完,你会有很大收获哦...2021-04-05
  • Windows下Memcache的安装方法

    很多phper不知道如何在Windows下搭建Memcache的开发调试环境,最近个人也在研究Memcache,记录下自己安装搭建的过程。 ...2016-01-27
  • 在Mac OS的PHP环境下安装配置MemCache的全过程解析

    这篇文章主要介绍了在Mac OS的PHP环境下安装配置MemCache的全过程解析,MemCache是一套分布式的高速缓存系统,需要的朋友可以参考下...2016-02-18
  • php入门教程:php rtrim()实例教程

    php入门教程:php rtrim()实例教程 定义和用法 该rtrim ( )函数将删除空格或其他预先确定的性质从右侧的一个字符串。 语法 rtrim(string,charlist) 参数说明 字符...2016-11-25
  • Golang极简入门教程(一):基本概念

    这篇文章主要介绍了Golang极简入门教程(一):基本概念,本文讲解了Golang的基本知识、基础语法、相关术语等,需要的朋友可以参考下...2020-05-01
  • 学习动态网页PHP技术常见问题汇总解答

    1:为什么我得不到变量 我在一网页向另一网页POST数据name,为什么输出$name时却得不到任何值? 在PHP4.2以后的版本中reGISter_global默认为off 若想取得从另一页...2016-11-25
  • Golang极简入门教程(三):并发支持

    这篇文章主要介绍了Golang极简入门教程(三):并发支持,本文讲解了goroutine线程、channel 操作符等内容,需要的朋友可以参考下...2020-05-01
  • php memcache和php memcached比较以及问题

    php memcache和php memcached是php的memcache分布式的高速缓存系统的两个客户端,php memcache是老客户端,php memcached是功能更加完善的新的代替php memcached的。...2016-11-25
  • php 入门教程:metaphone 函数

    定义和用法 该metaphone ( )函数计算metaphone关键的一个字符串。 阿metaphone关键是如何一连串的声音,如果说,由讲英语的人。 该metaphone ( )函数可用于拼写应用...2016-11-25
  • PHP运算符之PHP基本入门教程

    运算符是任何一门开发语言中会用到的基本内容,下面我来介绍PHP运算符的一些基础知识与使用方法。 运算符用于对值进行运算. PHP 运算符 本部分列出了在 PHP 中使用...2016-11-25
  • php入门教程之文件操作基础

    在有些场合中需要以文件的形式来对内容进行存储,通常这时候需要对文件进行一系列的操作,PHP中对于文件的操作跟其他计算机程序设计语言对文件的操作类似,对于文件的操作...2016-11-25
  • php 缓存技术实例

    本文章要讲的php 缓存技术是讲把数据生成一个临时缓存文件保存到硬盘,然后根据缓存文件设定的时间删除缓存文件再次生成新的缓存文件哦。 代码如下 复制...2016-11-25