获得php代码使用占用内存的情况

 更新时间:2016年11月25日 17:27  点击:1517
在php中要获取php脚本使用的内存情况我们可以使用php自带函数memory_get_usage()来实例,他可以查看当前 PHP 脚本执行占用的内存多少,下面我来来看看

 memory_get_usage()官方语法

一,函数原型
int memory_get_usage ([ bool $real_usage = false ] )

二,版本兼容
PHP 4 >= 4.3.2, PHP 5

三,基础用法与实例


我们可以直接使用 PHP函数 memory_get_usage() 查看系统分配给当前 PHP 脚本执行占用的内存多少。
 

 代码如下 复制代码

<?php
echo memory_get_usage(), '<br />';  // 79248
$tmp = str_repeat('http://3aj.cn/', 4000);  // 135408
echo memory_get_usage(), '<br />';
unset($tmp);
echo memory_get_usage();  // 79248
?> 

程序输出的数字单位为 byte(s),也就是当时 PHP 脚本使用的内存(不含 memory_get_usage() 函数本身占用的内存)。

由上面的例子可以看出,要想减少内存的占用,可以使用 PHP unset() 函数把不再需要使用的变量删除。类似的还有:PHP mysql_free_result() 函数,可以清空不再需要的查询数据库得到的结果集,这样也能得到更多可用内存。

PHP memory_get_usage() 函数还可以有个参数,$real_usage,其值为布尔值。默认为 FALSE,表示得到的内存使用量不包括该函数(PHP 内存管理器)占用的内存;当设置为 TRUE 时,得到的内存为不包括该函数(PHP 内存管理器)占用的内存。


格式化 memory_get_usage() 结果以 KB 为单位输出

 代码如下 复制代码

<?php  

 function convert($size){  

    $unit=array('b','kb','mb','gb','tb','pb'); 

     return @round($size/pow(1024,($i=floor(log($size,1024)))),2).' '.$unit[$i]; 

 } 

echo convert(memory_get_usage(true)); 

 ?>


自定义函数获取数组或变量值大小

 

 代码如下 复制代码
<?php
function array_size($arr){
 ob_start();
 print_r($arr);
 $mem=ob_get_contents();
 ob_end_clean();
 $mem=preg_replace("/n +/","",$mem);
 $mem=strlen($mem);
 return $mem;
}
$memEstimate=array_size($GLOBALS);
?>

所以在实际编程中,可以用 memory_get_usage() 函数比较各个方法占用内存的高低,来选择使用哪种占用内存小的方法。
 

附带个使用函数:

 

 代码如下 复制代码
<?php
if (!function_exists('memory_get_usage')) {
 function memory_get_usage() {
     $pid = getmypid();
      if (IS_WIN) {
         exec('tasklist /FI "PID eq ' . $pid . '" /FO LIST', $output);
         return preg_replace('/[^0-9]/', '', $output[5]) * 1024;
      } else {
         exec("ps -eo%mem,rss,pid | grep $pid", $output);
         $output = explode(" ", $output[0]);
         return $output[1] * 1024;
      }
    }
}
?> 

再来个函数使用例子:
 

 

 代码如下 复制代码

<?php 
//memory_get_usage(); 
 
$m1 = memory_get_usage(); 
echo '<br /> m1:',$m1;  // m1:80160
 
$a = 'hello'; 
$b =  str_repeat($a,1000); 
 
$m2 = memory_get_usage(); 
echo '<br /> m2:',$m2;  // m2:85624

unset($b); 
 
$m3 = memory_get_usage(); 
echo '<br /> m3:',$m3;  // m3:80600
?>


所以在实际编程中,可以用PHP memory_get_usage()比较各个方法占用内存的高低,来选择使用哪种占用内存小的方法。

我们要写原生太的文章内容分页程序,原理很简单,就是在编辑时我们在编辑器中插入分页符,然后在显示时我们直接使用explode分页就可以实现了,当然有更高级的就是分页保存不同的记录,然后再生成相对复杂一些。

将正文按照一定字符串进行分割,分割后在按照页码进行数组索引,将当前页码对应数组的值输出即可,好像说得够晕的,下面来个实例:

 代码如下 复制代码

<?php
$str = "asd啊<b>是</b>大叔大叔asd杀毒发[NextPage]生的啊师傅 <a href="asd">asd</a> 啊师傅asd a速度发啥地方";
//接收页码(如果不存在就为1)
$page = $_REQUEST['page'] ? $_REQUEST['page'] : 1;
//通过分割符分割内容
$arr = explode("[NextPage]",$str);
//如果分割出来的数组大小为1即未进行分页
if(count($arr)==1){
 echo $str;
}else{
 //按页码输出相应的内容
 echo $arr[$page-1];
 //分页页码
 for($i=1;$i<=count($arr);$i++){ 
  if($page == $i){//当前页
   echo "<a href='?page=".$i."' class='current'>".$i."</a> ";
  }else{
    echo "<a href='?page=".$i."' >".$i."</a> ";
  }
 }
}
?>

我们这里是演示一个实例就是可根据用户输入自己的腾讯微博就可以实现快速发布了,这个功能我们自己开发也简单,直接把用户名与密码加上即可解决。

下面来介绍一下如何通过PHP来进行腾讯微博操作,也可以直接查看演示。

如何用PHP登陆微博账户
腾讯的登录需要两个步鄹,第一步是根据自己的QQ号获取验证码,验证地址是:

 代码如下 复制代码
http://ptlogin2.qq.com/check?uin=@'.$qq.'&appid=46000101

其中$qq代表你的微博帐号,通过这个验证你可以得到如下的结果:

 代码如下 复制代码
ptui_checkVC('0','!CCQ');

其中!CCQ就是对应的验证码。这是一个随机码,每次访问都会有变化的。第二步就是把用户名,密码和验证码等信息提交到下面的地址:

 代码如下 复制代码
http://ptlogin2.qq.com/login?u=@'.$qq.'&p='.md5($password.$verifyCode).'&verifycode='.$verifyCode.'&aid=46000101&u1=http%3A%2F%2Ft.qq.com&h=1&from_ui=1&fp=loginerroralert

其中u=@'.$qq.'指的是你的微博帐号

 代码如下 复制代码
p='.md5($pwd.$verifyCode).'

是经过加密的密码,这个参数比较复杂,首先要把用户的qq密码经过md5_3加密,然后和刚刚返回的验证码组合,再使用md5加密

 代码如下 复制代码
&verifycode='.$verifyCode.'

值得就是刚刚返回的验证码

 代码如下 复制代码
&aid=46000101&u1=http%3A%2F%2Ft.qq.com&h=1&from_ui=1&fp=loginerroralert

其他这些参数都是固定的不用修改,在请求这个地址以后如果正确会返回下面的信息:

 代码如下 复制代码
ptuiCB('0','0','http://t.qq.com','0');

这个时候就算登录成功了,接下来就可以对微博进行操作了。

如何用PHP给微博发广播
发送广播很简单,只要想指定地址发送(POST)四个参数即可,提交的地址是:

 代码如下 复制代码
http://t.qq.com/publish.php

POST的数据有:


conten'=urlencode($content) ,指的是广播的内容,提交时需要用URL编码
pic=&countType=&viewModel=1 这些参数不用变,这里值得注意一点的是publish.php 页面需要验证提交地址,提交地址必须是来自于 http://t.qq.com/ 所以在发送POST请求的时候,需要提交一个REFERER。这样就可以发布成功了,返回的结果如下:

 代码如下 复制代码
{result:0,msg:'广播成功',info:{'talk':[{"id":"XXXXXX","content":"u53c8u5f00u59cbu4e0bu96e8u4e86uff01","time":"u521au521a","type":1,"image":[],"from":"XXXXXX","name":"","nick":"","pic":"","flag":[],"count":0,"timestamp":1279167435}]}}

如何用PHP收听其他用户的微博
收听微博的操作和发送广播的操作基本一样,也是往指定的地址发送(POST)数据,不过只需要有两个参数就可以了,提交的地址是:

http://t.qq.com/follow.php
POST的数据有:
'u'=>urlencode($follow) $follow指的是你想要收听的用户的微博号
'r'=>urlencode(time()) 这是一个随机码
提交以后,如果成功返回的结果如下:
{result:0,msg:'成功'}
到此为止,利用PHP对腾讯微博发布和收听的操作就都已经完成了

本文章给大家介绍在php 中利用date和strtotime函数获取用户给定时间的第一天或文章最后一天,有需要了解学习的朋友可进入参考。

借助于date和strtotime函数,可以轻松的获取本月、下月以及上月的第一天和最后一天,下面分别给出其实现。其中函数的参数date格式为yyyy-MM-dd。

1、给定一个日期,获取其本月的第一天和最后一天

 代码如下 复制代码

function getCurMonthFirstDay($date) {
    return date('Y-m-01', strtotime($date));
}

function getCurMonthLastDay($date) {
    return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' +1 month -1 day'));
}

2、给定一个日期,获取其下月的第一天和最后一天

 代码如下 复制代码

function getNextMonthFirstDay($date) {
    return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' +1 month'));
}

function getNextMonthLastDay($date) {
    return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' +2 month -1 day'));
}

3、给定一个日期,获取其下月的第一天和最后一天

 代码如下 复制代码

function getPrevMonthFirstDay($date) {
    return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' -1 month'));
}

function getPrevMonthLastDay($date) {
    return date('Y-m-d', strtotime(date('Y-m-01', strtotime($date)) . ' -1 day'));
}

其中strtotime函数参数"+1 month",php会根据具体月份来确定增加多少天,可能是28、29(2月)、30(小月)或 31(大月);某月的第一天 "-1 day" 自然就是上个月最后一天,php也会根据月来智能确定是28、29、30或31。


strtotime — 将任何英文文本的日期时间描述解析为 Unix 时间戳


Report a bug 说明
int strtotime ( string $time [, int $now = time() ] )
本函数预期接受一个包含美国英语日期格式的字符串并尝试将其解析为 Unix 时间戳(自 January 1 1970 00:00:00 GMT 起的秒数),其值相对于 now 参数给出的时间,如果没有提供此参数则用系统当前时间。

本文章来给大家详细介绍关于在php curl 分离header和body信息测试实例,以前可能大家没注意,后来分析了一下,下面给大家介绍。

php中可以通过curl来模拟http请求,同时可以获取http response header和body,当然也设置参数可以只获取其中的某一个。当设置同时获取response header和body时候,它们会一同作为结果返回。这时需要我们自己来分离它们。

下面代码是模拟向google一个http GET请求

 代码如下 复制代码

function httpGet() {
    $url = 'http://www.google.com.hk';

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_HEADER, TRUE);    //表示需要response header
    curl_setopt($ch, CURLOPT_NOBODY, FALSE); //表示需要response body
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, TRUE);
    curl_setopt($ch, CURLOPT_FOLLOWLOCATION, FALSE);
    curl_setopt($ch, CURLOPT_AUTOREFERER, TRUE);
    curl_setopt($ch, CURLOPT_TIMEOUT, 120);

    $result = curl_exec($ch);

    if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == '200') {
        return $result;
    }

    return NULL;
}

调用上述方法后看到如下类似输出:

HTTP/1.1 200 OK
Date: Tue, 09 Jul 2013 14:21:08 GMT
Expires: -1
Cache-Control: private, max-age=0
Content-Type: text/html; charset=UTF-8
Set-Cookie: PREF=ID=75e996a7ad21f47b:FF=0:NW=1:TM=1373379668:LM=1373379668:S=TTLQQN-jwGDYnkkY; expires=Thu, 09-Jul-2015 14:21:08 GMT; path=/; domain=.google.com.hk
Set-Cookie: NID=67=PPu7FfFeuZqwfsrUifgzjidX4JZxxCPLe9xFHjdXhfHpzs3gaykFSH5uGXy2esWTlp_rdqIYkjFDMollzI_sA-8owxD3mDh6KCRwdMa9-g5VChj0E5XAGNjo9d-sZfLN; expires=Wed, 08-Jan-2014 14:21:08 GMT; path=/; domain=.google.com.hk; HttpOnly
P3P: CP="This is not a P3P policy! See http://www.google.com/support/accounts/bin/answer.py?hl=en&answer=151657 for more info."
Server: gws
X-XSS-Protection: 1; mode=block
X-Frame-Options: SAMEORIGIN
Transfer-Encoding: chunked

<!doctype html><html itemscope="itemscope" itemtype="http://schema.org/WebPage"><head><meta itemprop="image" content="/images/google_favicon_128.png"><title>Google</title><script>(function(){
window.google={kEI:"VBzcUdWuHOmtiQf64IHoCw",getEI:function(a){for(var b;a&&(!a.getAttribute||!(b=a.getAttribute("eid")));
……
这里可以看到结果中header和body信息是在一起的,那么如何分离它们呢。方法有二种,一是通过curl自带的curl_getinfo()方法获取头的长度,然后使用substr来分割字符串。示例代码如下:

 代码如下 复制代码

$response = curl_exec($ch);

if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == '200') {
    $headerSize = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
    $header = substr($response, 0, $headerSize);
    $body = substr($response, $headerSize);
}

第二种方法基于header和body是通过两个回车换行来分割的,所以可以通过如下代码实现:

 代码如下 复制代码

$response = curl_exec($ch);

if (curl_getinfo($ch, CURLINFO_HTTP_CODE) == '200') {
    list($header, $body) = explode("rnrn", response, 2);
}

[!--infotagslink--]

相关文章

  • 图解PHP使用Zend Guard 6.0加密方法教程

    有时为了网站安全和版权问题,会对自己写的php源码进行加密,在php加密技术上最常用的是zend公司的zend guard 加密软件,现在我们来图文讲解一下。 下面就简单说说如何...2016-11-25
  • ps怎么使用HSL面板

    ps软件是现在很多人都会使用到的,HSL面板在ps软件中又有着非常独特的作用。这次文章就给大家介绍下ps怎么使用HSL面板,还不知道使用方法的下面一起来看看。 &#8195;...2017-07-06
  • Plesk控制面板新手使用手册总结

    许多的朋友对于Plesk控制面板应用不是非常的了解特别是英文版的Plesk控制面板,在这里小编整理了一些关于Plesk控制面板常用的使用方案整理,具体如下。 本文基于Linu...2016-10-10
  • 使用insertAfter()方法在现有元素后添加一个新元素

    复制代码 代码如下: //在现有元素后添加一个新元素 function insertAfter(newElement, targetElement){ var parent = targetElement.parentNode; if (parent.lastChild == targetElement){ parent.appendChild(newEl...2014-05-31
  • jQuery 1.9使用$.support替代$.browser的使用方法

    jQuery 从 1.9 版开始,移除了 $.browser 和 $.browser.version , 取而代之的是 $.support 。 在更新的 2.0 版本中,将不再支持 IE 6/7/8。 以后,如果用户需要支持 IE 6/7/8,只能使用 jQuery 1.9。 如果要全面支持 IE,并混合...2014-05-31
  • 使用percona-toolkit操作MySQL的实用命令小结

    1.pt-archiver 功能介绍: 将mysql数据库中表的记录归档到另外一个表或者文件 用法介绍: pt-archiver [OPTION...] --source DSN --where WHERE 这个工具只是归档旧的数据,不会对线上数据的OLTP查询造成太大影响,你可以将...2015-11-24
  • 使用GruntJS构建Web程序之构建篇

    大概有如下步骤 新建项目Bejs 新建文件package.json 新建文件Gruntfile.js 命令行执行grunt任务 一、新建项目Bejs源码放在src下,该目录有两个js文件,selector.js和ajax.js。编译后代码放在dest,这个grunt会...2014-06-07
  • 如何使用php脚本给html中引用的js和css路径打上版本号

    在搜索引擎中搜索关键字.htaccess 缓存,你可以搜索到很多关于设置网站文件缓存的教程,通过设置可以将css、js等不太经常更新的文件缓存在浏览器端,这样访客每次访问你的网站的时候,浏览器就可以从浏览器的缓存中获取css、...2015-11-24
  • MySQL日志分析软件mysqlsla的安装和使用教程

    一、下载 mysqlsla [root@localhost tmp]# wget http://hackmysql.com/scripts/mysqlsla-2.03.tar.gz--19:45:45-- http://hackmysql.com/scripts/mysqlsla-2.03.tar.gzResolving hackmysql.com... 64.13.232.157Conn...2015-11-24
  • C#注释的一些使用方法浅谈

    C#注释的一些使用方法浅谈,需要的朋友可以参考一下...2020-06-25
  • 浅谈redis key值内存消耗以及性能影响

    这篇文章主要介绍了浅谈redis key值内存消耗以及性能影响,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧...2021-02-07
  • 详解分析MySQL8.0的内存消耗

    这篇文章主要介绍了详解分析MySQL8.0的内存消耗,帮助大家更好的理解和学习使用MySQL,感兴趣的朋友可以了解下...2021-03-23
  • 安装和使用percona-toolkit来辅助操作MySQL的基本教程

    一、percona-toolkit简介 percona-toolkit是一组高级命令行工具的集合,用来执行各种通过手工执行非常复杂和麻烦的mysql和系统任务,这些任务包括: 检查master和slave数据的一致性 有效地对记录进行归档 查找重复的索...2015-11-24
  • php语言中使用json的技巧及json的实现代码详解

    目前,JSON已经成为最流行的数据交换格式之一,各大网站的API几乎都支持它。我写过一篇《数据类型和JSON格式》,探讨它的设计思想。今天,我想总结一下PHP语言对它的支持,这是开发互联网应用程序(特别是编写API)必须了解的知识...2015-10-30
  • 使用jquery修改表单的提交地址基本思路

    基本思路: 通过使用jquery选择器得到对应表单的jquery对象,然后使用attr方法修改对应的action 示例程序一: 默认情况下,该表单会提交到page_one.html 点击button之后,表单的提交地址就会修改为page_two.html 复制...2014-06-07
  • PHP实现无限级分类(不使用递归)

    无限级分类在开发中经常使用,例如:部门结构、文章分类。无限级分类的难点在于“输出”和“查询”,例如 将文章分类输出为<ul>列表形式; 查找分类A下面所有分类包含的文章。1.实现原理 几种常见的实现方法,各有利弊。其中...2015-10-23
  • php类的使用实例教程

    php类的使用实例教程 <?php /** * Class program for yinghua05-2 * designer :songsong */ class Template { var $tpl_vars; var $tpl_path; var $_deb...2016-11-25
  • 双冒号 ::在PHP中的使用情况

    前几天在百度知道里面看到有人问PHP中双冒号::的用法,当时给他的回答比较简洁因为手机打字不大方便!今天突然想起来,所以在这里总结一下我遇到的双冒号::在PHP中使用的情况!双冒号操作符即作用域限定操作符Scope Resoluti...2015-11-08
  • 浅析Promise的介绍及基本用法

    Promise是异步编程的一种解决方案,在ES6中Promise被列为了正式规范,统一了用法,原生提供了Promise对象。接下来通过本文给大家介绍Promise的介绍及基本用法,感兴趣的朋友一起看看吧...2021-10-21
  • PHP mysql与mysqli事务使用说明 分享

    mysqli封装了诸如事务等一些高级操作,同时封装了DB操作过程中的很多可用的方法。应用比较多的地方是 mysqli的事务。...2013-10-02