背景:多个项目进行代码的日志打印级别统一替换时,如果文件庞大,数目多,一个个去做显然力不从心,得通过脚本,这种替换sed最适合不过了。


sed实现去注释,加中间小横:
#BuildRequires: %{_php_fpm}%{php_version}                                                                                                                    
#Requires: %{_php_fpm}%{php_version}



fpm}%{php  ==替换成=> fpm}-%{php:


如题:
I:
我想把:log_threshold =N;
替换为:log_threshold =1;

我想把:show_debug_errors=AnyWord;
替换为:show_debug_errors=false;

II:
error_reporting(E_ALL ^ E_NOTICE); 变:
//error_reporting(E_ALL ^ E_NOTICE);

I):日志开关,错误级别修改:
一、Sed替换方法如下(该处由scottjiang兄弟提供,后面我发挥了一下下:-)):


二、如果不想备份直接替换:


三、多个项目的index.php都要统一用sed替换:



II):sed实现对PHP代码某特征给注释一行(如:项目上线时不想让其打开错误报告给用户):
如想:
error_reporting(E_ALL ^ E_NOTICE); 变:
//error_reporting(E_ALL ^ E_NOTICE);
sed替换方法:

而:也可结合上面三实现批量替换实现多个文件包含上面串的该行给予注释掉:


四、替换由mysqldump出的自境长字段为0:
情形:Mysqldump出的线下自增长字段,会有默认值,而放到外网则需要从线上开始,此SQL也需要替换的(http://jackxiang.com/post/1188/)
deo` VALUES (1121,NULL,'
用sed替换:
sed -i "s/([0-9]*/(0/g" /tmp/result.sql  
替换后,为0,上线插入时则从线上默认增长,而不是上面的1121:
_video` VALUES (0,NULL,'2'

sed -i 's/([0-9]*,/(0,/g'   //文件名替换(12122, ==>(0,
背景:处理网站访问时后面才进行写日志,常看到类似的类里在单例中这样使,好多都是说类中,而没有谈到类中是单例的使用方法,如下:


简单实践:


运行情况:
---------- 调试PHP ----------
注册完shutdown函数
做数据链接,写入日志内容但不写在shutdown:clean_exit时写。
干完所有事情了,立即退出
clean_exit时写在web运行完后在这儿做写日志等的操作,单例模式注册日志先放前面数组,后面在这儿写。
输出完成 (耗时 0 秒) - 正常终止
阅读全文
这个是同事写的,在这里备注一下:
背景:线上用unix socket线下测试用tcp 9000,配置一样上线会出问题的。再就是这两种的区别。
两种不同配置会在Nginx上反映出来的:
125 connect() to unix:/usr/local/php/var/run/php-fpm.sock failed (2: No such file or directory) while connecting to upstream, client: 192.168.136.1, server: mytv.xiyou.cntv.cn, request:

    在你fpm启动脚本php-fpm.conf里配置,在php-fpm.cnf里设置,AF_UNIX稳定性比TCP要高多了,unix socket或者TCP,unix socket的好处是性能更好,一个是AF_UNIX,本地管道,只能本机用一个AF_INET,通过网卡通讯,听说unix不如inet稳定?一个是AF_UNIX,本地管道,只能本机用一个AF_INET,通过网卡通讯。nginx如果打算和fpm在同一台机器,那就用unix sock
如果想分开部署,可以用TCP
基本还是tcp吧
这年头,哪还有一台机器什么都干的事
unix socket是一个环形内存buffer,内核保证顺序
淘宝这里前端接入层是LVS,RS就是nginx + php-fpm,它们之间使用unix sock通信,每台机器都配置一个nginx+php。
回忆未来-向东-Jàck()  下午 03:08:27
不同在:
listen = 127.0.0.1:9000
listen = /usr/local/php/var/run/php-fpm.sock
Nginx在配置上也就不同了:
fastcgi_pass  127.0.0.1:9000;  
fastcgi_index index.php;
include fcgi.conf;

fastcgi_pass  unix:/usr/local/php/var/run/php-fpm.sock;
fastcgi_index index.php;
include fastcgi.conf;

阅读全文
背景:外包水平太差了,上传图片裁剪,先放服务器,再读取裁剪,我记得可以在用户本地裁剪的,这块都写成那样了,就那样吧,这块设计到图片显示,因支持多个域名和部署问题这块还得直接显示,PHP直接显示图片,用浏览器访问是不可能的,要用SRC:<img src="http://jackxiang.com/logo/getpic?filename=201310262031159804.png&amp;rand=1382790675000">。
PHP读取图像文件并在浏览器上显示
去年做过一个项目,要把用户上传的图像文件用PHP读取图像文件并列出文字清单,当用户点击一个文件名后,就可以显示这个图像.

因为要考虑兼容各种不同的图像格式, 我使用了GD库, 判断出具体是那种图像文件(MINE),再调用相应的image生成函数imagecreatefromXXX(),生成一个img,再将这个img以jpeg格式输出至浏览器,虽然做出来了,但总觉得不满意.

今天有机会重新考虑这个功能,在php手册中发现几行代码,简洁明快,完全能实现我要的功能,还不需要GD库

代码如下:

$size = getimagesize($filename); //获取mime信息
$fp=fopen($filename, "rb"); //二进制方式打开文件
if ($size && $fp) {
header("Content-type: {$size['mime']}");
fpassthru($fp); // 输出至浏览器
exit;
} else {
// error
}
?>

代码量是我原来的1/10都不到,速度快了N倍.
外包说三年经验,这个没调出来,我看未必啊,
给他下面的参考代码都给弄错了,我调通了下,他继续:

来处:http://www.shangxueba.com/jingyan/122754.html
其实就是一个ps进程探测,
后面写一个分析
文件先贴出来。
Monitor.sh代码


Init.xml代码:


来自:http://cocos.iteye.com/blog/1063333
背景:近来有一个需求也就是让外包做一个类新浪微博里的短域名功能,而外包给出说是js跳转的,用的是alt里的属性值实现的,让我想起当年我在新浪微博时,正好让一兄弟去做这个短域名的事情,后来就离开了新浪微博,于是有这事儿就了解下呗,其实现方式上有与外包所述有较大出入。
在微博里找个短的Url示例链接如下:http://t.cn/zRM2bLm ,直接贴上google的chrome浏览器里并分析其Http协议头:
请求头和返回如下:
一)Google的Chrome发起请求:
HTTP/1.0 302 Moved Temporarily
Request URL:http://t.cn/zRM2bLm
Request Method:GET
Status Code:302 Moved Temporarily
Request Headersview source
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8
Accept-Encoding:gzip,deflate,sdch
Accept-Language:zh-CN,zh;q=0.8
Cache-Control:max-age=0
Host:t.cn
Proxy-Connection:keep-alive
User-Agent:Mozilla/5.0 (Windows NT 6.1) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/29.0.1530.2 Safari/537.36

二)服务端返回Location的Url:
Response Headersview source
Age:0
Connection:Keep-Alive
Content-Length:224
Content-Type:text/html;charset=UTF-8
Date:Mon, 21 Oct 2013 02:34:02 GMT
Location:http://www.iheima.com/archives/54668.html
NetAnts:MaxConnection=1
Proxy-Connection:Keep-Alive
Server:weibo
Via:1.1 varnish
X-Varnish:3008712889

三)HTML给用户的展现(一瞬间就过去了,浏览器直接重新定向,几乎看不到的):


这块要快,其实现有可能是通过key=value格式的,如nginx直接代码到某些no-sql存储里实现的才能实现较大并发,
当然对这些url可以实现hash到多台服务器即可实现横向扩展。
这个哥们的redis值得借鉴:http://zjcjack.blog.163.com/blog/static/20283218020130319363715/
背景:在线上代码和线下代码不一致时,用这个时间先比对是很重要的,首先看时间确定是不是最新的代码,再进行问题排查是很有必要的。再就是线上代码的调试,要注意其函数和调用层次位置,一定要区分开线下最新代码区分看(线下有zend 等跳转有可能心里觉得线下是最好的样板,而给调试带来不便。),主要是通过版本号来判定线上是否已经更新上去了。
实践OK如下:
只需要对svnClient安装后,选中目录或文件点右键,TortoiseSVN-> properties->New...->Keywords,选中:ID即可:
* @version    $Id: imageinfo.php 230 2014-10-10 07:33:10Z xiangdong $
提交后自己就给变成自己的当前文件,日期及版本号。
—————————————更多参数———————————————————————————————————————————
Subversion 的 svn:keywords 是一个非常有用的功能,可以让你将发生在源代码中的一些属性的变化自动地更新到源代码中。
所有php的开头都要加上
/**
* @version    $Id: activitymodule.php 1571 2013-10-08 07:02:15Z yu****chun $
*/
选中目录或文件点右键,TortoiseSVN-> properties->New...->Keywords,先中:Author,Date,ID,Revision,URL.选后就算是打上标就可以了。每次递交就会自动更新,TortoiseSVN-> properties->New...->Advanced里可自己写。

常用.h .cpp文件头
/**
  @(#)$Id$
  @brief     Multi-threaded programming critical section (lock)
  @Author $Author$
  @Date $Date$
  @Revision $Revision$
  @URL $URL$
  @Header $Header$
*/
附加:
  $Id$
  $Author$
  $lastChangedBy$
  $lastChangedDate$
  $Date$$Revision$
  $URL$
  $Header$

一般搞这种的都是从cvs时代过来时就搞这个keyword,现转向svn了svn也和cvs一样支持keyword,而且用法也一样。


SVN使用详解之如何设置svn:keywords :
Subversion 中可以使用的 Keyword 包括下面这些。
Id
这是一种综合的格式,例如“$Id: V2EXCore.php 4 2005-10-29 23:08:09Z livid $”。
LastChangedDate
最后被修改的时间,这个属性也可以缩写为 Date。
LastChangedBy
最后修改该源代码文件的用户名,这个属性也可以被缩写为 Author。
LastChangedRevision
最后修订的版本号,这个属性也可以被缩写为 Revision 或者 Rev。
HeadURL
该源代码文件所位于的 Repository 上的绝对 URL 地址,这个属性也可以被缩写为 URL。
使用命令行设置:
先CD到你的工作目录(对于工作目录在二楼有解释,简而言之就是你用于暂时存放Subversion中为本库的一个Copy的目录,
如果你安装了TortoiseSVN工作目录上是带个小图标的,更新了文件没有更新是一个叹号,更新后有一个绿色的勾)
E:\MakeWeb\www.zxlm.cn\blogdevelopment\admin>svn propset svn:keywords "LastChangedDate Author" *.php
属性“svn:keywords”设定于“admincp.php”
属性“svn:keywords”设定于“adminfunctions.php”
属性“svn:keywords”设定于“article.php”
属性“svn:keywords”设定于“attachment.php”
属性“svn:keywords”设定于“cache.php”
属性“svn:keywords”设定于“category.php”
如果提示  svn: “.”不是工作拷贝
说明你不在工作目录下执行些命令.
CD到工作目录即可.
对于每个项目的工作目录都需要单独设置.
如果提示  svn: 本客户端已过时,无法存取工作拷贝
那么你就得检查一下你的SVN的客户端和SVN服务器的版本是不是一致了,看这里了解详细.
最好两者都使用最新的版本.
使用TortoiseSVN设置svn:keywords
在你的工作目录中需要设置的文件上右键:选择属性.
然后出来一个这样的对应框:
在属性中选中 svn:keywords.
在取值中键入需要设置的关键字,所有关键字只能一次全部输入.
再确定.
这样你就设置好了 svn:keywords 了.

引用:
Subversion 的 svn:keywords 是一个非常有用的功能,可以让你将发生在源代码中的一些属性的变化自动地更新到源代码中。
比如你可以在客齐集社区的每一个页面的底部都看到的这样的一行字。
$Id: V2EXCore.php 4 2005-10-29 23:08:09Z livid $这行字的意思是表示,V2EXCore.php 这个源代码文件最后被用户 livid 更新于 2005-10-29 23:08:09Z,修订版本号为 4。要实现这样的自动更新,你只要对需要这样的属性的文件上使用下面这行指令。
svn propset svn:keywords "Id" V2EXCore.php然后在源代码文件中需要 Subversion 进行自动更新的地方插入 $Id$ 这样的 Keyword,那么在你下次进行 svn commit 之后,该 $Id$ 就会被 Subversion 自动替换为 $Id: V2EXCore.php 4 2005-10-29 23:08:09Z livid $ 这样的格式。
Subversion 只会对你明确设置了 Keyword 进行更新,比如如果你对某个源代码文件执行了下面这条指令。
svn propset svn:keywords "Id Date" V2EXCore.php则在 V2EXCore.php 中所有的 $Id$ 和 $Date$ 都会被替换,而 $Author$ 之类的没有被设置的属性则不会发生替换。  

来自:http://blog.cntv.cn/11430895-3106020.html
更多参考:
http://blog.ihipop.info/2011/08/2698.html
http://jdkcn.com/entry/how-to-add-auto-props-in-subversion.html
http://blog.ihipop.info/2011/08/2698.html
http://ad-hoc.blog.sohu.com/107465483.html
直接修改配置文件的方法,时间相差8小时:
http://hi.baidu.com/cyrist/item/97a5e6f12b44b3c4a835a2dc
SVN嵌入属性(获得最后一次提交的人,时间...):
http://blog.csdn.net/lsd123/article/details/3345388
fwrite 和file_put_contents谁更快? LOCK_EX阅读全文
背景:写一个简单的聊天系统,发出Htpp的Url实现跳转加上a标签。
实现代码:


来自:http://www.zhangxinxu.com/wordpress/?p=749

摘录:
URL地址自动添加的实现
URL地址自动添加的实现其实就是那么点内容:检测与替换。
检测
“检测”就是检测文字(字符串)内部是否有符合http地址的内容,显然,这需要用到正则表达式进行验证,这个工作前端和后台都可以做,这里,只讲前端的方法,使用JavaScript实现。
验证HTTP地址的正则表达式如下(可能有疏漏或是不准确之处,欢迎指正):
var reg = /(http:\/\/|https:\/\/)((\w|=|\?|\.|\/|&|-)+)/g;
前一部分匹配http或是https开头的URL字符串地址,后面一部分匹配一些字符,英文字符、下划线(_)、点号(.)、问号(?)以及等号(=),连接短线(-)等。
替换
说到JavaScript中的替换功能,首先想到的自然是replace属性了,replace属性强大之处在于其支持正则表达式,可以对符合正则的字符串进行替换。例如,我们要替换掉字符串两端的空格就可以使用类似下面的语句:
var s = " blank ";
s = s.replace(/^\s+(.*?)\s+$/, "");
alert(s);
怎么禁止浏览器自动保存密码?
背景:有时不是记住密码就方便,有时是记录了反而不好,不安全呵。
1)首先大部分浏览器都是根据表单域的type="password"来判断密码域的,所以针对这种情况可以采取“动态设置密码域”的方法:
<input type="text" name="password" onfocus="this.type='password'" />
IE下不支持修改input 的type属性,会报错!

可以用两个input 一个是text 另一个是password之间的显示与隐藏来实现 这个功能
解释:当这个文档框获取焦点时才将其变成密码域,这样浏览器就不会记住密码,当然为了更加完善,还可以把autocomplete="off"属性也加上。
2)autocomplete="off"
3)在onload事件,把密码框的值清空,即:
<script language="javascript">
<script language="javascript">
window.load = function(){
    document.getElementById('login_pwd').value='';
};
</script>
[/codes]
4)页面采用https协议,因为https是不会对表单进行保存信息的。
5)针对有些浏览器插件的自动填表功能
这个就比较麻烦了,我想这种情况应该是插件记住表单域name的值,然后再进行填表,这种情况,我觉得可以在页面加载时动态更改name的值,当提交表单的时候再把表单的值组合成正确的对应值再提交。这个没有经过验证,只是我个人的想法。你可以试试
如果以上这些方法还满足不了你,那我也没办法了。

建议:
试一下把对应域名下的cookie清掉,浏览器应该是根据cookie来记住用户名密码的。
(不是的,有的浏览器是在你提交表单后,根据你提交的值来记住的)
(对的 有些浏览器不记录在COOKIE 这个比较头疼 顺便问下INPUT里输入过的值如何清除?我希望能像银行的那样 输入过的值不再出现)
浏览器记住密码的实现方式就是通过寻找type为password的input输入框,然后前边一个输入框就作为用户名记住。所以解决这个问题的办法就是在用户名input和密码input之间增加一个type为text的输入框设置css属性display为none。
来自:http://www.jb51.net/article/35878.htm

采用办法:
(1)
密码:<input type=\"text\" name=\"login_pwd\" id=\"login_pwd\" class=\"mytxt\"  size=\"12\" onfocus=\"this.type='password'\" autocomplete=\"off\"/>
(2)
linux下shell终端curl的post数据
curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -e "http://post.html"  -d "2880[]=105&pid=2880&p=最佳&count=1&receipt=1&poll=投票" http://post.php
注释:
-A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)"
的意思就是申明客户端是windows2000下的ie6的浏览器;
-e "http://post.html"的意思就是refer是这个页面;
-d后面的参数都是将用post方式提交到服务器去的
最后面的就是将要post到的url地址
这里提到了-A、-e和-d参数,
其实用的比较多的还有
-x(后面用ip:port方式接代理服务器)等等,
这里就不一一列举了,可以参考man curl

demo
curl $URL -d "2880[]=105&pid=2880&p=最佳&count=1&receipt=1&poll=投票"

结果
Array
(
    [2880] => Array
        (
            [0] => 105
        )

    [pid] => 2880
    [p] => 最佳
    [count] => 1
    [receipt] => 1
    [poll] => 投票
)

4.模拟指定浏览器

有些变态的站点,限制了使用浏览器的类型.一样难不倒curl.

curl -A “Mozilla/4.0 (compatible; MSIE 5.01; Windows NT 5.0)” [URL]
这个就是一个模拟,win2k的ie5.0的一个访问.

阅读全文
本文纯粹是贴出一些比较实用的代码出来供大家学习和使用,也算是个人博客对这些实用代码的记录和收集吧!有用到的可以参考,没用到的直接可以飘过!

特意将这些代码写成jQuery插件的格式,这样方便大家使用的时候调用。我在平时的开发和自我学习过程中也积累了不少有用的代码,不知道怎么概括性地发布出来,所以就已文章的形式陆续贴出来与大家分享。

以单篇文章发布的插件代码都是一些简单的代码,若是一些复杂的代码或插件我会归纳到插件专区里去,这样大家下载起来也方便!

一、插件代码


注意其中调用方法中的timerArr变量,若你在前面调用代码显示了效果,在页面的后面代码中需要清楚该闪烁效果的话,需要注意timerArr变量的作用域。若只是出现效果而无需清楚,则可以直接调用$.hiro.blinkNews.show()
二、调用方法

来自:http://www.ihiro.org/javascript-news-flash-header-tips
这个破问题调了一下午,火狐没问题,在网上搜了下发现是ie 下innerHTML的优先级不够,不能给td、tr、p之类的加innerHTML要改成span、div之类的。按正常问题应该就解决了,但是我这个页面用几个页面拼到一起,还是不好用。之后把form去掉又好用了,以为是form的问题。
但最好调来调去还是页面的问题,引的其它页面里面代码不完整。比如<td>有开始没有结束之类的,或者其它页面引的js有问题。
最后把其它页面的代码修改了下就好用了。。。。。

总结如下
要实现的功能需要在ajax输出的页面结构中再次使用ajax输出新的内容,如果把所有ajax输出区域放在静态页面,可以实现;但是,改成在动态页面区域中再重新定义动态区域输出时,IE就报出“未知的运行时错误”,查找相关资料,做的尝试如下:

1.检查尝试加到innerHTML的html代码是否包含破损的html标签,没有发现此类错误;
2.把容器改成那些比较“包容”的标签,已将容器改成div和span;
3.将容器标签放在form外面,已做修改;

来自:http://blog.sina.com.cn/s/blog_4586764e0100ktb7.html


curl如果需要进行毫秒超时,需要增加:
curl_easy_setopt(curl, CURLOPT_NOSIGNAL, 1L);  
或者是:
curl_setopt ( $ch,  CURLOPT_NOSIGNAL, true); 是可以支持毫秒级别超时设置的
[codes=php]
<?php  
if (!isset($_GET['foo'])) {  
        // Client  
        $ch = curl_init('http://example.com/');  
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);  
        curl_setopt($ch, CURLOPT_NOSIGNAL, 1);    //注意,毫秒超时一定要设置这个  
        curl_setopt($ch, CURLOPT_TIMEOUT_MS, 200);  //超时毫秒,cURL 7.16.2中被加入。从PHP 5.2.3起可使用  
        $data = curl_exec($ch);  
        $curl_errno = curl_errno($ch);  
        $curl_error = curl_error($ch);  
        curl_close($ch);  
        if ($curl_errno > 0) {  
                echo "cURL Error ($curl_errno): $curl_error\n";  
        } else {  
                echo "Data received: $data\n";  
        }  
} else {  
        // Server  
        sleep(10);  
        echo "Done.";  
}  
?>  
[/code]

来自:http://developer.51cto.com/art/201208/351996_2.htm

curl的超时时间 :
今天在一台服务器上突然看到一个curl进程已经运行了28天还木结束, 有点奇怪! 我在使用curl的时候也设置了超时时间, --connect-timeout 5
curl --connect-timeout 5 --data-binary "set=${L_UPLOAD_DATA_ENCODED}" http://172.88.99.00:8080/xxx.php &>/dev/null
按理来说, 应该是5s就会超时退出了!  纳闷之余想起wget好像对超时时间, 是有分阶段的, 比如说请求的超时, 传输的超时等等, 所以就仔细查看了下curl的手册页:
原来使用curl时,有两个超时时间:一个是连接超时时间,另一个是整个过程允许的最大时间,
--connect-timeout <seconds>
    Maximum time in seconds that you allow the connection to the server to take.  This only limits the connection phase, once curl has connected this option is of no more use. See also the -m/--max-time option.
    If this option is used several times, the last one will be used.
这个是指定连接超时时间。 如果出错, 提示形如:curl: (28) connect() timed out!

-m/--max-time <seconds>
    Maximum  time  in seconds that you allow the whole operation to take.  This is useful for preventing your batch jobs from hanging for hours due to slow networks or links going down.  See also the --connect-timeout option.
    If this option is used several times, the last one will be used.
这个是指定最大的允许时间。 出错提示如:curl: (28) Operation timed out after 2000 milliseconds with 0 bytes received


还可以这样用: curl -o x.log "http://www.yyyy.com" --speed-time 5 --speed-limit 1
是说将url内容保存到x.log中, 如果传输速度小于1字节/秒的状态持续5秒,该连接就会终止.
来自:http://blog.chinaunix.net/uid-20788470-id-1841681.html
实践中遇到的问题:
在Js加密时出现,用Jquery进行$("#login_pwd")是不行的,包括用手写赋值也是不蚝的,还得(chatValidate是form的name名字):
document.chatValidate.login_pwd.value = encryptedLoginUserPwd;//加密后再传输  
通过console.log输出这个encryptedLoginUserPwd是一个对旬,但用:document.write是可以输出的,可能还是对这个加密函数不是太了解罢,还是对Js:


crypto-js提供了多种常用加密算法的JS库。这里不多解释。

这里主要讲 前端使用crypto-js AES加密后,php解密。

前端js

<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/aes.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/rollups/md5.js"></script>
<script src="http://crypto-js.googlecode.com/svn/tags/3.0.2/build/components/pad-zeropadding.js"></script>
<script>
    var key_hash = CryptoJS.MD5("Message");
    var key = CryptoJS.enc.Utf8.parse(key_hash);
    var iv  = CryptoJS.enc.Utf8.parse('1234567812345678');
    var encrypted = CryptoJS.AES.encrypt("Message", key, { iv: iv,mode:CryptoJS.mode.CBC,padding:CryptoJS.pad.ZeroPadding});
    document.write("encode:"+encrypted);
</script>
php代码

<?php
$text = "Message";
$key = md5($text);  //key的长度必须16,32位,这里直接MD5一个长度为32位的key
$iv='1234567812345678';
$crypttext = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $text, MCRYPT_MODE_CBC, $iv);
$decode = mcrypt_decrypt(MCRYPT_RIJNDAEL_128, $key, $crypttext, MCRYPT_MODE_CBC, $iv);
echo base64_encode($crypttext);
echo "<br/>";
echo $decode;
echo "<br/>";
?>

http://localhost/aes/aes.html
encode:yMjizJCGQh+jxX4BXEtlNw==
http://localhost/aes/aes.php
yMjizJCGQh+jxX4BXEtlNw==
Message
实践是OK的,来自:
http://www.madeby83.com/%E5%89%8D%E7%AB%AFcrypto-js-aes%E5%8A%A0%E5%AF%86-php%E5%90%8E%E7%AB%AF%E8%A7%A3%E5%AF%86.html


前端解密:


http://localhost/chat/JsJiamiJiemi.html
dd52feee2ecea4ca159399e2dfb1d0bb
31323334353637383132333435363738
31323334353637383132333435363738
undefined
3VL+7i7OpMoVk5ni37HQuw==
1234567890


PHP加密:
$chat_msg_Html =  nl2br($chat_msg);
  $outEncryOutText = "Message";
  $key = md5($outEncryOutText);  //key的长度必须16,32位,这里直接MD5一个长度为32位的key
  $iv='1234567812345678';
  $cryptEncryOutText = mcrypt_encrypt(MCRYPT_RIJNDAEL_128, $key, $outEncryOutText, MCRYPT_MODE_CBC, $iv);
  echo base64_encode($cryptEncryOutText);
如果内容是message则echo会输出 :
yMjizJCGQh+jxX4BXEtlNw==

背景:做了个聊天程序,发现后面的时间显示有问题。
写到文件第一行内:

问题:echo date('Y-m-d H:i:s'); 输出结果与本地时间相差8小时。一看就知道我们神州大地是在东八区,时区错了。
三种解决方法:
1.加入date_default_timezone_set('PRC');//手册上说这个是PHP5.1后才有的
2. 修改php.ini
   [Date]
; Defines the default timezone used by the date functions
date.timezone = PRC 注:PRC为中化人民共和国
相关参考如下:
#############################################################################
从 PHP 5.1.0 ,当对使用date()等函数时,如果timezone设置不正确,在每一次调用时间函数时,都会产生E_NOTICE 或者 E_WARNING 信息。而又在php5.1.0中,date.timezone这个选项,默认情况下是关闭的,无论用什么php命令都是格林威治标准时间,但是PHP5.3中好像如果没有设置也会强行抛出了这个错误的,解决此问题,只要本地化一下,就行了。
以下是三种方法(任选一种都行):
一、在页头使用date_default_timezone_set()设置 date_default_timezone_set('PRC'); //东八时区 echo date('Y-m-d H:i:s');

二、在页头使用 ini_set('date.timezone','Asia/Shanghai');

三、修改php.ini。打开php5.ini查找date.timezone 去掉前面的分号修改成为:date.timezone =PRC
重启http服务(如apache2或iis等)即可。  
XXX可以任意正确的值。对于我们国内来说:可以为以下值:Asia/Chongqing ,Asia/Shanghai ,Asia/Urumqi (依次为重庆,上海,乌鲁木齐)港台地区可用:Asia/Macao ,Asia/Hong_Kong ,Asia/Taipei (依次为澳门,香港,台北),还有新加坡:Asia/Singapore,当然PRC也行。
来自:http://wz102.blog.51cto.com/3588520/1243649
#############################################################################
bool date_default_timezone_set ( string timezone_identifier )
说明
date_default_timezone_set() 设定用于所有日期时间函数的默认时区。
注: 自 PHP 5.1.0 起(此版本日期时间函数被重写了),如果时区不合法则每个对日期时间函数的调用都会产生一条 E_NOTICE 级别的错误信息。
参数
timezone_identifier
时区标识符,例如 UTC 或 Europe/Lisbon
返回值
本函数永远返回 TRUE(即使 timezone_identifier 参数不合法)。

来自:http://www.css88.com/archives/4552

在写php程序中有时会出现这样的警告:
[07-Jan-2014 07:21:44 UTC] PHP Warning:  Unknown: It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'Asia/Chongqing' for 'CST/8.0/no DST' instead in Unknown on line 0

PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function. In case you used any of those methods and you are still getting this warning, you most likely misspelled the timezone identifier. We selected 'UTC' for '8.0/no DST' instead in D:\PHPWEB ews\file.php on line 17 。


这是因为PHP所取的时间是格林威治标准时间,所以和你当地的时间会有出入格林威治标准时间和北京时间大概差8个小时左右,我们可以按照下面的方法解决:

1、在页头使用date_default_timezone_set()设置我的默认时区为北京时间,即 <?php date_default_timezone_set("PRC"); ?>就可以了。

2、在php.ini中设置date.timezone的值为PRC,设置好以后的为:date.timezone=PRC或者date.timezone = Asia/Shanghai,同时取消这一行代码的注释,即去掉前面的分号就可以了。

然后重启apache即可!
参考:http://www.jb51.net/article/42315.htm
PHP5中的时间相差8小时的解决办法:
http://www.jb51.net/article/13988.htm

————背景:遇到线上仿真机的PHP错误日志的时间不对————
PHP错误日志的时间与系统时间不一致,怎么解决?来自:http://zhidao.baidu.com/link?url=Dx0OfG9Kd5xkb_plZeopiskR_jUnCqB2WLdBXshvpv5hJTAi-UHUoSC4qRHK7mFCP84118D3mRhWlcBdwNX2dbl7MnocNPPDQeycWxnUkgW
我已经把php.ini的date.timezone设置为PRC了,调用date("H:i:s")函数也能输出与系统时间相一致的时间,但就是不知道为什么错误日志里的时间总是跟系统时间相差8个小时
提问者采纳

你修正只是php这样级别的时区,所以网页显示出来的时间跟你浏览器所在电脑时间是一致的(修正好了)。
但错误日志的运行一般是apache或者php-cgi,它们是直接调用操作系统的时间和时区的,所以写出来的日志时间有时差。依照你的描述,估计你用的是linux,试一下修正一下linux的时区一下就可以了。命令如下:
rm -f /etc/localtime
ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

实践如下:
[root@localhost etc]# cp localtime localtime.bak.2013.12.25
[root@localhost etc]# ls /usr/share/zoneinfo/Asia/Shanghai
/usr/share/zoneinfo/Asia/Shanghai
[root@localhost etc]# rm -Rf localtime
[root@localhost etc]# ln -s /usr/share/zoneinfo/Asia/Shanghai /etc/localtime
然后最好使用下面的命令将更改写入bios。
hwclock
[root@localhost tmp]# hwclock
Wed 25 Dec 2013 11:07:18 AM CST  -0.848372 seconds  【后面发现还是不行,估计机器有问题。】
必须要生效才行,上面生效来自:
http://soft.chinabyte.com/133/11146633.shtml



摘录自:http://ggmmchou.blog.163.com/blog/static/5933314920091137114514/
方法(1)  
# tzselect  
方法(2 仅限于RedHat Linux 和 CentOS)  
# timeconfig  
方法(1)
  # tzselect
  方法(2 仅限于RedHat Linux 和 CentOS)
  # timeconfig3. 复制相应的时区文件,替换系统默认时区
  CentOS实践:
[root@localhost tmp]# tzselect  
Please identify a location so that time zone rules can be set correctly.
Please select a continent or ocean.
1) Africa
2) Americas
3) Antarctica
4) Arctic Ocean
5) Asia
6) Atlantic Ocean
7) Australia
8) Europe
9) Indian Ocean
10) Pacific Ocean
11) none - I want to specify the time zone using the Posix TZ format.
#? 5
Please select a country.
1) Afghanistan           18) Israel                35) Palestine
2) Armenia               19) Japan                 36) Philippines
3) Azerbaijan            20) Jordan                37) Qatar
4) Bahrain               21) Kazakhstan            38) Russia
5) Bangladesh            22) Korea (North)         39) Saudi Arabia
6) Bhutan                23) Korea (South)         40) Singapore
7) Brunei                24) Kuwait                41) Sri Lanka
8) Cambodia              25) Kyrgyzstan            42) Syria
9) China                 26) Laos                  43) Taiwan
10) Cyprus                27) Lebanon               44) Tajikistan
11) East Timor            28) Macau                 45) Thailand
12) Georgia               29) Malaysia              46) Turkmenistan
13) Hong Kong             30) Mongolia              47) United Arab Emirates
14) India                 31) Myanmar (Burma)       48) Uzbekistan
15) Indonesia             32) Nepal                 49) Vietnam
16) Iran                  33) Oman                  50) Yemen
17) Iraq                  34) Pakistan
#? 9
Please select one of the following time zone regions.
1) east China - Beijing, Guangdong, Shanghai, etc.
2) Heilongjiang (except Mohe), Jilin
3) central China - Sichuan, Yunnan, Guangxi, Shaanxi, Guizhou, etc.
4) most of Tibet & Xinjiang
5) west Tibet & Xinjiang
#? 1
The following information has been given:
        China
        east China - Beijing, Guangdong, Shanghai, etc.
Therefore TZ='Asia/Shanghai' will be used.
Local time is now:      Wed Dec 25 11:49:52 CST 2013.
Universal Time is now:  Wed Dec 25 03:49:52 UTC 2013.
Is the above information OK?
1) Yes
2) No
#? 1    
You can make this change permanent for yourself by appending the line
        TZ='Asia/Shanghai'; export TZ
to the file '.profile' in your home directory; then log out and log in again.
Here is that TZ value again, this time on standard output so that you
can use the /usr/bin/tzselect command in shell scripts:
Asia/Shanghai

# cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime  
对于中国服务器则执行:  
# cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime  
# cp /usr/share/zoneinfo/$主时区/$次时区 /etc/localtime
  对于中国服务器则执行:
  # cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime 4. 将当前时间写入BIOS永久生效(避免重启后失效)  
# hwclock  
# hwclock

[root@localhost tmp]# date -R
Wed, 25 Dec 2013 11:56:13 +0800
来自:http://www.cnblogs.com/ningvsban/archive/2012/12/18/2823036.html




1)查看Linux硬件时间
[root@localhost tmp]# hwclock --show
Wed 25 Dec 2013 01:02:15 PM CST  -0.494817 seconds
[root@localhost tmp]# date
Wed Dec 25 13:40:48 CST 2013
2)修改Linux硬件时间
hwclock --set --date
3)让系统时间与硬件时钟同步,用:
hwclock --hctosys
4)相反地,让硬件时钟与系统时间同步:
hwclock --systohc
对上面1)进行同步操作(让硬件时钟与系统时间同步)的实践OK:
[root@localhost tmp]# hwclock --systohc
[root@localhost tmp]# hwclock --show
Wed 25 Dec 2013 01:44:36 PM CST  -0.973671 seconds
[root@localhost tmp]# date
Wed Dec 25 13:44:40 CST 2013
没同步上,直接修改硬件时间:
[root@localhost tmp]# hwclock --set --date "2013-12-25 13:48:51"  
[root@localhost tmp]# hwclock --show
Wed 25 Dec 2013 01:48:56 PM CST  -0.365535 seconds
[root@localhost tmp]# date
Wed Dec 25 13:48:39 CST 2013
来自:http://blog.163.com/dk_linux/blog/static/20322616620122401426999/
早上遇到一个php-fpm的问题:
以前设置了host,后去掉这个host后到公网后发现这个fastcgi还是用的以前那个host,出现找不到host了(用shell下的curl是Ok的),后查来查去,重启了下php才好了,是怎么回事?
群里:
必须这样,我遇到很多次了,都记住了,估计估计是有dns缓存是有dns缓存。
Allowed memory size of 134217728 bytes exhausted

/usr/local/php/bin/php  -i|grep mem
memory_limit => 128M => 128M(换成小b也就是:134217728 bytes )

运行一段时间后就出现:
ErrorException [ 1 ]: Allowed memory size of 134217728 bytes exhausted (tried to allocate 8192 bytes) ~ SYS_PATH/httpsqs.php [ 106 ]

如何测定脚本占用的内存? 有时候我们想知道程序执行到某个特定阶段时到底占用了多大内存,为此PHP提供了函数memory_get_usage()。这个函数只有当PHP编译时使用了--enable-memory-limit参数时才有效。  Xdebug同样提供了一个函数xdebug_memory_usage()来实现这样的功能,另外xdebug还提供了一个xdebug_peak_memory_usage()函数来查看内存占用的峰值。 如何检测代码中的不足? 有时候代码没有明显的编写错误,没有显示任何错误信息(如error、warning、notice等),但是这不表明代码就是正确无误的。有时候可能某段代码执行时间过长,占用内存过多以致于影响整个系统的效率,我们没有办法直接看出来是哪部份代码出了问题。这时候我们希望把代码的每个阶段的运行情况都监控起来,写到日志文件中去,运行一段时间后再进行分析,找到问题所在。 回忆一下,之前我们编辑php.ini文件 加入 [Xdebug] xdebug.profiler_enable=on xdebug.trace_output_dir="I:\Projects\xdebug" xdebug.profiler_output_dir="I:\Projects\xdebug" 这几行,目的就在于把执行情况的分析文件写入到”I:\Projects\xdebug”目录中去(你可以替换成任何你想设定的目录)。如果你执行某段程序后,再打开相应的目录,可以发现生成了一堆文件,例如cachegrind.out.1169585776这种格式命名的文件。这些就是Xdebug生成的分析文件。用编辑器打开你可以看到很多程序运行的相关细节信息,不过很显然这样看太累了,我们需要用图形化的软件来查看。 在Windows平台下,可以用WinCacheGrind(*我修改的*下载地址http://sourceforge.net/projects/wincachegrind/)这个软件来打开这些文件。可以直观漂亮地显示其中内容:
非常漂亮,我们很直观地看到index.php中我们调用了一个函数testXdebug(),testXdebug()中又调用了requireFile()函数。这样我们就可以非常方便地查看整个脚本的程序结构。 另外,我们还可以看到每个函数被调用的次数及执行所花费的时间!这对于测试程序性能非常有用。

摘录自:http://hi.baidu.com/icejmx/item/2af1a6a6f7a6ff248819d314
该引用来源:
http://blog.csdn.net/Haohappy2004/article/details/893060


后记:
内存泄漏不是光是用php做daemon,有时fastcgi本身也出现泄漏的情况,但:
PHP是用GC的,很难跟踪
一般都是用Worker进程管理的方式......

所以,php要想做这一块和c来说还是有差距的,至少在工具上要跟得上才行。
近来发现有像c内存检测的valgrind工具的扩展,可以试下有空:
github上找到: php-valgrind. 这个工具主要是为PHP脚本提供了可以在脚本中开启Valgrind(严格说是Callgrind)的Profile能力
DownLoad:
https://github.com/laruence/php-valgrind

使用参考:http://www.laruence.com/2013/08/14/2899.html


http://lutaf.com/136.htm
内存泄露排查非常困难
因为代码规模非常大,想靠做code review的方式来查基本上不可能
php并非运行在虚拟机上,没有什么官方的monitor(类似java hprof,JVM Monitor等)
在互联网上搜索,找不到任何答案


解决php内存泄露问题:
http://itindex.net/detail/43004-php-%E5%86%85%E5%AD%98-%E9%97%AE%E9%A2%98


后补,对php编写时注意,有可能较大限度的减少内存溢出,如下:
============================Allowed memory size of  xxx bytes

PHP内存溢出Allowed memory size of 解决办法 :

以前追踪过这个问题,但是那个时候工具用的不太好,没看的这么细,这次搞的比较细,修正了偶以前的看法

.于是写小文一篇总结一下.

PHP偶尔会爆一下如下 错误Allowed memory size of  xxx bytes exhausted at xxx:xxx (tried to

allocate xxx bytes)

不想看原理的,直接跳到最后看总结.

这个报错信息的意思是是说,若ini配置的memory_limit(内存限制) 大于 AG(allocated_memory),就报错





AG(allocated_memory) += rs;

if (AG(memory_limit)<AG(allocated_memory)) {

    int php_mem_limit = AG(memory_limit);
    AG(allocated_memory) -= rs;

   if (EG(in_execution) &#038;& AG(memory_limit)+1048576 > AG(allocated_memory)){

        AG(memory_limit) = AG(allocated_memory) + 1048576;

        if (file) {
            zend_error(E_ERROR,"Allowed memory size of %d bytes exhausted
at %s:%d (tried to allocate %d bytes)", php_mem_limit, file, lineno, s);
        } else {
            zend_error(E_ERROR,"Allowed memory size of %d bytes exhausted
(tried to allocate %d bytes)", php_mem_limit, s);
        }

    } else {

        if (file) {
           fprintf(stderr, "Allowed memory size of %d bytes exhausted
at %s:%d (tried to allocate %d bytes)n", php_mem_limit, file, lineno, s);
        } else {
            fprintf(stderr, "Allowed memory size of %d bytes exhausted
(tried to allocate %d bytes)n", php_mem_limit, s);
        }

        exit(1);
    }
}


memory_limit很简单,就是PHP可用的内存..AG(allocated_memory)是什么呢?是不是已经使用的内存,恩,

我们用代码验证一下

PHP_FUNCTION(memory_get_usage) {
        RETURN_LONG(AG(allocated_memory));
}
这下就清晰明了,还不懂的,查php手册,看memory_get_usage的说明

到底什么时候设置AG(allocated_memory)呢,具体代码就不贴了,太繁琐,是在emalloc函数中调用了第一段

代码,看第一行代码,那里的rs就是每次tried to allocate %d bytes对应的s变量(你要申请的实际空间)

的align对齐,具体计算方法:rs = (s+7) & ~0x7,也就是必须是8的倍数,不足则补足,这样做的好处是符合

64位机器的要求,可以加速运算,例如 s =1,那么运算出来的rs =8 ,具体的,可以自己用PHP写个函数计算

(0×7是16进制写法).

总结:既然知道了怎么回事,就好解决了,在开启 –enable-memory-limit情况下,会出这个错误,把配置文

件直接设置memory_limit,或者在代码中设置ini_set(‘memory_limit’, ‘value’)都可以,省事的办法

就是设置配置文件(如php.ini)

而且建议开启–enable-memory-limit,若这个不开启,PHP的内存限制就处于”裸跑”状态,可能会出现著

名的out of memory错误.


使用脚本语言最大的好处之一就是可利用其拥有的自动垃圾回收机制(释放内存)。你不需要在使用完变

量后做任何释放内存的处理,PHP会帮你完成。

当然,我们可以按自己的意愿调用 unset() 函数来释放内存,但通常不需要这么做。



不过在PHP里,至少有一种情况内存不会得到自动释放,即便是手动调用 unset()。详情可考:

http://bugs.php.net/bug.php?id=33595。

问题症状
如果两个对象之间存在着相互引用的关系,如“父对象-子对象”,对父对象调用 unset() 不会释放在子

对象中引用父对象的内存(即便父对象被垃圾回收,也不行)。

有些糊涂了?我们来看下面的这段代码:

<?php
class Foo {
function __construct()
{
$this->bar = new Bar($this);
}
}

class Bar {
function __construct($foo = null)
{
$this->foo = $foo;
}
}

while (true) {
$foo = new Foo();
unset($foo);
echo number_format(memory_get_usage()) . "\n";
}
?>
运行这段代码,你会看到内存使用率越来越高越来越高,直到用光光。

...
33,551,616
33,551,976
33,552,336
33,552,696
PHP Fatal error: Allowed memory size of 33554432 bytes exhausted
(tried to allocate 16 bytes) in memleak.php on line 17
对大部分PHP程序员来讲这种情况不算是什么问题。

可如果你在一个长期运行的代码中使用到了一大堆相互引用的对象,尤其是在对象相对较大的情况下,内

存会迅速地消耗殆尽。



Userland解决方案
虽然有些乏味、不优雅,但之前提到的 bugs.php.net 链接中提供了一个解决方案。

这个方案在释放对象前使用一个 destructor 方法以达到目的。Destructor 方法可将所有内部的父对象

引用全部清除,也就是说可以将这部分本来会溢出的内存释放掉。

以下是“修复后”的代码:

<?php
class Foo {
function __construct()
{
$this->bar = new Bar($this);
}
function __destruct()
{
unset($this->bar);
}
}

class Bar {
function __construct($foo = null)
{
$this->foo = $foo;
}
}

while (true) {
$foo = new Foo();
$foo->__destruct();
unset($foo);
echo number_format(memory_get_usage()) . "\n";
}
?>
注意那个新增的 Foo::__destruct()方法,以及在释放对象前对 $foo->__destruct() 的调用。现在这

段代码解决了内存使用率一直增加的问题,这么一来,代码就可以很好的工作了。

PHP内核解决方案?
为什么会有内存溢出的发生?我对PHP内核方面的研究并不精通,但可以确定的是此问题与引用计数有关

系。

在 $bar 中引用 $foo 的引用计数不会因为父对象 $foo 被释放而递减,这时PHP认为你仍需要 $foo 对

象,也就不会释放这部分的内存……大概是这样。

这里确实可以看出我的无知,但大体意思是:一个引用计数没有递减,所以一些内存永远得不到释放。



在前面提到的 bugs.php.net 链接中我看到修改垃圾回收的过程将会牺牲极大的性能,因为我对引用计数

了解不多,所以我认为这是真的。



与其改变垃圾回收的过程,为什么不用 unset() 对内部对象做释放的工作呢?(或者在释放对象的时候

调用 __destruct()?)

也许PHP内核开发者可以在此或其他地方,对这种垃圾回收处理机制做出修改。



更新:Martin Fjordvald 在评论中提到了一个由 David Wang 为垃圾回收所写的补丁(其实它看起来更

像“一整块布”——非常巨大。详情参见此邮件结尾的CVS导出信息。)确实存在(一封邮件),并受到

了PHP内核开发成员的关注。问题是这个补丁要不要放到PHP5.3中并未得到太多支持。我觉得一个不错的

折中方案就是在 unset() 函数中调用对象中的 __destruct() 方法;









========================内存溢出解决方案



在做数据统计分析时,经常会遇到大数组,可能会发生内存溢出,这里分享一下我的解决方案。还是用例子来说明这个问题,如下:

假定日志中存放的记录数为500000条,那么解决方案如下:



ini_set(‘memory_limit’,’64M’); //重置php可以使用的内存大小为64M,一般在远程主机上是不能修改php.ini文件的,只能通过程序设置。注:在safe_mode(安全模式)下,ini_set失效

set_time_limit(600);//设置超时限制为6分钟



$farr = $Uarr = $Marr = $IParr = $data = $_sub  = array();

$spt = ”$@#!$”;

$root = ”/Data/webapps/VisitLog”;

$path = $dpath = $fpath = NULL;

$path = $root.”/”.date(“Y-m”,$timestamp);

$dpath = $path.”/”.date(“m-d”,$timestamp);

for($j=0;$j<24;$j++){

$v = ($j < 10) ? ”0″.$j : $j;

$gpath = $dpath.”/”.$v.”.php”;

if(!file_exists($gpath)){

continue;

} else {

$arr = file($gpath);////将文件读入数组中

array_shift($arr);//移出第一个单元-》<?php exit;?>

$farr = array_merge($farr,$arr);

unset($arr);

}

}

if(empty($this->farr)){

echo ”<p><center>没有相关记录!</center></p>”;

exit;

}

while(!empty($farr)){

$_sub = array_splice($farr, 0, 10000); //每次取出$farr中1000个

for($i=0,$scount=count($_sub);$i<$scount;$i++){

$arr = explode($spt,$_sub[$i]);

$Uarr[] = $arr[1]; //vurl

$Marr[] = $arr[2]; //vmark

$IParr[] = $arr[3].” |$nbsp;”.$arr[1]; //IP

}

unset($_sub);//用完及时销毁

}

unset($farr);



这里,不难看出,一方面,我们要增加PHP可用内存大小,另一方面,只要我们想办法对数组进行分批处理,分而治之,将用过的变量及时销毁(unset),一般是不会出现溢出问题的。



另外,为了节省PHP程序内存损耗,我们应当尽可能减少静态变量的使用,在需要数据重用时,可以考虑使用引用(&)。再一点就是:数据库操作完成后,要马上关闭连接;一个对象使用完,要及时调用析构函数(__destruct())。









============================unset销毁变量并释放内存问题






PHP的unset()函数用来清除、销毁变量,不用的变量,我们可以用unset()将它销毁。但是某些时候,用unset()却无法达到销毁变 量占用的内存!我们先看一个例子:

<?php
$s=str_repeat('1',255); //产生由255个1组成的字符串
$m=memory_get_usage(); //获取当前占用内存
unset($s);
$mm=memory_get_usage(); //unset()后再查看当前占用内存
echo $m-$mm;
?>

最后输出unset()之前占用内存减去unset()之后占用内存,如果是正数,那么说明unset($s)已经将$s从内存中销毁(或者说,unset()之后内存占用减少了),可是我在PHP5和windows平台下,得到的结果是:0。这是否可以说明,unset($s)并没有起 到销毁变量$s所占用内存的作用呢?我们再作下面的例子:

<?php
$s=str_repeat('1',256); //产生由256个1组成的字符串
$m=memory_get_usage(); //获取当前占用内存
unset($s);
$mm=memory_get_usage(); //unset()后再查看当前占用内存
echo $m-$mm;
?>

这个例子,和上面的例子几乎相同,唯一的不同是,$s由256个1组成,即比第一个例子多了一个1,得到结果是:272。这是否可以说 明,unset($s)已经将$s所占用的内存销毁了?
通过上面两个例子,我们可以得出以下结论:
结论一、unset()函数只能在变量值占用内存空间超过256字节时才会释放内存空间。

那么是不是只要变量值超过256,使用unset就可以释放内存空间呢?我们再通过一个例子来测试一下:

<?php
$s=str_repeat('1',256); //这和第二个例子完全相同
$p=&$s;
$m=memory_get_usage();
unset($s); //销毁$s
$mm=memory_get_usage();
echo $p.'<br />';
echo $m-$mm;
?>

刷新页面,我们看到第一行有256个1,第二行是0,按理说我们已经销毁了$s,而$p只是引用$s的变量,应该是没有内容了,另 外,unset($s)前后内存占用没变化!现在我们再做以下的例子:

<?php
$s=str_repeat('1',256); //这和第二个例子完全相同
$p=&$s;
$m=memory_get_usage();
$s=null; //设置$s为null
$mm=memory_get_usage();
echo $p.'<br />';
echo $m-$mm;
?>

现在刷新页面,我们看到,输出$p已经是没有内容了,unset()前后内存占用量之差是272,即已经清除了变量占用的内存。本例中的$s=null也 可以换成unset(),如下:

<?php
$s=str_repeat('1',256); //这和第二个例子完全相同
$p=&$s;
$m=memory_get_usage();
unset($s); //销毁$s
unset($p);
$mm=memory_get_usage();
echo $p.'<br />';
echo $m-$mm;
?>

我们将$s和$p都使用unset()销毁,这时再看内存占用量之差也是272,说明这样也可以释放内存。那么,我们可以得到另外一条结论:
结论二、只有当指向该变量的所有变量(如引用变量)都被销毁后,才会释放内存。


来自:http://zhengdl126.iteye.com/blog/1112231
当我们在使用Wordpress写文章,然后上传一些图片,或者别的文件到媒体库的时候,左下角的“上传文件大小限制:2MB“就直接打击了那些胖子们。如何修改2MB的上传大小限制呢?
PS:有些主机商在后台已经严格限制了上传大小为2MB,Cpanel的用户可以在后台控制面板里的”PHP设置“里查看到,如下图:
9ac2243agw1dvjlffkdvtj 如何修改Wordpress 2MB的上传限制
不过你可以使用FTP来上传图片、音频到Wordpress的媒体库。不过有些主机上还是能修改上传大小的限制的。

方法一:可能不行:http://jackxiang.com/post/6572/

在functions.php中添加如下代码,这样上传限制就是64M:

@ini_set( 'upload_max_size' , '64M' );
@ini_set( 'post_max_size', '64M');
@ini_set( 'max_execution_time', '300' );

方法二:这个没试过,应该是不行的。

在你的主机空间的根目录新建一个php.ini文件,然后复制以下代码:

upload_max_filesize = 64M
post_max_size = 64M
max_execution_time = 300

方法三:这个可行,参考:http://jackxiang.com/post/6572/

使用.htaccess文件,在这个文件中添加如下代码:

php_value upload_max_filesize 64M
php_value post_max_size 64M
php_value max_execution_time 300
php_value max_input_time 300


来自:http://cache.baiducontent.com/c?m=9f65cb4a8c8507ed4fece763105392230e54f73c678b854b2c88c65f93130716017bb0fb76784b408484616305a85d19b7b0607d725e60e1d988df0b9cac925938fe2223076b914062c469a9dc3224d621e04d98a40e96cee74295b9a1a3c85523dd22726df1f69c2a7103be18e71541f4d69f5f615e07ccef2716fc4e7659882233a14689e06d3e&p=8b2a972986cc41af52adca1258408b&newp=882a9545dc9e1df310be9b7c5807c4231610db2151ddd5152288cf00&user=baidu&fm=sc&query=Wordpress+%D7%EE%B4%F3%C9%CF%B4%AB%CE%C4%BC%FE%B4%F3%D0%A1%3A2MB&qid=&p1=1
分页: 8/18 第一页 上页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 下页 最后页 [ 显示模式: 摘要 | 列表 ]