php无刷新发表评论实现代码

 更新时间:2016年11月25日 15:49  点击:2084
ajax发表评论的原理很简单就是把以前php提交数据给后面处理程序,然后用户等待再返回页面重新读取数据,我们利用了一个ajax来实现无刷新了,其实就是局部刷新,利用XMLHttpRequest就可以实现局部数据发送了。

我们先来看看效果图,这是我网页的一部分,也就是实现这一功能的框架代码,显示评论的页面用IFRAME(隐藏帧)调用,待信息发送完之后,只刷新IFRAME那一块就可以看到自己发的评论,从发送到查看,整个过程都不需要刷新整个页面。

 1.点击“提交”,开始发送数据



2. 数据发送成功

3. 刷新评论列表

好了,现在我们开始来做代码。

 代码如下 复制代码

var http_request=false;
  function send_request(url){//初始化,指定处理函数,发送请求的函数
    http_request=false;
//开始初始化XMLHttpRequest对象
if(window.XMLHttpRequest){//Mozilla浏览器
  http_request=new XMLHttpRequest();
  if(http_request.overrideMimeType){//设置MIME类别
    http_request.overrideMimeType("text/xml");
  }
}
else if(window.ActiveXObject){//IE浏览器
  try{
   http_request=new ActiveXObject("Msxml2.XMLHttp");
  }catch(e){
   try{
   http_request=new ActiveXobject("Microsoft.XMLHttp");
   }catch(e){}
  }
    }
if(!http_request){//异常,创建对象实例失败
  window.alert("创建XMLHttp对象失败!");
  return false;
}
http_request.onreadystatechange=processrequest;
//确定发送请求方式,URL,及是否同步执行下段代码
    http_request.open("GET",url,true);
http_request.send(null);
  }
  //处理返回信息的函数
   function processrequest(){
   if(http_request.readyState==4){//判断对象状态
     if(http_request.status==200){//信息已成功返回,开始处理信息
   document.getElementById(reobj).innerHTML=http_request.responseText;
  }
  else{//页面不正常
   alert("您所请求的页面不正常!");
  }
   }
  }
   function checkfourm(obj){
    var f=document.fourm;
    var newfourm=f.newfourm.value;
    var username=f.username.value;
    var id=f.id.value;
    if(username==""){
           document.getElementById(obj).innerHTML="<img src=images/false.gif> <font color=red>您必须先登录!</font>";
     return false;
    }
    else if(newfourm==""){
     document.getElementById(obj).innerHTML="<img src=images/false.gif> <font color=red>您还没填写评论内容!</font>";
     return false;
    }
    else{
     document.getElementById(obj).innerHTML="正在发送数据...";
     send_request('sendnewfourm.php?username='+username+'&newfourm='+newfourm+'&id='+id);
     reobj=obj;
    }
   }

有一点ajax基础的通过注释,应该都可以看懂这段代码,我们可以看出,当我们开始发表评论的时候,在一个特定位置先显示:正在发送数据...。接着调用回调函数处理数据。那么请看服务器端的代码

 代码如下 复制代码
<?php
  header('Content-Type:text/html;charset=GB2312');//避免输出中文乱码,linux下不需要
  $username=trim($_GET['username']);
  $newfourm=trim($_GET['newfourm']);
  $id=$_GET['id'];
  $time=date("Y-m-d");
  
  include('inc/config.inc.php');
  include('inc/dbclass.php');
  $db=new db;//从数据库操作类生成实例
  $db->mysql($dbhost,$dbuser,$dbpassword,$dbname);//调用连接参数函数
  $db->createcon();//调用创建连接函数
 
  $addsql="insert into cr_fourm values(0,'$newfourm','$username','$time',$id)";
  $db->query($addsql);
  echo"<img src=images/pass.gif> <font color=red>评论已成功发表!</font>";
  //echo $addsql;
  $db->close();//关闭数据库连接
?>

由于jsvascript采用UTF8编码,在windows下采用ajax回送服务器的返回信息就会出现乱码,因此在win下应用开头第一句是非常必要的。中间那段两个包含文件是数据库操作类和数据库配置信息,我个人习惯将基本的数据库操作写成一个类,方便调用。到这里相信大家已经基本明白这个程序的工作原理了,在给出页面的HTML代码

 代码如下 复制代码

<table width="100%" border="0" cellspacing="0" cellpadding="0">
      <tr>
        <td align="center"><?php echo $rows_p[p_info];?></td>
      </tr>
      <tr>
        <td align="center"><br><br><iframe frameborder="0" scrolling="auto" src="showfourm.php?picid=<?=$id;?>" style=HEIGHT:250px;VISIBILITY:inherit;WIDTH:98%;Z-INDEX:2 ></iframe>
</td>
      </tr>
      <tr>
        <td align="center"><br><br>
  <div align="center" id="result"></div>
  <form name="fourm">
  <table width="100%" border="0" cellspacing="0" cellpadding="0">
          <tr>
            <td height="25"> 快速发表评论<span class="STYLE1">(必须先登陆)用户名:
                <input name="username" type="text" value="<?=$username?>" readonly>
            </span></td>
          </tr>
          <tr>
            <td height="32" align="center" valign="middle"><textarea name="newfourm" class="f" id="newfourm"></textarea></td>
          </tr>
          <tr>
            <td height="32"> <input name="submit" type="button" value="发表评论" onClick="checkfourm('result')">
              <input name="reset" type="reset" id="reset" value="重新填写">
            <input name="id" type="hidden" id="id" value="<?php echo"$id";?>"></td>
          </tr>
        </table>
        </form>
        </td>
      </tr>
    </table>

PHP+Ajax实现页面无刷新发表评论,希望对初学ajax的PHPer有所帮助。   我们需要一个基本的ajax开发框架,文件ajax.js就包含了这个框架,ajax.js文件我们第一步就有讲述了,只要大家按上面的方法一步步来操作就可以实现无刷新发评论了

在php中用三种数组分别是数值数组,关联数组,多维数组那么它们三种的用法有一点不同,下面我们来看看吧。

 


数值数组
数值数组存储的每个元素都带有一个数字 ID 键。

可以使用不同的方法来创建数值数组:

例子 1
在这个例子中,会自动分配 ID 键:

 代码如下 复制代码

$names = array("Peter","Quagmire","Joe");

例子 2
在这个例子中,我们人工分配的 ID 键:

 代码如下 复制代码

$names[0] = "Peter";
$names[1] = "Quagmire";
$names[2] = "Joe";可以在脚本中使用这些 ID 键:

<?php

$names[0] = "Peter";
$names[1] = "Quagmire";
$names[2] = "Joe";

echo $names[1] . " and " . $names[2] . " are ". $names[0] . "'s neighbors";
?>

数组排序

(1)sort(array $array[,int sorttype])
 array 表示一个数组
 <TABLE class=dataintable><TBODY><TR><TD>      sorttype 取值:</TD><TD><P>           SORT_REGULAR - 默认。以它们原来的类型进行处理(不改变类型)。 </P><P>           SORT_NUMERIC - 把值作为数字来处理 </P><P>           SORT_STRING - 把值作为字符串来处理 </P><P>            SORT_LOCALE_STRING - 把值作为字符串来处理,基于本地设置<SUP style="FONT-FAMILY: Verdana, Arial, Helvetica, sans-serif">*</SUP>。 </P></TD></TR></TBODY></TABLE>
 (2)bool rsort(array $array[,sorttype])函数    逆向排序(值逆向)
 sorttype  同上
 (3)bool shuffle()函数    随机排序
 (4)array array_reverse (array $array[,bool preserve_keys])  反向排列
 preserve_keys 为true时 保留原来的键名
 (5)array array_merge()合并数组
 (6)array array_slice(array $array,int offset[,int length[,boolpreserve_keys ])
 offset非负,这array中的偏移变量从此开始,为负时从末端开始
 length为正时,则表示序列中有很多单元,为负时表示从末端开始第几个数处结束,若省略则从offset开始一直到最后
 boolpreserve_keys  同上

数组循环输出

 代码如下 复制代码
<PRE class="brush:php; toolbar: true; auto-links: true;"><pre>
<?php
$shuzu=array('a'=>"wo",'b'=>"ni",'c'=>"ta",'d'=>"php",'e'=>"mysql");
echo "使用foreach函数遍历数组";
echo "<br/>$nbsp;<br/>";
foreach($shuzu as $key=>$value)
{
echo "$key 代表: $value";
echo "<br/>$nbsp;<br/>";
}
?>
</pre></PRE>

 

关联数组

关联数组,它的每个 ID 键都关联一个值。
在存储有关具体命名的值的数据时,使用数值数组不是最好的做法。
通过关联数组,我们可以把值作为键,并向它们赋值。
例子 1
在本例中,我们使用一个数组把年龄分配给不同的人:

 代码如下 复制代码
$ages = array("Peter"=>32, "Quagmire"=>30, "Joe"=>34);

例子 2
本例与例子 1 相同,不过展示了另一种创建数组的方法:

 代码如下 复制代码

$ages['Peter'] = "32";
$ages['Quagmire'] = "30";
$ages['Joe'] = "34";可以在脚本中使用 ID 键:
<?php

$ages['Peter'] = "32";
$ages['Quagmire'] = "30";
$ages['Joe'] = "34";

echo "Peter is " . $ages['Peter'] . " years old.";
?>以上脚本的输出:
Peter is 32 years old.


关联数组判断为空的代码,然后我们详细讲讲关于数据空的处理。

 代码如下 复制代码
<?php教程
    $array = array(0);
    if(empty($array)){
        echo "我空了n";
    }else{
        echo "我不空啊n";
    }
    $array['array']='我是数组';
    print_r($array);
    $array['array1']='我是数组1';
    print_r($array);
    unset($array['array1']);
    print_r($array);
?>

更多详细内容请查看:http://www.111cn.net/phper/php/39841.htm

遍历

遍历用户列表的时候,只需直接用 isset 查询那个用户名是否存在即可。

PHP 版代码:

 代码如下 复制代码

<?php
$arrayHash = array();
foreach($arrayN as $nameN) {
   // 本行执行了 N 次。
   $arrayHash[$nameN] = 1;
}
 

foreach($arrayM as $keyM => $nameM) {
   if (isset($arrayHash[$nameM])) {
   // 本行执行了 M 次!
   unset($arrayM[$keyM]);
   }
}
return $arrayM;
?>

多维

数组

在多维数组中,主数组中的每个元素也是一个数组。在子数组中的每个元素也可以是数组,以此类推。
例子 1
在本例中,我们创建了一个带有自动分配的 ID 键的多维数组:

 代码如下 复制代码
$families = array
(
  "Griffin"=>array
  (
  "Peter",
  "Lois",
  "Megan"
  ),
  "Quagmire"=>array
  (
  "Glenn"
  ),
  "Brown"=>array
  (
  "Cleveland",
  "Loretta",
  "Junior"
  )
);如果输出这个数组的话,应该类似这样:
Array
(
[Griffin] => Array
  (
  [0] => Peter
  [1] => Lois
  [2] => Megan
  )
[Quagmire] => Array
  (
  [0] => Glenn
  )
[Brown] => Array
  (
  [0] => Cleveland
  [1] => Loretta
  [2] => Junior
  )
)

例子 2
让我们试着显示上面的数组中的一个单一的值:

 代码如下 复制代码
echo "Is " . $families['Griffin'][2] .
" a part of the Griffin family?"; 以上代码的输出:
Is Megan a part of the Griffin family?


数组排序

 代码如下 复制代码

<?php
$array[] = array("age"=>20,"name"=>"li");
$array[] = array("age"=>21,"name"=>"ai");
$array[] = array("age"=>20,"name"=>"ci");
$array[] = array("age"=>22,"name"=>"di");
 
foreach ($array as $key=>$value){
 $age[$key] = $value['age'];
 $name[$key] = $value['name'];
}
 
array_multisort($age,SORT_NUMERIC,SORT_DESC,$name,SORT_STRING,SORT_ASC,$array);
print_r($array);
?>

更多array_multisort()可参考http://www.111cn.net/phper/php/42696.htm

在php中要实现文件或图片上传相比于其它的语言要方便的多,在php中只要利用move_uploaded_file函数就可以快速实现文件上传了。

我们先来看一下项目结构图与数据库结构图吧

项目结构:

运行效果;

  up.html 简单的上传表单文件

 代码如下 复制代码

<form action="up.php" enctype="multipart/form-data" method="post"
     name="uploadfile">上传文件:<input type="file" name="upfile" /><br>
 <input type="submit" value="上传" /></form>

up.php 用来处理图片文件上传的程序

 代码如下 复制代码

 <?php
 //print_r($_FILES["upfile"]);
 if(is_uploaded_file($_FILES['upfile']['tmp_name'])){
     $upfile=$_FILES["upfile"];
     //获取数组里面的值
     $name=$upfile["name"];//上传文件的文件名
     $type=$upfile["type"];//上传文件的类型
     $size=$upfile["size"];//上传文件的大小
     $tmp_name=$upfile["tmp_name"];//上传文件的临时存放路径
/*
这是一种非常简单文件上传方式。基于安全方面的考虑,您应当增加有关什么用户有权上传文件的限制。
上传限制
在这个脚本中,我们增加了对文件上传的限制。用户只能上传 .gif 或 .jpeg 文件
*/
     switch ($type){
         case 'image/pjpeg':$okType=true;
         break;
         case 'image/jpeg':$okType=true;
         break;
         case 'image/gif':$okType=true;
         break;
         case 'image/png':$okType=true;
         break;
     }

 
     if($okType){
         /**
          * 0:文件上传成功<br/>
          * 1:超过了文件大小,在php.ini文件中设置<br/>
          * 2:超过了文件的大小MAX_FILE_SIZE选项指定的值<br/>
          * 3:文件只有部分被上传<br/>
          * 4:没有文件被上传<br/>
          * 5:上传文件大小为0
          */
         $error=$upfile["error"];//上传后系统返回的值
         echo "================<br/>";
         echo "上传文件名称是:".$name."<br/>";
         echo "上传文件类型是:".$type."<br/>";
         echo "上传文件大小是:".$size."<br/>";
         echo "上传后系统返回的值是:".$error."<br/>";
         echo "上传文件的临时存放路径是:".$tmp_name."<br/>";
 
         echo "开始移动上传文件<br/>";
         //把上传的临时文件移动到up目录下面
         move_uploaded_file($tmp_name,'up/'.$name);
         $destination="up/".$name;
         echo "================<br/>";
         echo "上传信息:<br/>";
         if($error==0){
             echo "文件上传成功啦!";
             echo "<br>图片预览:<br>";
             echo "<img src=".$destination.">";
             //echo " alt="图片预览:r文件名:".$destination."r上传时间:">";
         }elseif ($error==1){
             echo "超过了文件大小,在php.ini文件中设置";
         }elseif ($error==2){
             echo "超过了文件的大小MAX_FILE_SIZE选项指定的值";
         }elseif ($error==3){
             echo "文件只有部分被上传";
         }elseif ($error==4){
             echo "没有文件被上传";
         }else{
             echo "上传文件大小为0";
         }
     }else{
         echo "请上传jpg,gif,png等格式的图片!";
     }
 }
 ?>

总结分析

在php图片上传中我们主要是通过使用 PHP 的全局数组 $_FILES,你可以从客户计算机向远程服务器上传文件。
第一个参数是表单的 input name,第二个下标可以是 "name", "type", "size", "tmp_name" 或 "error"。就像这样:
$_FILES["file"]["name"] - 被上传文件的名称
$_FILES["file"]["type"] - 被上传文件的类型
$_FILES["file"]["size"] - 被上传文件的大小,以字节计
$_FILES["file"]["tmp_name"] - 存储在服务器的文件的临时副本的名称
$_FILES["file"]["error"] - 由文件上传导致的错误代码

只要你了解了上面这些参数就可以完全的在php中实现文件上传了哦,因为上面我限制了

 代码如下 复制代码
 switch ($type){
         case 'image/pjpeg':$okType=true;
         break;
         case 'image/jpeg':$okType=true;
         break;
         case 'image/gif':$okType=true;
         break;
         case 'image/png':$okType=true;
         break;
     }


只能上传jpg,gif,png,jpeg四种格式的图片文件了,所以说这里是图片上传实现了。

在php中要实现简单的目录创建和删除分别利用mkdir和rmdir这有点像dos中的命令了,但如果我要创建多级目录或删除多级目录中的文件和目录则需要递归来实例了。

php中mkdir创建多级目录

 代码如下 复制代码
function mkdirs($dir) 
{  if(!is_dir($dir)) 
{  if(!mkdirs(dirname($dir)))
{  return false;  } 
if(!mkdir($dir,0777))
{  return false;  }  }
 return true; 

调用方法

mkdirs('div/css/layout'); 


创建多级目录更标准的方法

 代码如下 复制代码

//检查并创建多级目录
    function checkDir($path){
        $pathArray = explode('/',$path);
        $nowPath = '';
        array_pop($pathArray);
        foreach ($pathArray as $key=>$value){
            if ( ''==$value ){
                unset($pathArray[$key]);
            }else{
                if ( $key == 0 )
                    $nowPath .= $value;
                else
                    $nowPath .= '/'.$value;
                if ( !is_dir($nowPath) ){
                    if ( !mkdir($nowPath, 0777) ) return false;
                }
            }
        }
        return true;
    }

删除多级目录方法

在winxp下测试成功,只要php文件编码为gb2312,文件名随意,应该把文件名改为编码为gb2312,就行,没测

 代码如下 复制代码

<?php
header("Content-Type:text/html; charset=gb2312");
if(deleteDir('./复件 复件 复件 复件 复件 复件 复件 复件 复件 复件 复件 aaa'))
echo "删除成功";
function deleteDir($dir)
{
if (@rmdir($dir)==false && is_dir($dir)) //删除不了,进入删除所有文件
{
if ($dp = opendir($dir))
{
while (($file=readdir($dp)) != false)
{
if($file!='.' && $file!='..')
{ //echo $file=$dir.'/'.$file;echo '<br/>';
$file=$dir.'/'.$file;
if (is_dir($file)) //是真实目录
{
deleteDir($file);
}else {
unlink($file);
}
}
}
closedir($dp);
}else
{
return false;
}
}
if (is_dir($dir) && @rmdir($dir)==false) //是目录删除不了
return false;
return true;
}
?>

递归删除多级目录

同样的思路,php用rmdir和unlink递归删除多级目录的代码: 

 代码如下 复制代码

function rmdirs($dir) 

$d = dir($dir); 
while (false !== ($child = $d->read())){ 
if($child != '.' && $child != '..')

if(is_dir($dir.'/'.$child)) 
rmdirs($dir.'/'.$child); 
else
unlink($dir.'/'.$child);  } 

$d->close();

//调用方法也很简单只要给目录就好 
rmdir($dir);
}

文章介绍了关于数据库中的长连接和短连接区别分析,有需要了解的朋友可以看看。

什么是长连接?

其实长连接是相对于通常的短连接而说的,也就是长时间保持客户端与服务端的连接状态。

通常的短连接操作步骤是:

连接-》数据传输-》关闭连接;

而长连接通常就是:

连接-》数据传输-》保持连接-》数据传输-》保持连接-》…………-》关闭连接;

这就要求长连接在没有数据通信时,定时发送数据包,以维持连接状态,短连接在没有数据传输时直接关闭就行了

什么时候用长连接,短连接?

长连接主要用于在少数客户端与服务端的频繁通信,因为这时候如果用短连接频繁通信常会发生Socket出错,并且频繁创建Socket连接也是对资源的浪费。

但是对于服务端来说,长连接也会耗费一定的资源,需要专门的线程(unix下可以用进程管理)来负责维护连接状态。

总之,长连接和短连接的选择要视情况而定。

 

首先,如果使用了长连接而长期没有对数据库进行任何操作,那么在timeout值后,mysql server就会关闭此连接,而客户端在执行查询的时候就会得到一个类似于“MySQL server has gone away“这样的错误。

在使用mysql_real_connect连接数据库之后,再使用mysql_options( &mysql, MYSQL_OPT_RECONNECT, … ) 来设置为自动重连。这样当mysql连接丢失的时候,使用mysql_ping能够自动重连数据库。如果是在mysql 5.1.6之前,那么则应在每次执行完real_connect 之后执行mysql_options( &mysql, MYSQL_OPT_RECONNECT, … ) ,如果是mysql 5.1.6+,则在connect之前执行一次就够了。

 

查看mysql连接数

mysqladmin -uroot -p  processlist

实际的测试中我发现,当设置了MYSQL_OPT_RECONNECT为1时,超时后再查看processlist,则自动建立的连接不在列表中,但事实上连接确实建立并被使用了。

 

在MYSQL的默认设置中,如果一个数据库连接超过8小时没有使用(闲置8小时),服务器将断开这条连接,后续在该连接上进行的查询操作都将失败。网络上对该问题的描述非常多。也提供了相应的解决办法。我在这里提一些我自己的看法。

解决办法一:修改MYSQL服务器的配置参数

道理非常简单,MYSQL的默认设置是在数据库连接超过8小时没有使用后将其断开,如果我们将这个时间改成更大的数值,那么连接超时所需的时间就会更长,也就意味着更不容易超时。网络上提供的修改方法一般是修改/etc/my.cnf,在这个文件中添加一行wait_timeout=你需要设置的超时时间。实际上有一种比较简单的方法来修改这个参数:

首先作为超级用户登录到MYSQL,注意必须是超级用户,否则后面会提示没有修改权限。然后输入

show global variables like 'wait_timeout';

回车执行后显示目前的超时时间:

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| wait_timeout | 28800 |

+---------------+-------+

1 row in set (0.00 sec)

上面显示的是默认的超时时间,即8个小时(单位是秒)。现在重新设置该参数,例如我们要将超时时间设置成10个小时,可以输入:

set global wait_timeout=36000;

回车执行,显示:

Query OK, 0 rows affected (0.00 sec)

表示设置成功,可以重新使用show global variables like 'wait_timeout'来验证。

这种方法比较直观,而且设置的参数立即生效。但如果/etc/my.cnf中没有配置,则重启服务后,global变量会从/etc/my.cnf中读取新的变量值。

 

下边是一段示例代码:

if(!mysql_real_connect(&logdb, my_hostname, my_user, my_password, my_dbname, my_port, my_sock, 0)){
        ast_log(LOG_ERROR, "Failed to connect to mysql database %s on %s.n", my_dbname, my_hostname);
        use_mysql = 0;
} else {
       char value = 1;
       mysql_options(&logdb, MYSQL_OPT_RECONNECT, (char*)&value);
        use_mysql = 1;
}

--------------------------------------------------------------------------------
 

 


--------------------------------------------------------------------------------

 

 

譬如 HTTP 的 Connection-alive 如果为 close,则 server 收到一个 request 并发送完一个 response 之后就会主动关闭连接,这就是短连接;如果 Connection-alive keep-alive 的话可以在一个 tcp 连接中交换多次对话。是这个定义?那就只是个程序结构设计问题了。

 


--------------------------------------------------------------------------------

长连接短连接只是一个概念性的问题,只要知道其概念,不是一个特殊的东西:
长连接:系统通讯连接建立后就一直保持。
短连接:只有系统需要相互发消息连接才建立(客户端发起),请求消息得到响应后连接关闭;
通讯实体间使用长连接,一般还需要定义心跳消息,定期发送来检测系统间链路是否异常,每隔一定时间发送一次心跳,如果一定次数没有收到心跳消息,这认为此连接出现问题,需要断开连接重新建立。
具体心跳消息的格式,以及发送间隔,以及多少次没有收到心跳就认为链路异常,以及数据部是否算作心跳消息(有的系统如果接收到数据包则会清除心跳计时器也就相当于系统中的数据包也算作心跳消息);这个需要两端进行协商。比如GSM常用的短消息中心和其他网络实体互连的SMPP协议,要求建立的就是长连接.

所以长短连接只是一个概念问题长短连接的socket,就是使用普通的socket函数,没有什么特殊的。


--------------------------------------------------------------------------------

PHP在??MYSQL?r有???FUNCTION
CONNECT?PCONNECT
????函式的差?e在哪??
一般的??蚀鸢付际牵?br /> PCONNECT是持?性的?接,PHP??匮}使用已?存在的?料?爝B?

 

但是再追??下去,能?得出?淼娜司蜕倭嗽S多
常?的疑??有:
什??r候要用CONNECT什??r候用PCONNECT?
mysql_close何?r使用?
?槭颤NDATABASE上有一堆SLEEP的PROCESS?
明明用PCONNECT?楹蚊看?ESOURCE ID都不同?

先回?w到最??蔚慕忉?,pconnect???z查是否有已?存在的?料?爝B?。
若有,就使用?的??;若?o,就新??⒁????
但是??所?得?z查??,是指?一??APACHE行程所??⒌馁Y料?爝B?
而不是?一台WEB SERVER所??⒌馁Y料?爝B?。
一台WEB SERVER上可能有上百??APAHE行程(2.0??最大150??)
也就是? 在最大情?r下可能??猩习??PCONNECT造成的?料?爝B?
(???上??h少於此)
所以同?邮褂?CONNECT是??霈F不同RESOURCE ID的
因?樗?赡苁窃诓煌?谐躺厦?绦?/p>

而PCONNECT是不??诓樵?完成後就??,而是??却?欢?r?
????r?可以由MYSQL上的wait_timeout?定
而且mysql_close?K?o法??pconnect所??⒌倪B?,只能??connect所??⒌馁Y料?爝B?。?然如果?]有CLOSE在??TIMEOUT?r?之後也是???B DROP掉。

PCONNECT必?要小心使用,在??的不好的CODE中,???留一大批的DATABASE CONNECTION。最大值可以??佑?算
每台SERVER的APACHE行程? * 所有WEB SERVEWR?盗?br /> ?然不需要我?硖嵝眩?????都????B的CPU TIME?MEMORY

??WEB CODE?r,不?使用何??言,有?牲c一定要再?邮??之前先有答案
一是,要??ATABASE抓取什??料
二是,要?魉褪颤N?料到USER端
(其???也不只用於WEB)
DATABASE的??是很慢的,能?蛞淮巫ト⊥晁?璧馁Y料,就不要分?纱?/p>


--------------------------------------------------------------------------------

数据库连接池由数据库管理器提供。与连接语言无关。
php 提供了 pconnect 的?C制, 可以????接池的功能 .
???nbsp;  mysql , mysql_pconnect 函?稻涂梢??? :
 ???爝B接使用完?後, ?K不?放, 而是留在系?中, 下一次?用 mysql_pconnect ?接????r, 首先?z查是否有空?的?接未被使用, 如果有, ?t使用????接, 而不是?行?接???斓牟僮? ?亩??省系??? .
 


1.数据库连接池的工作机制是什么?它怎么提高数据的访问速度呢? 
---------------------------------------------------------------
连接池的作用主要是节省打开数据库的时间。 
由于打开数据库连接比较耗时,所以连接池机制预先打开N个数据库连接,把它们缓存起来,当需要使用数据库的时候就直接使用这些已经打开的连接,从而节省了 时间。

创建新的对象并初始化的操作,可能会消耗 很多的时间。在这种对象的初始化工作包含了一些费时的操作(例如,从一台位于20,000千米以外的主机上读出一些数据)的时候,尤其是这样。在需要大量 生成这样的对象的时候,就可能会对性能造成一些不可忽略的影响。要缓解这个问题,除了选用更好的硬件和更棒的虚拟机以外,适当地采用一些能够减少对象创建 次数的编码技巧,也是一种有效的对策。对象池化技术(Object  Pooling)就是这方面的著名技巧. 

对象池化的基本思路是:将用过的对象保存起来,等下一次需要这种对象的时候,再拿出来重复使用,从而在一定程度上减少频繁创建对象所造成的开销。用于充当 保存对象的“容器”的对象,被称为“对象池”(Object Pool,或简称Pool)。 

数据库连接pool是专门保存和管理数据库连接的pool. 

恰当地使用对象池化技术,可以有效地减少对象生成和初始化时的消耗,提高系统的运行效率。 

采用对象池化的本意,是要通过减少对象生成的次数,减少花在对象初始化上面的开销,从而提高整体的性能。然而池化处理本身也要付出代价,因此,并非任何情 况下都适合采用对象池化。   

基本上,只在重复生成某种对象的操作成为影响性能的关键因素的时候,才适合进行对象池化。如果进行池化所能带来的性能提高并不重要的话,还是不采用对象池 化技术,以保持代码的简明,而使用更好的硬件和更棒的虚拟机来提高性能为佳。   

恰当地使用对象池化,可以有效地降低频繁生成某些对象所造成的开销,从而提高整体的性能。而借助Jakarta Commons  Pool组件,可以有效地减少花在处理对象池化上的工作量,进而,向其它重要的工作里,投入更多的时间和精力。

数据库连接池的原理:

J2EE服务器启动时会建立一定数量的池连接,并一直维持不少于此数目的池连接。
客户端程序需要连接时,池驱动程序会返回一个未使用的池连接并将其表记为忙。
如果当前没有空闲连接,池驱动程序就新建一定数量的连接,新建连接的数量有配置参数决定。
当使用的池连接调用完成后,池驱动程序将此连接表记为空闲,其他调用就可以使用这个连接。


--------------------------------------------------------------------------------

 

1.长连接
Client方与Server方先建立通讯连接,连接建立后不断开,然后再进行报文发送和接收。

2.短连接
Client方与Server每进行一次报文收发交易时才进行通讯连接,交易完毕后立即断开连接。此种方式常用于一点对多点通讯,比如多个Client连接一个Server.

 

 

 

短连接常见于大客户情况 如WEB服务器如果每个连接都使用长连接 那么每个客户都保留一个socket 系统资源耗费很大 。

长连接则是多用于操作频繁情况每个TCP连接都需要三步握手 这需要时间 如果每个操作都是先连接 再操作的话那么处理速度会降低很多 所以每个操作完后都不断开 下次处理时直接发送数据包就OK了 不用建立TCP连接。

另外还有同步操作和异步操作,同步操作指上一个操作返回结果后才能发下一个操作的数据包;异步操作指先把所有的操作数据包发完后 再等待它们的返回结果。相比较看, 异步操作速度快 特别是在每个包处理方法独立的情况下 。

上面只是一个参考 最后要使用哪种类型还是决定于你。如联通的短信协议就是 连接后可以发送多个短信包 但如果一段时间(如60s)没有操作 那么连接就会被关闭。

 


--------------------------------------------------------------------------------

 

 

 

数据库永久连接
永久的数据库连接是指在脚本结束运行时不关闭的连接。当收到一个永久连接的请求时。PHP 将检查是否已经存在一个(前面已经开启的)相同的永久连接。如果存在,将直接使用这个连接;如果不存在,则建立一个新的连接。所谓“相同”的连接是指用相同的用户名和密码到相同主机的连接。

对 web 服务器的工作和分布负载没有完全理解的读者可能会错误地理解永久连接的作用。特别的,永久连接不会在相同的连接上提供建立“用户会话”的能力,也不提供有效建立事务的能力。实际上,从严格意义上来讲,永久连接不会提供任何非永久连接无法提供的特殊功能。

为什么?

这和 web 服务器工作的方式有关。web 服务器可以用三种方法来利用 PHP 生成 web 页面。

第一种方法是将 PHP 用作一个“外壳”。以这种方法运行,PHP 会为向 web 服务器提出的每个 PHP 页面请求生成并结束一个 PHP 解释器线程。由于该线程会随每个请求的结束而结束,因此任何在这个线程中利用的任何资源(例如指向 SQL 数据库服务器的连接)都会随线程的结束而关闭。在这种情况下,使用永久连接不会获得任何地改变??因为它们根本不是永久的。

第二,也是最常用的方法,是把 PHP 用作多进程 web 服务器的一个模块,这种方法目前只适用于 Apache。对于一个多进程的服务器,其典型特征是有一个父进程和一组子进程协调运行,其中实际生成 web 页面的是子进程。每当客户端向父进程提出请求时,该请求会被传递给还没有被其它的客户端请求占用的子进程。这也就是说当相同的客户端第二次向服务端提出请求时,它将有可能被一个不同的子进程来处理。在开启了一个永久连接后,所有请求 SQL 服务的后继页面都能够重新使用这个已经建立的 SQL Server 连接。

最后一种方法是将 PHP 用作多线程 web 服务器的一个插件。目前 PHP 4 已经支持 ISAPI、WSAPI 和 NSAPI(在 Windows 环境下),这些使得 PHP 可以被用作诸如 Netscape FastTrack (iPlanet)、Microsoft's Internet Information Server (IIS) 和 O'Reilly's WebSite Pro 等多线程 web 服务器的插件。永久连接的行为和前面所描述的多过程模型在本质上是相同的。注意 PHP 3 不支持 SAPI。

如果永久连接并没有任何附加的功能,那么使用它有什么好处?

答案非常简单??效率。当客户端对 SQL 服务器的连接请求非常频繁时,永久连接将更加高效。连接请求频繁的标准取决于很多因素。例如,数据库的种类,数据库服务和 web 服务是否在同一台服务器上,SQL 服务器如何加载负载等。但我们至少知道,当连接请求很频繁时,永久连接将显著的提高效率。它使得每个子进程在其生命周期中只做一次连接操作,而非每次在处理一个页面时都要向 SQL 服务器提出连接请求。这也就是说,每个子进程将对服务器建立各自独立的永久连接。例如,如果有 20 个不同的子进程运行某脚本建立了永久的 SQL 服务器永久连接,那么实际上向该 SQL 服务器建立了 20 个不同的永久连接,每个进程占有一个。

注意,如果永久连接的子进程数目超过了设定的数据库连接数限制,系统将会产生一些缺陷。如果数据库的同时连接数限制为 16,而在繁忙会话的情况下,有 17 个线程试图连接,那么有一个线程将无法连接。如果这个时候,在脚本中出现了使得连接无法关闭的错误(例如无限循环),则该数据库的 16 个连接将迅速地受到影响。请查阅使用的数据库的文档,以获取关于如何处理已放弃的及闲置的连接的方法。

 

 

 


--------------------------------------------------------------------------------

 

 


--------------------------------------------------------------------------------

 


应用程序和数据库建立连接,如果超过 wait_timeout (默认28000秒8小时) 应用程序不去访问数据库,连接一直处于空闲状态,那么MySQL就会自动关闭该连接 ,如果再在该连接上执行查询操作,就会发生MySQL server has gone away错误。

 

wait_timeout

服务器在关闭连接之前在一个连接上等待行动的秒数,默认数值是28800,即如果没有事情发生,服务器在 8个小时后关闭连接。
 

尝试解决办法:

<1>.这是由于超时时间 wait_timeout 过短导致,所以修改它的值即可。打开MySQL安装目录下的 mysql.ini,在文件中添加一行配置项 wait_timeout=1000000 即可。(默认没有此选项,需要手动的添加)
该方法可行。

 

<2>.在代码中设置自动重连选项,

m_connection.set_option( new mysqlpp::ReconnectOption(true) );

 

然后在发生 MySQL server has gone away错误 的时候 调用 Connection::ping()方法,该函数会检查对服务器的连接是否正在工作,必要时重新连接,但经过测试后发现,这种方法不起作用。

[!--infotagslink--]

相关文章

  • 不打开网页直接查看网站的源代码

      有一种方法,可以不打开网站而直接查看到这个网站的源代码..   这样可以有效地防止误入恶意网站...   在浏览器地址栏输入:   view-source:http://...2016-09-20
  • php 调用goolge地图代码

    <?php require('path.inc.php'); header('content-Type: text/html; charset=utf-8'); $borough_id = intval($_GET['id']); if(!$borough_id){ echo ' ...2016-11-25
  • JS基于Mootools实现的个性菜单效果代码

    本文实例讲述了JS基于Mootools实现的个性菜单效果代码。分享给大家供大家参考,具体如下:这里演示基于Mootools做的带动画的垂直型菜单,是一个初学者写的,用来学习Mootools的使用有帮助,下载时请注意要将外部引用的mootools...2015-10-23
  • JS+CSS实现分类动态选择及移动功能效果代码

    本文实例讲述了JS+CSS实现分类动态选择及移动功能效果代码。分享给大家供大家参考,具体如下:这是一个类似选项卡功能的选择插件,与普通的TAb区别是加入了动画效果,多用于商品类网站,用作商品分类功能,不过其它网站也可以用,...2015-10-21
  • JS实现自定义简单网页软键盘效果代码

    本文实例讲述了JS实现自定义简单网页软键盘效果。分享给大家供大家参考,具体如下:这是一款自定义的简单点的网页软键盘,没有使用任何控件,仅是为了练习JavaScript编写水平,安全性方面没有过多考虑,有顾虑的可以不用,目的是学...2015-11-08
  • php 取除连续空格与换行代码

    php 取除连续空格与换行代码,这些我们都用到str_replace与正则函数 第一种: $content=str_replace("n","",$content); echo $content; 第二种: $content=preg_replac...2016-11-25
  • php无刷新利用iframe实现页面无刷新上传文件(1/2)

    利用form表单的target属性和iframe 一、上传文件的一个php教程方法。 该方法接受一个$file参数,该参数为从客户端获取的$_files变量,返回重新命名后的文件名,如果上传失...2016-11-25
  • php简单用户登陆程序代码

    php简单用户登陆程序代码 这些教程很对初学者来讲是很有用的哦,这款就下面这一点点代码了哦。 <center> <p>&nbsp;</p> <p>&nbsp;</p> <form name="form1...2016-11-25
  • PHP实现清除wordpress里恶意代码

    公司一些wordpress网站由于下载的插件存在恶意代码,导致整个服务器所有网站PHP文件都存在恶意代码,就写了个简单的脚本清除。恶意代码示例...2015-10-23
  • PHP用strstr()函数阻止垃圾评论(通过判断a标记)

    strstr() 函数搜索一个字符串在另一个字符串中的第一次出现。该函数返回字符串的其余部分(从匹配点)。如果未找到所搜索的字符串,则返回 false。语法:strstr(string,search)参数string,必需。规定被搜索的字符串。 参数sea...2013-10-04
  • JS实现双击屏幕滚动效果代码

    本文实例讲述了JS实现双击屏幕滚动效果代码。分享给大家供大家参考,具体如下:这里演示双击滚屏效果代码的实现方法,不知道有觉得有用处的没,现在网上还有很多还在用这个特效的呢,代码分享给大家吧。运行效果截图如下:在线演...2015-10-30
  • jQuery+PHP发布的内容进行无刷新分页(Fckeditor)

    这篇文章将使用jQuery,并结合PHP,将Fckeditor发布的内容进行分页,并且实现无刷新切换页面。 本文假设你是WEB开发人员,掌握了jQuery和PHP相关知识,并且熟知Fckeditor的配置和使用。...2015-10-23
  • js识别uc浏览器的代码

    其实挺简单的就是if(navigator.userAgent.indexOf('UCBrowser') > -1) {alert("uc浏览器");}else{//不是uc浏览器执行的操作}如果想测试某个浏览器的特征可以通过如下方法获取JS获取浏览器信息 浏览器代码名称:navigator...2015-11-08
  • JS日期加减,日期运算代码

    一、日期减去天数等于第二个日期function cc(dd,dadd){//可以加上错误处理var a = new Date(dd)a = a.valueOf()a = a - dadd * 24 * 60 * 60 * 1000a = new Date(a)alert(a.getFullYear() + "年" + (a.getMonth() +...2015-11-08
  • PHP开发微信支付的代码分享

    微信支付,即便交了保证金,你还是处理测试阶段,不能正式发布。必须到你通过程序测试提交订单、发货通知等数据到微信的系统中,才能申请发布。然后,因为在微信中是通过JS方式调用API,必须在微信后台设置支付授权目录,而且要到...2014-05-31
  • PHP常用的小程序代码段

    本文实例讲述了PHP常用的小程序代码段。分享给大家供大家参考,具体如下:1.计算两个时间的相差几天$startdate=strtotime("2009-12-09");$enddate=strtotime("2009-12-05");上面的php时间日期函数strtotime已经把字符串...2015-11-24
  • 几种延迟加载JS代码的方法加快网页的访问速度

    本文介绍了如何延迟javascript代码的加载,加快网页的访问速度。 当一个网站有很多js代码要加载,js代码放置的位置在一定程度上将会影像网页的加载速度,为了让我们的网页加载速度更快,本文总结了一下几个注意点...2013-10-13
  • php怎么用拼音 简单的php中文转拼音的实现代码

    小编分享了一段简单的php中文转拼音的实现代码,代码简单易懂,适合初学php的同学参考学习。 代码如下 复制代码 <?phpfunction Pinyin($_String...2017-07-06
  • php导出csv格式数据并将数字转换成文本的思路以及代码分享

    php导出csv格式数据实现:先定义一个字符串 存储内容,例如 $exportdata = '规则111,规则222,审222,规222,服2222,规则1,规则2,规则3,匹配字符,设置时间,有效期'."/n";然后对需要保存csv的数组进行foreach循环,例如复制代...2014-06-07
  • ecshop商品无限级分类代码

    ecshop商品无限级分类代码 function cat_options($spec_cat_id, $arr) { static $cat_options = array(); if (isset($cat_options[$spec_cat_id]))...2016-11-25