[聊天加密]前端crypto-js AES加密解密和PHP后端解密,加密。
Php/Js/Shell/Go jackxiang 2013-8-27 10:19
实践中遇到的问题:
在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==
在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==
php时区设定,确保date()返回正确的本地时间,php程序报date()警告的处理(date_default_timezone_set)。PHP5中的时间相差8小时的解决办法。PHP错误日志的时间与系统时间不一致,怎么解决?Linux下查看/修改系统时区、时间。
Php/Js/Shell/Go jackxiang 2013-8-23 17:27
背景:做了个聊天程序,发现后面的时间显示有问题。
写到文件第一行内:
问题: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/
写到文件第一行内:
问题: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的hosts访问问题记录
Php/Js/Shell/Go jackxiang 2013-8-23 10:17
早上遇到一个php-fpm的问题:
以前设置了host,后去掉这个host后到公网后发现这个fastcgi还是用的以前那个host,出现找不到host了(用shell下的curl是Ok的),后查来查去,重启了下php才好了,是怎么回事?
群里:
必须这样,我遇到很多次了,都记住了,估计估计是有dns缓存是有dns缓存。
以前设置了host,后去掉这个host后到公网后发现这个fastcgi还是用的以前那个host,出现找不到host了(用shell下的curl是Ok的),后查来查去,重启了下php才好了,是怎么回事?
群里:
必须这样,我遇到很多次了,都记住了,估计估计是有dns缓存是有dns缓存。
PHP做守护进程出现了内存不够用的情况,有待排查。
Php/Js/Shell/Go jackxiang 2013-8-13 18:19
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) && 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
/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) && 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的上传文件大小的限制
Php/Js/Shell/Go jackxiang 2013-8-10 14:47
当我们在使用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
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配置,通过它修改php.in达到php上传文件大小限制是不行的,除非修改.htaccess文件。
Php/Js/Shell/Go jackxiang 2013-8-9 15:59
用该参数可以自行设置 php.ini 文件中设置变量的值,其语法为:
-d configuration_directive[=value]
Egg容器启动es: /usr/local/php/bin/php -d EASYSWOOLE_ROOT=/data/www /data/www/easyswoole start dev
来自:https://www.cnblogs.com/myjavawork/articles/1869205.html
php.ini里有的变量才能修改,没有的变量返回false:
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
阅读全文
-d configuration_directive[=value]
Egg容器启动es: /usr/local/php/bin/php -d EASYSWOOLE_ROOT=/data/www /data/www/easyswoole start dev
来自:https://www.cnblogs.com/myjavawork/articles/1869205.html
php.ini里有的变量才能修改,没有的变量返回false:
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扫描系统进程 查看注册表实现。
Php/Js/Shell/Go jackxiang 2013-8-2 17:50
背景:一些浏览器的其它协议,如自定义协议,会扫描进程的列表,及通过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
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
[编码问题]php自动获取字符串编码函数mb_detect_encoding
Php/Js/Shell/Go jackxiang 2013-7-31 13:23
背景:有外包兄弟说是编码上有问题,于是从编码上想判断一下到底是什么编码,用了这个函数去判断。我倒是喜欢直接用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
使用 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
js与php加密、解密函数
Php/Js/Shell/Go jackxiang 2013-7-19 16:13
*********************加密、解密**************
php中加密、解密
用rawurlencode()对字符串加密,代替原始的urlencode():为了保证特殊字符,空格,回车,等操作的正确性
同时用rawurldecode()进行解码,代替urldecode(),同样理由
javascript中加密、解密
用encodeURIComponent()代替encodeURI(),加密
用decodeURIComponent()代替decodeURI(),解密
都是为了防止加密过程中对特殊字符的处理会出错的问题
来自:http://www.songxuemei.com/decode-encode/
php中加密、解密
用rawurlencode()对字符串加密,代替原始的urlencode():为了保证特殊字符,空格,回车,等操作的正确性
同时用rawurldecode()进行解码,代替urldecode(),同样理由
javascript中加密、解密
用encodeURIComponent()代替encodeURI(),加密
用decodeURIComponent()代替decodeURI(),解密
都是为了防止加密过程中对特殊字符的处理会出错的问题
来自:http://www.songxuemei.com/decode-encode/
那为何PHP还可以用井号#为注释了呢?
Php/Js/Shell/Go jackxiang 2013-7-17 09:54
背景:看有兄弟用“#”做PHP的注释。
PHP支持以Shell脚本风格的单行注释,这种注释方式使用“#”的形式实现,它的用法与C++语言风格注释方式相似。使用Shell脚本风格进行单行注释的PHP代码是可行的。但是不是主流就不得而知了,呵呵。
阅读全文
PHP支持以Shell脚本风格的单行注释,这种注释方式使用“#”的形式实现,它的用法与C++语言风格注释方式相似。使用Shell脚本风格进行单行注释的PHP代码是可行的。但是不是主流就不得而知了,呵呵。
阅读全文
[接口传值]request.getParameter("变量名")获取的字符串中原来的加号变成了空格,url传值。此时往往会出现没说需要urlencode带来的系列问题。
Php/Js/Shell/Go jackxiang 2013-7-15 16:07
今天我在调程序时,遇到了见郁闷的事,我用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,呵呵。
原因: 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,呵呵。
[网页查找]MacBook下面chrome搜索快捷键Option+Command+F,全屏快捷键Control+Command+f,访问大网站如何在源代码中搜索JS函数查找其调用,fiddler2里查找所有请求的contents内容的某字符串的方法,Httpwatcher也有该功能,对于web页面里的所有的js函数在Firebug、fiddler2及Httpwatcher和chrome开发者模式下查找方法备案,重发JS请求。
Php/Js/Shell/Go jackxiang 2013-7-15 10:40
下面的快捷键记不住怎么办?新的插件搜索位置在:
Windows下面的F12打开开发者工具后,右侧有下个竖着的点,然后,下拉中有一项:More Tools-》新的下拉:Search就打开了Chrome在所有资源文件源码中搜索Ctrl+Shift+F。 来自:https://www.cnblogs.com/wsytl/p/5039032.html
MacBook下面chrome全屏快捷键Control+Command+F。
一、在源代码中搜索:也就是想在整个工程下,查找一段源代码呢?
Windows下Ctrl+Shift+F更多技巧:http://www.cnblogs.com/giggle/p/5966991.html
MacBook下的Chrome打开网址里的全网页包括CSS/JS的搜索快捷键:Option+Command+F。 #Mac上:Option+Command+F
二)快速查找文件:
Ctrl+P(Mac上Cmd + P)
三)跳到某行:
Ctrl+G(Mac上Cmd+L),然后输入你指定的行数即可。
四)多光标:(快速查找文件后,可多光标编辑,对于一行压缩的代码,展开格式化后,不能在里面修改)
通过按住Ctrl(Mac上Cmd)。
有时想查找整个页面里的某个函数在哪个文件里,往往这些函数在输出时是压缩的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
===============
谷歌浏览器怎么重发请求_使用Chrome浏览器实现请求的重放即复制某个请求?
Chrome可以通过控制台实现对某个请求的重放,即复制某个请求,然后自己实现对该请求的多次发送。这个功能有什么用呢?在web开发中,调试代码或者调试找bug的时候就派上用场了。使用方法如下:
在Chrome上按f12打开控制台,切到Network标签页。之后进行你正常的页面操作把你想要复制的请求先通过页面发送一遍(如果页面有自动刷新的话,为了避免刷新后请求丢失的情况出现,建议勾选上Preserve log)
通过鼠标在请求的列表中找到我们需要复制的请求,右键——Copy——Copy as fetch(我这里直接使用我的首页请求进行演示)
到这里我们的请求已经被复制下来了,那怎么实现重新请求呢?很简单,还是刚才的页面,我们切换到Console页面,直接粘贴回车即可,需要多次请求则粘贴多次。
解释:fetch其实是javascript中一个网络请求的函数或者工具,Chrome在我们Copy as fetch的时候帮我们把请求的各种参数转换成了使用fetch请求的代码,所以我们可以直接在控制台上直接执行从而达到请求重放的效果。
Windows下面的F12打开开发者工具后,右侧有下个竖着的点,然后,下拉中有一项:More Tools-》新的下拉:Search就打开了Chrome在所有资源文件源码中搜索Ctrl+Shift+F。 来自:https://www.cnblogs.com/wsytl/p/5039032.html
MacBook下面chrome全屏快捷键Control+Command+F。
一、在源代码中搜索:也就是想在整个工程下,查找一段源代码呢?
Windows下Ctrl+Shift+F更多技巧:http://www.cnblogs.com/giggle/p/5966991.html
MacBook下的Chrome打开网址里的全网页包括CSS/JS的搜索快捷键:Option+Command+F。 #Mac上:Option+Command+F
二)快速查找文件:
Ctrl+P(Mac上Cmd + P)
三)跳到某行:
Ctrl+G(Mac上Cmd+L),然后输入你指定的行数即可。
四)多光标:(快速查找文件后,可多光标编辑,对于一行压缩的代码,展开格式化后,不能在里面修改)
通过按住Ctrl(Mac上Cmd)。
有时想查找整个页面里的某个函数在哪个文件里,往往这些函数在输出时是压缩的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
===============
谷歌浏览器怎么重发请求_使用Chrome浏览器实现请求的重放即复制某个请求?
Chrome可以通过控制台实现对某个请求的重放,即复制某个请求,然后自己实现对该请求的多次发送。这个功能有什么用呢?在web开发中,调试代码或者调试找bug的时候就派上用场了。使用方法如下:
在Chrome上按f12打开控制台,切到Network标签页。之后进行你正常的页面操作把你想要复制的请求先通过页面发送一遍(如果页面有自动刷新的话,为了避免刷新后请求丢失的情况出现,建议勾选上Preserve log)
通过鼠标在请求的列表中找到我们需要复制的请求,右键——Copy——Copy as fetch(我这里直接使用我的首页请求进行演示)
到这里我们的请求已经被复制下来了,那怎么实现重新请求呢?很简单,还是刚才的页面,我们切换到Console页面,直接粘贴回车即可,需要多次请求则粘贴多次。
解释:fetch其实是javascript中一个网络请求的函数或者工具,Chrome在我们Copy as fetch的时候帮我们把请求的各种参数转换成了使用fetch请求的代码,所以我们可以直接在控制台上直接执行从而达到请求重放的效果。
PHP array_keys() 函数和PHP shuffle() 函数。
Php/Js/Shell/Go jackxiang 2013-7-12 17:11
背景:近来看有兄弟用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 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的DES加解密函数 与JAVA兼容
Php/Js/Shell/Go jackxiang 2013-7-11 12:16
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/
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/
[实践Ok]通过spawn-fcgi管理命令行直接启动PHP的fastCGI程序,fastCGI加入监控拉起功能备案。
Php/Js/Shell/Go jackxiang 2013-7-5 15:49
背景: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的相关情况参考:使用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