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
PHP ini_set() 无效的原因:
如题:我租的是虚拟主机,php.ini里的upload_max_filesize是默认的2M,要直接修改php.ini文件是不可能的。我如果想上传超过2M的怎么呢?ini_set("upload_max_filesize", "8M");我试了,好象没有用!!
ini_set("upload_max_filesize", "8M");肯定不能用啊,要是随便一个用户都能修改的话,那这个虚拟主机上的其他用户不倒霉了?!!
我改过php.ini中的upload_max_filesize 有效。(假的)
========================================================================================================
ini_set,post_max_size,upload_max_filesize,magic_quotes_gpc等用ini_set设置不了!

ini_set('max_execution_time','10′);
ini_set('memory_limit','1024M');

echo 'max_execution_time = ' . ini_get('max_execution_time') . "";
echo 'memory_limit = ' . ini_get('memory_limit') . "";
echo 'post_max_size = ' . ini_get('post_max_size') . "";
echo 'upload_max_filesize = ' . ini_get('upload_max_filesize') . "";

ini_set('max_execution_time','10′);
ini_set('memory_limit','1024M');
注意:
post_max_size,upload_max_filesize用下面的方法是修改不了的.
ini_set('post_max_size','1024M');
ini_set('upload_max_filesize','1024M');
正确做法是用.htaccess文件:
php_value upload_max_filesize "80M"
php_value post_max_size "80M"
php_value max_execution_time "2000"
php_value memory_limit "150M"

补充知识点:
其实在php文档里有说明upload_max_filesize的可修改范围是PHP_INI_PERDIR。
PHP_INI_PERDIR的意思是域内指令可以在php.ini、httpd.conf或.htaccess文件中修改。
PHP_INI_SYSTEM 域内指令可以在php.ini和httpd.conf文件中修改
所以upload_max_filesize用int_set是无法修改的。只有可修改范围是PHP_INI_ALL的才可以用int_set修改。
Nginx,上传:通过设置nginx的client_max_body_size解决nginx+php上传大文件的问题
http://hi.baidu.com/zhizheqianlv/item/d5989d506b1f6f15aaf6d702
client_max_body_size
这个可以限制

magic_quotes_gpc 用 get_magic_quotes_gpc() 获得,不能用 set_magic_quotes_gpc 修改,原因是没这个函数。而magic_quotes_runtime可以用set_magic_quotes_runtime()来设置
http://www.111cn.net/phper/php-function/34292.htm
阅读全文
背景:一些浏览器的其它协议,如自定义协议,会扫描进程的列表,及通过js读注册表(客户端会写注册表,以达到判断是否安装过客户端)等,是必须用到的。
JS操作本地注册表有很多限制,默认浏览器是没有打开JS本地脚本操作的,如果浏览器没有配置且安全级别比较高,或者杀毒和防木马软件,直接用JS操作注册表会被阻止的,为了保险期间实现这个功能“需要在登陆后先判断是否安装过客户端才能进行游戏”,最好的方式个人认为是,通过客户端实现一个浏览器的插件,然后在JS中判断插件是否已经安装,然后通过插件启动客户端或做其他的事情比较稳妥。

一般这样做,我估计百度影音通过网络浏览器到播放器(好在没有广告)就是这么干的,好使用HTA(HTML application),不然通过Web访问会出现安全提示。:
干脆在客户端游戏安装过程中,同时安装一个BHO,好处是JS可以直接调用activex判断是否安装了,而且可以通过activex直接启动客户端,并且可以把用户的登录状成直接带到客户端游戏去,省得重新输密码登录。

读取注册表的办法,比较简单
<script  language="JScript">  
     var  WshShell  =  new  ActiveXObject("WScript.Shell");  
      keyValue  =  WshShell.RegRead("HKEY_LOCAL_MACHINE\\SOFTWARE\\Microsoft\\Windows\\CurrentVersion\\Internet Settings\\Cache\\Paths\\Directory");  
     alert(keyValue);  
</script>  
原则上,只要注册表记录的信息都可以查到。
但系统进程是在内存中,而不是在注册表也不是在硬盘上,可以使用win32 API CreateToolhelp32Snapshot 扫描系统进程,js不借助ActiveX是做不到的。

用WSH可以做很多的事...
我实践了是可以hta来读取注册表和执行程序的,找开获得23.0,打开了cmd,如下:


如果用浏览器去执行这个会出现,如下问题,也就是说浏览器想要执行EXE可执行程序得要通过ActiveX控件去做,实践如下:
http://localhost/jsReg.html
ReferenceError: ActiveXObject is not defined
[在此错误处中断]   
var WSH = new ActiveXObject("WScript.Shell");
jsReg.html (第 22 行)
ReferenceError: ActiveXObject is not defined
[在此错误处中断]   
var obj = new ActiveXObject("WScript.Shell");


参考来自:
http://www.itlead.com.cn/article/html/148/2011-07-26/content-1027.shtml








var wsh=new ActiveXObject("WScript.Shell");
wsh.AppActive("title");//激活指定title的应用程序窗口
wsh.CreateShortcut();//建立快捷方式
wsh.Popup();//提示
wsh.RegDelete();//删除注册表项
wsh.RegRead();//读取注册表
wsh.RegWrite();//写注册表
wsh.Run("c:\\test.exe");//运行程序
wsh.SendKeys();//摸拟按键
//...........

等等一堆

你想要做系统进程扫描的话,可以使用WMI对象来...

呵呵,并不是像大花猫说的,JS还是可以做的...

http://www.microsoft.com/china/MSDN/library/enterprisedevelopment/softwaredev/WDdnclinicscripting.mspx

这是MS上的WMI的参考文档...
你想像一下msinfo32.exe可以做什么事,可以查看到什么系统信息,你用JS使用WMI也能做什么,但是前提是你的WMI服务要启动地哦,不过默认是启动地...


http://www.microsoft.com/china/technet/community/scriptcenter/resources/wmifaq.mspx
WMI的秘密

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/wmisdk/wmi/wmi_reference.asp
WMI参考文档。。。

你一定要去看看。。
里面的示便都是用VBS做的,你自己用JS当然也一样能行。。。

来源:http://bbs.csdn.net/topics/80029089

参考:http://www.dewen.org/q/663
http://blog.csdn.net/yu555666/article/details/1563547
背景:有外包兄弟说是编码上有问题,于是从编码上想判断一下到底是什么编码,用了这个函数去判断。我倒是喜欢直接用editplus去另存为就知道文件编码,不知这样是不是100%准呢?呵呵。
  使用 mb_detect_encoding() 函数来判断字符串是什么编码的。
当在php中使用mb_detect_encoding函数进行编码识别时,很多人都碰到过识别编码有误的问题,例如对与GB2312和UTF- 8,或者UTF-8和GBK(这里主要是对于cp936的判断),网上说是由于字符短是,mb_detect_encoding会出现误判。
例如,代码如下:
$encode = mb_detect_encoding($keytitle, array("ASCII",'UTF-8′,"GB2312′,"GBK",'BIG5′));
if ($encode == “UTF-8″){
$keytitle = iconv("UTF-8″,"GBK",$keytitle);
}

这段代码的作用是检测字符串的编码是否UTF-8,是的话就转换为GBK。
可是当 $keytitle = “%D0%BE%C6%AC”;时。检测结果却是UTF-8.这个bug其实不算是bug,写程序时也不应当过于依赖mb_detect_encoding,当字符串较短时,检测结果产生偏差的可能性很大。
怎么解决呢,我的办法是:
复制代码 代码如下:

$encode = mb_detect_encoding($keytitle, array('ASCII','GB2312′,'GBK','UTF-8');

三个参数分别是:被检测的输入变量、编码方式的检测顺序(一旦为真,后面自动忽略)、strict模式
对编码检测的顺序进行调整,将最大可能性放在前面,这样减少被错误转换的机会。
一般要先排gb2312,当有GBK和UTF-8时,需要将常用的排列到前面。

来自:http://www.jb51.net/article/27282.htm
*********************加密、解密**************

php中加密、解密
用rawurlencode()对字符串加密,代替原始的urlencode():为了保证特殊字符,空格,回车,等操作的正确性
同时用rawurldecode()进行解码,代替urldecode(),同样理由
javascript中加密、解密
用encodeURIComponent()代替encodeURI(),加密
用decodeURIComponent()代替decodeURI(),解密

都是为了防止加密过程中对特殊字符的处理会出错的问题


来自:http://www.songxuemei.com/decode-encode/
背景:看有兄弟用“#”做PHP的注释。

PHP支持以Shell脚本风格的单行注释,这种注释方式使用“#”的形式实现,它的用法与C++语言风格注释方式相似。使用Shell脚本风格进行单行注释的PHP代码是可行的。但是不是主流就不得而知了,呵呵。
阅读全文
      今天我在调程序时,遇到了见郁闷的事,我用ajax从前台显示页面传字符串变量给处理页面,出现了件怪事,我想传的内容是abc+,但接收以后用System.out.println()输出是abc空格。反复测试好几遍,都是这个结果,真是令人郁闷。在网上搜了搜,找到了原因。
原因:   url中有些字符被转义,比如空格被编码成加号,于是传的参数明明是加号,获取的值却成了空格。如何解决呢?如果是通过url传递参数,应该对其进行必要的编码。
解决办法:
在javascript中加入  

对字符串进行处理.如:var str=URLencode("abc+")


综上,即url里有如下四个特殊字符时:(1)加号:+    (2)双引号:"    (3)单引号:'    (4)斜杠:/时,既要进行特殊处理。


搞自:http://www.blogjava.net/juhongtao/archive/2009/07/31/168639.html
更多参考:http://blog.csdn.net/aragorn_177/article/details/2612974

背景:
对方部门给一接中,没说明是urlencode直接给一个get参数过来,于是对生成的+这样的,通过get后没了,变成了空格(特别是指浏览器里),
于是得这样:


输出:
---------- 调试PHP ----------
x3LCVymudOXKl40YwZledetlpbOmC0wS823N3tptZ54JeWS38pInvk3VkRBzTXyJvqSCd9JZHTgfnRsguGyjI4p5ejA8+KhXTZlA4rQ6rmpDczbbxGfsZj+J1tC+R9hH
x3LCVymudOXKl40YwZledetlpbOmC0wS823N3tptZ54JeWS38pInvk3VkRBzTXyJvqSCd9JZHTgfnRsguGyjI4p5ejA8%2BKhXTZlA4rQ6rmpDczbbxGfsZj%2BJ1tC%2BR9hH

输出完成 (耗时 0 秒) - 正常终止


最后,其实通过测试,Curl命令行里也会对+进行urldecode进行了转码后变成了空格后进入到PHP程序变量里,于是加号没了,这种情况要想加号还在,得先通过工具urlencode一把,再传入也就出来加号了Ok了,后再一次urlencode一把就变成了%2B的+了:
相当于想通过浏览器传入urlencode的%2B,则需要在浏览器里输入对对+进行编码为%2B的码,后浏览器解码一次,还原成+号后,再编码,也就是原来输入的编码了,串还是那个串,传入编码后的被解开,再被编码的一个过程。

常常在post进行发送时用的是:

在此时,这个函数相当于一个urlencode功能,它有一个默认的参数:
int $enc_type = PHP_QUERY_RFC1738
如果 enc_type 是 PHP_QUERY_RFC1738,则编码将会以 » RFC 1738 标准和 application/x-www-form-urlencoded 媒体类型进行编码,空格会被编码成加号(+)。
-----------------------------------------
同样,那个+会变成%2B,呵呵。
Ctrl+Shift+F更多技巧:http://www.cnblogs.com/giggle/p/5966991.html

有时想查找整个页面里的某个函数在哪个文件里,往往这些函数在输出时是压缩的js,且有多个,此时查找很不太方便定位文件。
为此,介绍两种办法:

1.通过firebug查找功能(较弱):
有了Firebug,查找页面上的HTML元素(尤其是 比较深层的)非常之简单!更重要的是,一旦你 找到你要的元素,Firebug...
一款快速查找页面元素的Firefox插件——FireFinder:http://www.kuqin.com/webpagedesign/20090613/56307.html
Firefox的Firebug扩展:FireScope:http://www.webjx.com/javascript/jsajax-10665_2.html
2.通过fiddler2进行查找。
当经过fiddler2访问完一个网页后,在fiddler2里ctrl+a选中所有访问的Url后,点右键,选:Decode Selected Sessions...(否则:会找不到的,因为变成的是乱码什么的。)
(代理firefox下的网络访问,后在fiddler2下进行ctrl+F查找字符中,于是可以查到这个函数、字符串在哪个文件里,很是方便).
3.Httpwatcher查找:
1)Filter->enabling Filtering->[勾选]contents is:下面什么也不选->content contains:输入查找的内容。就能查到所有请求中包含有关键字的js,html了,然后再选自己要找的某个js,再进行find查找即可。

4.chrome浏览器:F12 Ctrl+Shift+F(IOS:Cmd+Opt+F),还支持正则表达式。
摘自:http://toutiao.com/item/6205065039238889986/?iid=3127152027&app=news_article&tt_from=android_share&utm_medium=toutiao_android&utm_campaign=client_share
背景:近来看有兄弟用PHP shuffle() 函数,PHP array_keys() 函数做随机,
好像是混合用的,就查下手册了解下PHP array_keys() 函数和PHP shuffle() 函数。
-----------------------------------------------------------------------------------------------------------------------
一)array_keys定义和用法
array_keys() 函数返回包含数组中所有键名的一个新数组。
如果提供了第二个参数,则只返回键值为该值的键名。
如果 strict 参数指定为 true,则 PHP 会使用全等比较 (===) 来严格检查键值的数据类型。

输出:
---------- 调试PHP ----------
Array
(
    [0] => a
    [1] => b
    [2] => c
)
输出完成 (耗时 0 秒) - 正常终止。

二)shuffle定义和用法
shuffle() 函数把数组中的元素按随机顺序重新排列。
若成功,则返回 TRUE,否则返回 FALSE。
注释:本函数为数组中的单元赋予新的键名。这将删除原有的键名而不仅是重新排序。
注释:自 PHP 4.2.0 起,不再需要用 srand() 或 mt_srand() 函数给随机数发生器播种,现已被自动完成。
语法
shuffle(array)
参数   描述
array   必需。规定要使用的数组。

输出:
---------- 调试PHP ----------
Array
(
    [0] => Dog
    [1] => Horse
    [2] => Cat
)

输出完成 (耗时 0 秒) - 正常终止。
PHP可以使用mcrypt_encrypt进行DES加密与解密,但实际上操作,你会发现它与JAVA的DES加密出来的字符串,有些不同。基本上是前半段一样,后半段不一样。找到PHP官方网站上对这个函数的文档,有人回复了,并给出了代码。经测,这样加密解密就跟JAVA中的兼容了。

If you want to be interoperable with other PKCS  #7 padding implementations, like the Legion of the Bouncy Castle Java  cryptography APIs, you should always pad, that is a 8-byte (block size)  padding should be added, even if not necessary



来自:http://it.oyksoft.com/post/4831/
背景:Apache结合spawn-fcgi使用FastCGI的实践,和PHP启动fastCGI一个原理。
关于PHP的相关情况参考:使用spawn-fcgi管理运行php-cgi  Url: http://www.libaqiang.com/?p=78193

spawn-fcgi和nginx自带的fastcgi相比 有什么优势?
为什么在用nginx的时候还要装spawn-fcgi,nginx不是自带有这个模块吗?
nginx的fastcgi_pass模块是用于代理fcgi协议的后端。spawn-fcgi用于管理支持fcgi协议的进程,属于process manager这类,免于重造轮子。
对于PHP,推荐php-fpm,比spawn多了不少专门针对php的功能,例如slow_request等。
http://www.zhihu.com/question/19689162


一)这个用spawn-fcgi 来管理FastCGI 以达到优化Apache 下PHP性能的方法比较另类,大家权当一种参考。

方法:系统平台是CentOS 5,前提是LAMP已配置好,运行正常。

1. wget -c http://www.21andy.com/centos/5/i386/spawn-fcgi-1.6.3-1.el5.i386.rpm(也可以去官方下载源码包编译安装:http://www.lighttpd.net/download/spawn-fcgi-1.6.3.tar.gz)
2. rpm -ivh spawn-fcgi-1.6.3-1.el5.i386.rpm
3. 使用spawn-fcgi来控制php-cgi的FastCGI进程:
/usr/bin/spawn-fcgi -a 127.0.0.1 -p 9000 -C 5 -u apache -g apache -f /usr/bin/php-cgi

参数含义如下:
-f <fcgiapp> 指定调用FastCGI的进程的执行程序位置,根据系统上所装的PHP的情况具体设置。
-a <addr> 绑定到地址addr。
-p <port> 绑定到端口port。
-s <path> 绑定到unix socket的路径path。
-C <childs> 指定产生的FastCGI的进程数,默认为5。(仅用于PHP)
-P <path> 指定产生的进程的PID文件路径。
-u和-g FastCGI使用什么身份(-u 用户 -g 用户组)运行,CentOS下可以使用apache用户,其他的根据情况配置,如nobody、www-data等。
4. 将这行代码加入到/etc/rc.local文件底部,这样系统启动的时候就可以同时启动PHP的FastCGI进程。


实践内容:
实践来源:http://www.phpabc.cn/apachejie-he-spawn-fcgishi-yong-fastcgi.html
(1)通过spawn-fcgi来启动php进程
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi  -a 127.0.0.1 -p 9000 -C 5 -u apache -g www -f /usr/local/webserver/php/bin/php-cgi          
spawn-fcgi: child spawned successfully: PID: 7551

ps aux|grep php
apache    7551 16.7  1.6  43396  6016 ?        Ssl  15:14   0:01 /usr/local/webserver/php/bin/php-cgi

cd lighttpd_fastCGI_Codes/
./configure && make && make install
/usr/bin/install -c spawn-fcgi '/usr/local/bin'
启动PHP:
/usr/local/bin/spawn-fcgi  -a 127.0.0.1 -p 9000 -C 5 -u apache -g www -f /usr/local/webserver/php/bin/php-cgi
root@192.168.137.128:~/software/lighttpd_fastCGI_Codes# ps aux|grep php  //共5个
www       9754  4.0  2.4  45112  8588 ?        Ss   15:50   0:00 /usr/local/webserver/php/bin/php-cgi
www       9756  0.0  1.1  45112  3988 ?        S    15:50   0:00 /usr/local/webserver/php/bin/php-cgi
www       9757  0.0  1.1  45112  3988 ?        S    15:50   0:00 /usr/local/webserver/php/bin/php-cgi

(2)要是自己编写一个fastcgi呢?简单如下操作(这儿好像不能像PHP一样有多个进程:fastcgi 多进程这部分,我还没研究到。可以有空再看看):
代码编写:
vi hello.c


编译:
gcc -o hello.fcgi hello.c -L /usr/local/webserver/fastcgi/fcgi/lib -lfcgi
/usr/local/webserver/fastcgi/spawn-fcgi/bin/spawn-fcgi  -a 127.0.0.1 -p 9000 -C 5 -u apache -g www -f ./hello.fcgi

启动成功没:
root@192.168.137.128:/usr/local/test# ps aux|grep hello
apache   10485  0.0  0.1   2140   416 ?        Ss   16:31   0:00 ./hello.fcgi

至于后面的ngnx配置,无非两种:
一个是直接连sock,另一个是开9002端口两者对比效率上哪个高一点儿呢?
一般来说本地的 unix sock要快一些。


参考Url:
http://blog.csdn.net/qzier_go/article/details/7340868
http://terry831010.blog.163.com/blog/static/6916117120126185428827/

二)spawn-fcgi与fcgi的运行机制分析 :在此基础上实现了守护监控功能
http://blog.csdn.net/cleanfield/article/details/6412723


背景:
群里有兄弟在问:
我在PHP.ini里 display=off屏蔽了错误,然后把错误信息 写入到LOG里
怎么搞?
一)
set_exception_handler
set_error_handler
二)php.ini里配置:
log_errors = On
error_log = /data/logs/php_error.log

阅读全文
背景:
Weibo LAMP演变——提到这zend的optimizer+快,大约在7 ~ 10% 快于APC。
阅读全文
背景:在接口有奇怪的符号,如下:
^M
^M
{"code":"0","msg":"参数无效"}
代码(把^M 和换行全替换成空: \r\n 在Unix下显示是:^M且换行了):

现在好了。没有换行也没有M了,也可:
vim编辑下,然后: :%s/\r\+$//e
如直接用PHP的trim替换后,还是有换行,只是^m没了。就是下文的直接替换:
阅读全文
分页: 12/24 第一页 上页 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 下页 最后页 [ 显示模式: 摘要 | 列表 ]