PHP的中使用非缓冲模式查询数据库的方法

 更新时间:2017年7月6日 23:49  点击:2097
小编推荐的这篇文章介绍了PHP的中使用非缓冲模式查询数据库的方法,非常实用,有兴趣的同学快来看看吧。

最近在开发一个PHP程序时遇到了下面的错误:

PHP Fatal error: Allowed memory size of 268 435 456 bytes exhausted

错误信息显示允许的最大内存已经耗尽。遇到这样的错误起初让我很诧异,但转眼一想,也不奇怪,因为我正在开发的这个程序是要用一个foreach循环语句在一个有4万条记录的表里全表搜索具有特定特征的数据,也就是说,一次要把4万条数据取出,然后逐条检查每天数据。可想而知,4万条数据全部加载到内存中,内存不爆才怪。

毕竟编程这么多年,我隐约记得PHP里提供有非一次全部加载数据的API,是像处理流媒体那样,随用随取随丢、数据并不会积累在内存的查询方法。经过简单的搜索,果然在官方网站上找到的正确的用法。缓冲查询和非缓冲查询(Buffered  and Unbuffered  queries)。PHP的查询缺省模式是缓冲模式。也就是说,查询数据结果会一次全部提取到内存里供PHP程序处理。这样给了PHP程序额外的功能,比如说,计算行数,将指针指向某一行等。更重要的是程序可以对数据集反复进行二次查询和过滤等操作。但这种缓冲查询模式的缺陷就是消耗内存。

另外一种PHP查询模式是非缓冲查询,数据库服务器会一条一条的返回数据,而不是一次全部返回,这样的结果就是PHP程序消耗较少的内存,但却增加了数据库服务器的压力,因为数据库会一直等待PHP来取数据,一直到数据全部取完。

非缓冲查询方法一: mysqli

 代码如下复制代码

<?php

$mysqli=newmysqli("localhost","my_user","my_password","world");

$uresult=$mysqli->query("SELECT Name FROM City", MYSQLI_USE_RESULT);

  

if($uresult) {

  while($row=$uresult->fetch_assoc()) {

    echo$row['Name'] . PHP_EOL;

  }

}

$uresult->close();

非缓冲查询方法二: pdo_mysql

 代码如下复制代码

<?php

$pdo=newPDO("mysql:host=localhost;dbname=world",'my_user','my_pass');

$pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, false);

  

$uresult=$pdo->query("SELECT Name FROM City");

if($uresult) {

  while($row=$uresult->fetch(PDO::FETCH_ASSOC)) {

    echo$row['Name'] . PHP_EOL;

  }

}

非缓冲查询方法三: mysql

 代码如下复制代码

<?php

$conn= mysql_connect("localhost","my_user","my_pass");

$db = mysql_select_db("world");

  

$uresult= mysql_unbuffered_query("SELECT Name FROM City");

if($uresult) {

  while($row= mysql_fetch_assoc($uresult)) {

    echo$row['Name'] . PHP_EOL;

  }

}

注:引之 http://www.webhek.com/php-buffered-and-unbuffered-queries

手册资料 http://php.net/manual/zh/mysqlinfo.concepts.buffering.php

小编推荐的这篇文章介绍了PHP进制转换实例分析(2,8,16,36,64进制至10进制相互转换),非常实用,有兴趣的同学快来看看吧。

本文实例讲述了PHP进制转换。分享给大家供大家参考,具体如下:

可以实现:

10进制转换2、8、16、36、62进制

2、8、16、36、62进制转换10进制

有点要注意下,2、8、16进制转换时,使用的是系统的自己的函数。

所以,不管怎么高精度转换值可能大于2147483646。

另外,

32进制低精转换,最大值:2147483646;
32进制高精转换,最大值:77309411327;
64进制高精转换,最大值:133143986175。

jinzhi.php文件,自带演示功能。

 代码如下 复制代码

<?php

$mtime1=explode(" ", microtime());

$startTime=$mtime1[0] +$mtime1[1];

?>

<html xmlns="http://www.w3.org/1999/xhtml">

<head>

<meta http-equiv="Content-Type"content="text/html; charset=gb2312"/>

<title>进制转换/title>

</head>

<body>

<form id="jzh"name="jinzhih"method="post"action="">

<input name="go"type="hidden"value="100">

<table width="482"border="1"cellpadding="0"cellspacing="0"bordercolor="#FFE8E8"bgcolor="#F4F8FB">

 <tr>

  <td width="194"><select name="jinzhi0"id="jinzhi0">

  <option value="2">2</option>

  <option value="8">8</option>

  <option value="10"selected="selected">10</option>

  <option value="16">16</option>

  <option value="36">36</option>

  <option value="62">62</option>

  </select>

进制</td>

 <td width="275"><input name="zhi"type="text"id="zhi"/></td>

 </tr>

 <tr>

  <td>进行<input name="lx"type="radio"value="0"checked="checked"/>

普通<input type="radio"name="lx"value="1"/>高精</td><td> </td>

 </tr>

 <tr>

  <td>转换为

  <select name="jinzhi1"id="jinzhi1">

   <option value="2"selected="selected">2</option>

   <option value="8">8</option>

   <option value="10">10</option>

   <option value="16">16</option>

   <option value="36">36</option>

   <option value="62">62</option>

  </select>进制,</td><td>总长度为

  <input name="changdu"type="text"id="changdu"value="10"size="4"maxlength="2"/>

字符。</td></tr><tr>

 <td><input type="submit"name="Submit"value="提交"/></td>

 <td><input type="reset"name="Submit2"value="重置"/></td>

 </tr></table>

 <p>注意:仅能进行10进制转换为2、8、16、36、62进制;或反转换。</p></form>

<?php

classjinzhi_class

{

   //10进制转2、8、16、36、62进制

   functionjinzhih_0($shu,$jinzhi,$w)

   {

   $zifu="";

   while($shu!=0){

   $linshi=$shu%$jinzhi;

   switch($jinzhi){

    case2:

     $zifu=decbin($shu);

     return$zifu;

    case8:

     $zifu=decoct($shu);

     return$zifu;

    case16:

     $zifu=dechex($shu);

     return$zifu;

    case36:

     if($linshi>=10)

     {

     $zifu.=chr(($linshi+55));

     }else{

      $zifu.=$linshi;}

     break;

    case62:

     if(($linshi>=10) && ($linshi36)) {$zifu.=chr($linshi+55);break;}

     if(($linshi>=36) && ($linshi62)) {$zifu.=chr($linshi+61);break;}

     $zifu.=$linshi;break;

   default:

   $zifu.=$linshi;

   break;

   }

   $shu=intval($shu/$jinzhi);

   }

   for($i=strlen($zifu);$i$w;$i++)

   $zifu.="0";

  returnstrrev($zifu);}

   //2、8、16、36、62进制转10进制

   functionjinzhih_1($zifu,$jinzhi,$w)

 {$shu=0;

  for($i=0;$i=strlen($zifu)-1;$i++)

     {

     $linshi=substr($zifu,$i,1);

     switch($jinzhi){

      case2:

       $shu=bindec($zifu);

       $i=strlen($zifu)+1;

       break;

      case8:

       $shu= octdec($zifu);

      $i=strlen($zifu)+1;

      break;

      case16:

       $shu= hexdec($zifu);

       $i=strlen($zifu)+1;

       break;

     case36:

      if(ord($linshi)=57)

      {$shu+=(ord($linshi)-48)*pow($jinzhi,strlen($zifu)-$i-1);

     }else{

       $shu=$shu+ (ord($linshi)-55)*pow($jinzhi,strlen($zifu)-$i-1);}

       break;

     case62:

      if(ord($linshi)=57)

      {$shu+=$linshi*pow($jinzhi,strlen($zifu)-$i-1);    

     }elseif((ord($linshi)>=65) && (ord($linshi)=90)){

      $shu+= (ord($linshi)-55)*pow($jinzhi,strlen($zifu)-$i-1);

      }else{

      $shu+= (ord($linshi)-61)*pow($jinzhi,strlen($zifu)-$i-1);}

      break;

     }

   }

   return$shu;

   }

   //10进制高精度转换2、8、16、36、62进制

   functionjinzhih_G0($shu,$jinzhi,$w)

   {

   $zifu="";

   while($shu!=0){

   $linshi=bcmod($shu,$jinzhi);

   switch($jinzhi){

    case2:

     $zifu=decbin($shu);

     return$zifu;

    case8:

     $zifu=decoct($shu);

     return$zifu;

    case16:

     $zifu=dechex($shu);

     return$zifu;

    case36:

     if($linshi>=10)

     {

     $zifu.=chr(($linshi+55));

     }else{

      $zifu.=$linshi;}

     break;

    case62:

     if(($linshi>=10) && ($linshi36)) {$zifu.=chr($linshi+55);break;}

     if(($linshi>=36) && ($linshi62)) {$zifu.=chr($linshi+61);break;}

     $zifu.=$linshi;break;

   default:

   $zifu.=$linshi;

   break;

   }

   $shu=intval(bcdiv($shu,$jinzhi));

   }

   for($i=strlen($zifu);$i$w;$i++)

   $zifu.="0";

  returnstrrev($zifu);}

   //2、8、16、36、62进制高精度转换10进制

   functionjinzhih_G1($zifu,$jinzhi,$w)

 {$shu="";

  for($i=0;$i=strlen($zifu)-1;$i++)

     {

     $linshi=substr($zifu,$i,1);

     switch($jinzhi){

      case2:

       $shu=bindec($zifu);

       $i=strlen($zifu)+1;

       break;

      case8:

       $shu= octdec($zifu);

      $i=strlen($zifu)+1;

      break;

      case16:

       $shu= hexdec($zifu);

       $i=strlen($zifu)+1;

       break;

     case36:

      if(ord($linshi)=57)

      {$shu=bcadd($shu,bcmul((ord($linshi)-48),bcpow($jinzhi,strlen($zifu)-$i-1)));

     }else{

       $shu=bcadd($shu,bcmul((ord($linshi)-55),bcpow($jinzhi,strlen($zifu)-$i-1)));}

       break;

     case62:

      if(ord($linshi)=57)

      {$shu=bcadd($shu,bcmul($linshi,bcpow($jinzhi,strlen($zifu)-$i-1)));

     }elseif((ord($linshi)>=65) && (ord($linshi)=90)){

      $shu=bcadd($shu,bcmul((ord($linshi)-55),bcpow($jinzhi,strlen($zifu)-$i-1)));

      }else{

      $shu=bcadd($shu,bcmul((ord($linshi)-61),bcpow($jinzhi,strlen($zifu)-$i-1)));

      }

      break;

     }

   }

   return$shu;}

}

if(isset($_GET["p"]))

{if($_GET["p"]==="1"){

echo"";

echo"提示:

";

echo"32进制低精转换,最大值:2147483646

";

echo"32进制高精转换,最大值:77309411327

";

echo"64进制高精转换,最大值:133143986175

";

echo"";

echo"值为:";

$Fs=newjinzhi_class();

if($_POST['lx']=="0"&&$_POST['jinzhi0']=="10")

{echo$Fs->jinzhih_0($_POST['zhi'],$_POST['jinzhi1'],$_POST['changdu'])."

";}

if($_POST['lx']=="1"&&$_POST['jinzhi0']=="10")

{echo$Fs->jinzhih_G0($_POST['zhi'],$_POST['jinzhi1'],$_POST['changdu']);}

if($_POST['lx']=="0"&&$_POST['jinzhi0']>"10")

{echo$Fs->jinzhih_1($_POST['zhi'],$_POST['jinzhi0'],$_POST['changdu']);}

if($_POST['lx']=="1"&&$_POST['jinzhi0']>"10")

{echo$Fs->jinzhih_G1($_POST['zhi'],$_POST['jinzhi0'],$_POST['changdu']);}

}

echo"";}

$mtime1=explode(" ", microtime());

$endTime=$mtime1[0] +$mtime1[1];

printf ("页面执行时间:%.6fs.",$endTime-$startTime);

?>

小编推荐的这篇文章介绍了yii2实现 "上一篇,下一篇" 功能的代码实例,非常实用,有兴趣的同学快来看看吧。

最近做了简答的文章详情页面,需要在页面底部加入上一篇,下一篇 按钮,分析了下,最基本需要有文章的标题和id(作为参数).

开始想的是当前的id加减1,但考虑到如果部分id丢失就不对了,于是分别查询比当前id大和小的记录并且限定为一条,于是有了以下代码。

代码如下,不对的地方请指教.

控制器中

 代码如下 复制代码

//查询上-篇文章

    $prev_article= 你的模型::find()

      ->andFilterWhere(['<','id',$id])

      ->andFilterWhere([其他条件)

      ->orderBy(['id'=> SORT_DESC])

      ->limit(1)

      ->one();

    //查询下-篇文章

    $next_article= 你的模型::find()

      ->andFilterWhere(['>','id',$id])

      ->andFilterWhere(其他条件)

      ->orderBy(['id'=> SORT_ASC])

      ->limit(1)

      ->one();

 

 

    $model['prev_article'] = [

      'url'=> !is_null($prev_article) ? Url::current(['id'=>$prev_article->id]) :'javascript:;',

      'title'=> !is_null($prev_article) ?$prev_article->title :'没有了',

    ];

 

    $model['next_article'] = [

      'url'=> !is_null($next_article) ? Url::current(['id'=>$next_article->id]) :'javascript:;',

      'title'=> !is_null($next_article) ?$next_article->title :'没有了',

    ];

 

    return$this->render('view',

      'model'=>$model,

    );

视图中

 代码如下 复制代码

<divclass="left">

    <p>上一篇:

      <a href="<?=$model['prev_article']['url']?>">

        <?=$model['prev_article']['title']?>

      </a>

    </p>

  </div>

  <divclass="right">

    <p>下一篇:

      <a href="<?=$model['next_article']['url']?>">

        <?=$model['next_article']['title']?>

      </a>

    </p>

  </div>

本文详细介绍了Yii2实现多域名跨域同步登录退出的教程,不会的同学可以参考一下,非常实用

在平台开发过程中,项目分为前台(frontend)www.xxx.com和后台(backend)  yun.xxx.com两部分,绑定两个域名,  我们知道在没有绑定域名的时候前后台可以同步登录和退出,但是绑定域名后就失效了,原因是session的作用域不同了。  两个域名的session作用域都只限制在了自己的域名上,我们的解决办法是将不同二级域名的作用域都改成顶级域名xxx.com。

在common/config/main.PHP里面增加如下代码:

 代码如下复制代码

//跨域session域名配置,获取当前主机名

$host_array=explode('.',$_SERVER["HTTP_HOST"]);

//针对com域名,获取顶级域名

if(count($host_array) == 3) {

  define('DOMAIN',$host_array[1] .'.'.$host_array[2]);

}

//针对com.cn域名

elseif(count($host_array) == 4) {

  define('DOMAIN',$host_array[1] .'.'.$host_array[2].'.'.$host_array[3]);

}

else{

  //echo "本系统不支持本地访问,请配置域名";exit;

}

define('DOMAIN_HOME','www.'. DOMAIN);

define('DOMAIN_YUN','yun.'. DOMAIN);

define('DOMAIN_API','api.'. DOMAIN);

define('DOMAIN_EMAIL','mail.'. DOMAIN);

define('DOMAIN_IMG','img.'. DOMAIN);

修改components部分,改变session作用域

 代码如下复制代码

'user'=> [

      'identityClass'=>'common\models\User',

      'enableAutoLogin'=> true,

      'identityCookie'=> ['name'=>'_identity','httpOnly'=> true,'domain'=>'.'. DOMAIN],

    ],

    'session'=> [

      'cookieParams'=> ['domain'=>'.'. DOMAIN,'lifetime'=> 0],

      'timeout'=> 3600,

    ],

通过上述配置后,多个二级域名间就可以实现同步登录和退出了。

[!--infotagslink--]

相关文章

  • PHP 数据库缓存Memcache操作类

    操作类就是把一些常用的一系列的数据库或相关操作写在一个类中,这样调用时我们只要调用类文件,如果要执行相关操作就直接调用类文件中的方法函数就可以实现了,下面整理了...2016-11-25
  • C#连接SQL数据库和查询数据功能的操作技巧

    本文给大家分享C#连接SQL数据库和查询数据功能的操作技巧,本文通过图文并茂的形式给大家介绍的非常详细,需要的朋友参考下吧...2021-05-17
  • Mybatis Plus select 实现只查询部分字段

    这篇文章主要介绍了Mybatis Plus select 实现只查询部分字段的操作,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-01
  • C#从数据库读取图片并保存的两种方法

    这篇文章主要介绍了C#从数据库读取图片并保存的方法,帮助大家更好的理解和使用c#,感兴趣的朋友可以了解下...2021-01-16
  • Intellij IDEA连接Navicat数据库的方法

    这篇文章主要介绍了Intellij IDEA连接Navicat数据库的方法,本文通过图文并茂的形式给大家介绍的非常详细,对大家的学习或工作具有一定的参考借价值,需要的朋友可以参考下...2021-03-25
  • 在数据库里将毫秒转换成date格式的方法

    在开发过程中,我们经常会将日期时间的毫秒数存放到数据库,但是它对应的时间看起来就十分不方便,我们可以使用一些函数将毫秒转换成date格式。 一、 在MySQL中,有内置的函数from_unixtime()来做相应的转换,使用如下: 复制...2014-05-31
  • C#操作本地文件及保存文件到数据库的基本方法总结

    C#使用System.IO中的文件操作方法在Windows系统中处理本地文件相当顺手,这里我们还总结了在Oracle中保存文件的方法,嗯,接下来就来看看整理的C#操作本地文件及保存文件到数据库的基本方法总结...2020-06-25
  • 如何解决局域网内mysql数据库连接慢

    通过内网连另外一台机器的mysql服务, 确发现速度N慢! 等了大约几十秒才等到提示输入密码。 但是ping mysql所在服务器却很快! 想到很久之前有过类似的经验, telnet等一些服务在连接请求的时候,会做一些反向域名解析(如果...2015-10-21
  • MySQL快速复制数据库数据表的方法

    某些时候,例如为了搭建一个测试环境,或者克隆一个网站,需要复制一个已存在的mysql数据库。使用以下方法,可以非常简单地实现。假设已经存在的数据库名字叫db1,想要复制一份,命名为newdb。步骤如下:1. 首先创建新的数据库newd...2015-10-21
  • MyBatisPlus-QueryWrapper多条件查询及修改方式

    这篇文章主要介绍了MyBatisPlus-QueryWrapper多条件查询及修改方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2022-06-27
  • mysqldump命令导入导出数据库方法与实例汇总

    mysqldump命令的用法1、导出所有库系统命令行mysqldump -uusername -ppassword --all-databases > all.sql 2、导入所有库mysql命令行mysql>source all.sql; 3、导出某些库系统命令行mysqldump -uusername -ppassword...2015-10-21
  • Mysql数据库错误代码中文详细说明

    1005:创建表失败1006:创建数据库失败1007:数据库已存在,创建数据库失败1008:数据库不存在,删除数据库失败1009:不能删除数据库文件导致删除数据库失败1010:不能删除数据目录导致删除数据库失败1011:删除数据库...2013-09-23
  • Oracle使用like查询时对下划线的处理方法

    这篇文章主要介绍了Oracle使用like查询时对下划线的处理方法,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2021-03-16
  • 解决mybatis-plus 查询耗时慢的问题

    这篇文章主要介绍了解决mybatis-plus 查询耗时慢的问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-07-04
  • c#异步读取数据库与异步更新ui的代码实现

    这篇文章主要介绍了c#从数据库里取得数据并异步更新ui的方法,大家参考使用吧...2020-06-25
  • Yii2.0高级框架数据库增删改查的一些操作

    yii2.0框架是PHP开发的一个比较高效率的框架,集合了作者的大量心血,下面通过用户为例给大家详解yii2使用中的一些基本的增删改查操作。 User::find()->all(); //返回所有用户数据; User::findOne($id); //返回 主键...2015-11-24
  • springBoot 项目排除数据库启动方式

    这篇文章主要介绍了springBoot 项目排除数据库启动方式,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教...2021-09-10
  • MYSQL数据库使用UTF-8中文编码乱码的解决办法

    1.用phpmyadmin创建数据库和数据表 创建数据库的时候,请将“整理”设置为:“utf8_general_ci” 或执行语句: 复制代码 代码如下:CREATE DATABASE `dbname` DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci; 创...2015-10-21
  • Linux 下使用shell脚本定时维护数据库的案例

    这篇文章主要介绍了Linux 下使用shell脚本定时维护数据库,本文通过案例分析给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下...2020-07-11
  • PHP连接公司内部服务器的MYSQL数据库的简单实例

    “主机,用户名,密码”得到连接、“数据库,sql,连接”得到结果,最后是结果的处理显示。当然,数据库连接是扩展库为我们完成的,我们能做的仅仅是处理结果而已。...2013-09-29