背景:做温度比较时有用。
PHP如何比较两个浮点数的大小?

在程序开发中,通常有会涉及到两个大浮点数的比较:如:1.9999999999999999999981.999999999999999999999这样两个大精度的数的比较方法除了以字符串的形式来比较,还有其它方式比较吗?php的bccomp比较出来是相等的。


注意第三个参数

$a = '1.999999999999999999998';
$b = '1.999999999999999999999';
$flag = bccomp($a, $b, 21);
var_dump($flag); // int(-1) 说明b比a大
exit;


From:http://baike.1688.com/doc/view-d35956820.html
echo exec('whoami')
背景:rango兄弟搞一个swoole,这兄弟尼玛名字取得太大 Tencent Sever Framework。 不怕腾讯告你啊,tsf用了PHP的生成器语法实现了协程,这是最大的创新。QQ 现在 部分后台协议 是用这个搞的公众号。也有人用swoole做日志服务器。
顺带介绍下swoole:采用swoole+redis,基于swoole扩展,根据内部的需求,封装了一套可扩展、高性的PHP server,已应用于多个业务模块,提供高并发的kv数据查询及业务数据的在线计算,每天亿级的PV量,某熊公司有一套分布式压测系统,他们对实际项目做过100亿次的测试,无问题,正在用,我没用,哈哈。

开始扯:
协程也有一个小小的缺点:做并发不如异步IO方便。除非你再启动一个协程。做comet还是golang比较舒服,swoole的comet也非常方便。
golang+redis (数字公司在用,跟开发普通后端server一样,不过golang是协程机制,hold连接很简单,单机一般有100w,经过优化后连接能到200w).......swoole这块我就不想提了,毕竟要相信PHP是最好的语言没有之一
go吸引人的是顺应了目前主流语言的编程风格,进行了语法的一些改进,吸收了erlang的协程机制,另外与c的无缝混编。
仅管看go很NB的样子,但我还是要说PHP才是最好的语言,没有之一,因为swoole也能实现了。
总之,PHP是世界上最好的语言
————————————————————————————————————————————————————————————————————————
PHP 协程方案 tsf

tsf (Tencent Server Framework) 是腾讯公司推出的 PHP 协程方案,基于 Swoole+PHP Generator 实现的 Coroutine。Tencent Server Framework 是快速服务器部署框架,PHP 现在可以像 Golang 一样用协程实现高并发服务器,同时支持同步阻塞,异步非阻塞回调,协程这 3 种 IO 模型。

主要特性:

    基于 PHP,相比 C++ 开发更高效

    基于 Swoole 扩展,强大的异步 IO

    支持 PHP coroutine

    支持服务器监控器和提供接口

要求:

    php5.5+

    Swoole1.7.18+

    linux,OS X

服务器配置:

vim server.ini

[server]
;server type:tcp,udp,http
type = http
; port
listen[] = 12312
; entrance file
root = '/data/web_deployment/serv/test/index.php'
;php start path
php = '/usr/local/php/bin/php'

[setting]
; worker process num
worker_num = 16
; task process num
task_worker_num = 0
; dispatch mode
dispatch_mode = 2
; daemonize
daemonize = 1
; system log
log_file = '/data/log/test.log'

启动服务器:

cd /root/tsf/bin/
php swoole testHttpServ start

使用 TCP/UDP/HTTP 客户端:



$tcpReturn=(yield $this->tcpTest());
  $udpReturn=(yield $this->udpTest());
  $httpReturn=(yield $this->httpTest());
  public function tcpTest(){
    $ip = '127.0.0.1';
    $port = '9905';
    $data = 'test';
    $timeout = 0.5; //second
    yield new Swoole\Client\TCP($ip, $port, $data, $timeout);
  }
  public function udpTest(){
    $ip = '127.0.0.1';
    $port = '9905';
    $data = 'test';
    $timeout = 0.5; //second
    yield new Swoole\Client\UDP($ip, $port, $data, $timeout);
  }
  public function httpTest(){
    $url='http://www.qq.com';
    $httpRequest= new Swoole\Client\HTTP($url);
    $data='testdata';
    $header = array(
      'Content-Length' => 12345,
    );
    yield $httpRequest->get($url); //yield $httpRequest->post($path, $data, $header);
  }

来自:http://m.oschina.net/p/tsf?from=timeline&isappinstalled=0
http://www.laruence.com/2011/12/19/2409.html

每次编辑和新增内容时均会产生"Illegal string offset 'enablehits' | phpcms\modules\poster\index.php | 104"的错误,网上查询是不兼容php5.4版本导致,希望官方尽快修复兼容php5.4版本

http://bbs.phpcms.cn/thread-886897-1-1.html
在WAMPServer下同时支持PHP5.3、PHP5.4、PHP5.5、PHP5.6的步骤:
http://www.cnblogs.com/lyongde/p/3745030.html
背景:pt-query-digest需要PDO,别搞成/ext/pdo了,实际是/ext/pdo_mysql。
这篇文章需要:http://jackxiang.com/post/8113/
DownLoad:https://www.percona.com/downloads/percona-toolkit/ 里面有一个:
percona-toolkit-2.2.14-1.noarch.rpm
https://www.percona.com/downloads/percona-toolkit/2.2.14/RPM/percona-toolkit-2.2.14-1.noarch.rpm
————————————————————————————————————————
来自:http://blog.csdn.net/liruxing1715/article/details/8268513

1、进入 PHP 的软件包 pdo 扩展目录中(注:不是 PHP 安装目录)


[root@gamejzy /]# cd /tmp/lamp/php-5.3.19/ext/pdo_mysql/

注:我的 php 软件包在 /tmp/lamp/php-5.3.19 下

执行 phpize 命令

[root@gamejzy pdo_mysql]# /usr/local/php/bin/phpize


注:/usr/local/php 是我的 php 安装目录

执行完 phpize 命令后,在 pdo_mysql 目录中就会出现 configure

执行配置

[root@gamejzy pdo_mysql]# ./configure --with-php-config=/usr/local/php/bin/php-config --with-pdo-mysql=/usr/local/mysql/
不加mysql会出现:configure: error: Unable to find your mysql installation


参数说明:

--with-php-config=/usr/local/php/bin/php-config 指定安装 PHP 的时候的配置

--with-pdo-mysql=/usr/local/mysql/ 指定 MySQL 数据库的安装目录位置

编译安装

[root@gamejzy pdo_mysql]# make && make install

/usr/local/php/lib/php/extensions/no-debug-non-zts-20090626/pdo_mysql.so
php里加上(不是pdo.so呢,它是sqlite的扩展名,特别要注意下。):
extension = "pdo_mysql.so"
背景:对于书上一些连接mysql的例子,总是像写c语言一样,一行一行的,直接写下去,确实好看明白,但是在实际使用中,如果暴露出错误到前端页面是不太好的,这时候需要try catch来捕获这些错误,对于mysql的连接句柄的密码是否正确可以用if直接判断其返回值,再用throw new exception("Sorry,could not connect to mysql.");而对于一些非密码的网络及数据库,得用上catch,网上有一篇文章就有这样的类似介绍。



自己简单实践如下,如果密码错误则会捕获并报如下信息,而不是直接抛出:
一)来个设置温度是否成功了,并无从db查询的数据返回的:

密码错会报如下错,前端用json去解析判断并提示用户即可,自己也好查错不是:
{"opt":"setTemperatureValue","status":-1,"errMsg":"Sorry,could not connect to mysql."}

二)来个有数据查询并返回的简单示例:

(1)错误结果:
{"opt":"getTemperatureValue","status":-1,"errMsg":"Sorry,could not connect to mysql."}
(2)正确结果:
{"opt":"getTemperatureValue","status":-1,"curTempOne":"40.2","curTempTwo":"38.6","curTempSetOne":"35.5","curTempSetTwo":"55.4"}
原始代码参考来源:http://bbs.csdn.net/topics/240078038
在Windows或者Linux下mysql安装后默认的密码为空,
又当我们又安装了mysql的管理工具
phpmyadmin后登陆时出现“空密码登陆呗禁止(参见允许密码为空)”。不能登录成功              
解决办法如下:

1..要是你想用空密码,则将phpmyadmin下的

config.inc.php(根目录)或者config.default.php(根目录)
再则:libraries\config.default.php
(友情提示,由于版本不一样可能涉及的文件不同,基本为这三个文件)
中的$cfg['Servers'][$i]['AllowNoPassword'] = false;
改为$cfg['Servers'][$i]['AllowNoPassword'] = true;

2.要是你想设置密码不为空则将
$cfg['blowfish_secret'] = '123456'; // use here a value of your choice 你要设置的密码

背景:如果用前端的js去做比较两个小数点1位的温度谁高谁低,那么直接用大于符号小于符号会有点问题,这篇文章就是讲解这一块的事情。

var定义的变量应该是字符串,有时没有经过类型转换而进行比较的话,小于十的话还可以,如果大于十就会出错。
js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(Not a Number)。

例:
var hour_select_begin=$('#hour_select_begin option:selected').text();
var hour_select_end=$('#hour_select_end option:selected').text();
if(hour_select_begin>hour_select_end){
alert("开始时间不能大于结束时间");
return false;
}

这时如果 hour_select_begin>=10 则判断会有问题;
修正方法1:
if(eval_r(hour_select_begin)>eval_r(hour_select_end)){
alert("开始时间不能大于结束时间");
return false;
}
修正方法2:
将String转为number类型: hour_select_begin=hour_select_begin-0;
hour_select_begin=hour_select_end -0;


补充:
js 字符串转换数字  
方法主要有三种

转换函数、强制类型转换、利用js变量弱类型转换。

1. 转换函数:

js提供了parseInt()和parseFloat()两个转换函数。前者把值转换成整数,后者把值转换成浮点数。只有对String类型调用这些方法,这两个函数才能正确运行;对其他类型返回的都是NaN(Not a Number)。



一些示例如下:

parseInt("1234blue"); //returns 1234
parseInt("0xA"); //returns 10
parseInt("22.5"); //returns 22
parseInt("blue"); //returns NaN



parseInt()方法还有基模式,可以把二进制、八进制、十六进制或其他任何进制的字符串转换成整数。基是由parseInt()方法的第二个参数指定的,示例如下:

parseInt("AF", 16); //returns 175
parseInt("10", 2); //returns 2
parseInt("10", 8); //returns 8
parseInt("10", 10); //returns 10
如果十进制数包含前导0,那么最好采用基数10,这样才不会意外地得到八进制的值。例如:
parseInt("010"); //returns 8
parseInt("010", 8); //returns 8
parseInt("010", 10); //returns 10



parseFloat()方法与parseInt()方法的处理方式相似。
使用parseFloat()方法的另一不同之处在于,字符串必须以十进制形式表示浮点数,parseFloat()没有基模式。

下面是使用parseFloat()方法的示例:
parseFloat("1234blue"); //returns 1234.0
parseFloat("0xA"); //returns NaN
parseFloat("22.5"); //returns 22.5
parseFloat("22.34.5"); //returns 22.34
parseFloat("0908"); //returns 908
parseFloat("blue"); //returns NaN

2. 强制类型转换

还可使用强制类型转换(type casting)处理转换值的类型。使用强制类型转换可以访问特定的值,即使它是另一种类型的。
ECMAScript中可用的3种强制类型转换如下:
Boolean(value)——把给定的值转换成Boolean型;
Number(value)——把给定的值转换成数字(可以是整数或浮点数);
String(value)——把给定的值转换成字符串。
用这三个函数之一转换值,将创建一个新值,存放由原始值直接转换成的值。这会造成意想不到的后果。
当要转换的值是至少有一个字符的字符串、非0数字或对象时,Boolean()函数将返回true。如果该值是空字符串、数字0、undefined或null,它将返回false。

可以用下面的代码段测试Boolean型的强制类型转换。

Boolean(""); //false – empty string
Boolean("hi"); //true – non-empty string
Boolean(100); //true – non-zero number
Boolean(null); //false - null
Boolean(0); //false - zero
Boolean(new Object()); //true – object

Number()的强制类型转换与parseInt()和parseFloat()方法的处理方式相似,只是它转换的是整个值,而不是部分值。示例如下:

用  法 结  果
Number(false) 0
Number(true) 1
Number(undefined) NaN
Number(null) 0
Number( "5.5 ") 5.5
Number( "56 ") 56
Number( "5.6.7 ") NaN
Number(new Object()) NaN
Number(100) 100  

最后一种强制类型转换方法String()是最简单的,示例如下:

var s1 = String(null); //"null"
var oNull = null;
var s2 = oNull.toString(); //won’t work, causes an error

3. 利用js变量弱类型转换

举个小例子,一看,就会明白了。
<script>
var str= '012.345 ';
var x = str-0;
x = x*1;
</script>

上例利用了js的弱类型的特点,只进行了算术运算,实现了字符串到数字的类型转换,不过这个方法还是不推荐的





转换成数字
ECMAScript提供了两种把非数字的原始值转换成数字的方法,即parseInt()和parseFloat()。
注意:只有对String类型(Number除外)调用这些方法,才能正确运行对其他类型返回的都是NaN。
例如:
Js代码
var iNum1 = parseInt(“1234blue”);//returns 1234    var iNum2 = parseInt(“oxA”); //returns 10    var iNum3 = parseInt(“22.5″); //returns 22    var iNum4 = parseInt(“blue”); //returns NaN  
以下其他类型转换
一、类型转换
1.转换成字串
ECMAScript的Boolean值、数字和字串的原始值的有趣之处在于它们是伪对象,这意味着它们实际上具有属性和方法。
如:
Js代码
var sColor = “blue”;  
alert(sColor.length);//outputs “4″  
总而言之,3种主要的原始值Boolean值、数字和字串都有toString()方法。ECMAScript定义的所有对象都有toString()方法,无论它是伪对象,还是真的对象。
Boolean型的toString()方法只是输出”true”或”false”,结果由变量的值决定:
Js代码
var bFound = false;  
alert(bFound.toString());//outputs “false”  
Number类型的toString()方法比较特殊,它有两种模式,即默认模式和基模式,采用默认模式,toString()方法只是用相应的字符串输出数字值(无论是整数、浮点数还是科学记数法)。
Js代码
var iNum1 = 10;    var fNum2 = 10.0;    alert(iNum1.toString()); //outputs “10″    alert(fNum2.toString()); //outputs “10″  
采用Number类型的toString()方法的基模式,可以用不同的基(进制基数)输出数字。
Js代码
var iNum = 10;    alert(iNum.toString(2));  //outputs “1010″    alert(iNum.toString(8));  //outputs “12″    alert(iNum.toString(16)); //outputs “A”  
2.转换成数字
ECMAScript提供了两种把非数字的原始值转换成数字的方法,即parseInt()和parseFloat()。
注意:只有对String类型(Number除外)调用这些方法,才能正确运行对其他类型返回的都是NaN。
例如:
Js代码
var iNum1 = parseInt(“1234blue”);//returns 1234    var iNum2 = parseInt(“oxA”); //returns 10    var iNum3 = parseInt(“22.5″); //returns 22    var iNum4 = parseInt(“blue”); //returns NaN  
parseInt()方法还有基模式,可以把二进制、八进制、十六进制或者其他任何进制的字符串转换成十进制整数。第二个参数指定按哪一种进制来解析。
Js代码
var iNum1 = parseInt(“AF”,16);// returns 175    var iNum2 = parseInt(“10″,2); // returns 2    var iNum3 = parseInt(“10″,8); //returns 8    var iNum4 = parseInt(“10″,10); //returns 10  
说明:如果十进制数包含前导0,那么最好采用基数10,否则得到的是八进制的值。
Js代码
var iNum1 = parseInt(“010″);  // returns 8    var iNum2 = parseInt(“010″,8); //returns 8    var iNum3 = parseInt(“010″,10);//returns 10  
parseFloat()方法与parseInt()方法的处理方式相似,从位置0开始查看每个字符,直到找到第一个非有效的字符为止,然后把该字符之前的字串转换成数字。对于这个方法来说,第一个出现的小数点是有效字符。如果用两个小数点,第二个小数点将被看作无效的。使用该方法的另一个不同之处在于,字串必须以十进制形式表示浮点数。
Js代码
var fNum1 = parseFloat(“1234blue”); //returns 1234.0    var fNum2 = parseFloat(“0xA”); //returns NaN   var fNum3 = parseFloat(“22.5″); //returns 22.5    var fNum4 = parseFloat(“22.34.5″);//returns 22.34    var fNum5 = parseFloat(“0908″);//returns NaN    var fNum6 = parseFloat(“blue”);//returns NaN  
3.强制类型转换
ECMAScript中可用的3种强制类型转换如下:
(1).Boolean(value)
把给定的值转换成Boolean型。
当要转换的值是至少有一个字符的字符串、非0数字或对象时,Boolean()函数将返回true。如果该值是空字符串、数字0、undefined或null,它将返回false。
如:
Js代码
var b1 = Boolean(“”); // false;    var b2 = Boolean(“hi”);//true    var b3 = Boolean(100);//true    var b4 = Boolean(null);//false    var b5 = Boolean(0);//false    var b6 = Boolean(new Object());//true  
(2).Number(value)
把给定的值转换成数字(可以是整数或浮点数)。
还记得parseInt()和parseFloat()方法只转换第一个无效字符之前的字符串,因此”4.5.6″将被转换为”4.5″。用Number()进行强制类型转换,”4.5.6″将返回NaN,因为整个字符串值不能转换成数字。如果字符串能被完整地转换,Number()将判断是调用parseInt()方法还是调用parseFloat()方法。
如:
Js代码
Number(false);//0    Number(true);//1    Number(undefined);//NaN    Number(null);//0    Number(“5.5″);//5.5    Number(“56″);//56    Number(“5.6.7″);//NaN    Number(new Object());//NaN    Number(100);//100  
(3).String(value)
把给定的值转换成字串。
与调用toString()方法的唯一不同之处在于,对null或undefined值强制类型转换可以生成字符串而不引发错误:
Js代码
var s1 = String(null);//”null”    var oNull = null;    var s2 = oNull.toString();//causes an error  
二、引用类型
引用类型通常叫作类(class),也就是说,遇到引用值时,所处理的就是对象。ECMAScript定义了“对象定义”,逻辑上等价于其他程序设计语言中的类。
1.Object类
ECMAScript中的所有类都由这个类继承而来,Object类中的所有属性和方法都会出现在其他类中(被覆盖)。
Object类的属性:
(1).Constructor—-对创建对象的函数的引用(指针)。对于Object类,该指针指向原始的object()函数。
(2).Prototype—-对该对象的对象原型的引用。对于所有的类,它默认返回Object对象的一个实例。 一、类型转换
1.转换成字串
ECMAScript的Boolean值、数字和字串的原始值的有趣之处在于它们是伪对象,这意味着它们实际上具有属性和方法。
如:
Js代码
var sColor = “blue”;   alert(sColor.length);//outputs “4″  
总而言之,3种主要的原始值Boolean值、数字和字串都有toString()方法。ECMAScript定义的所有对象都有toString()方法,无论它是伪对象,还是真的对象。
Boolean型的toString()方法只是输出”true”或”false”,结果由变量的值决定:
Js代码
var bFound = false;   alert(bFound.toString());//outputs “false”  
Number类型的toString()方法比较特殊,它有两种模式,即默认模式和基模式,采用默认模式,toString()方法只是用相应的字符串输出数字值(无论是整数、浮点数还是科学记数法)。
Js代码var iNum1 = 10;   var fNum2 = 10.0;   alert(iNum1.toString()); //outputs “10″  alert(fNum2.toString()); //outputs “10″  
采用Number类型的toString()方法的基模式,可以用不同的基(进制基数)输出数字。
Js代码var iNum = 10;   alert(iNum.toString(2));  //outputs “1010″  alert(iNum.toString(8));  //outputs “12″  alert(iNum.toString(16)); //outputs “A”  
parseInt()方法还有基模式,可以把二进制、八进制、十六进制或者其他任何进制的字符串转换成十进制整数。第二个参数指定按哪一种进制来解析。
Js代码var iNum1 = parseInt(“AF”,16);// returns 175  var iNum2 = parseInt(“10″,2); // returns 2  var iNum3 = parseInt(“10″,8); //returns 8  var iNum4 = parseInt(“10″,10); //returns 10  
说明:如果十进制数包含前导0,那么最好采用基数10,否则得到的是八进制的值。
Js代码var iNum1 = parseInt(“010″);  // returns 8  var iNum2 = parseInt(“010″,8); //returns 8  var iNum3 = parseInt(“010″,10);//returns 10  
parseFloat()方法与parseInt()方法的处理方式相似,从位置0开始查看每个字符,直到找到第一个非有效的字符为止,然后把该字符之前的字串转换成数字。对于这个方法来说,第一个出现的小数点是有效字符。如果用两个小数点,第二个小数点将被看作无效的。使用该方法的另一个不同之处在于,字串必须以十进制形式表示浮点数。
Js代码var fNum1 = parseFloat(“1234blue”); //returns 1234.0  var fNum2 = parseFloat(“0xA”); //returns NaN  var fNum3 = parseFloat(“22.5″); //returns 22.5  var fNum4 = parseFloat(“22.34.5″);//returns 22.34  var fNum5 = parseFloat(“0908″);//returns NaN  var fNum6 = parseFloat(“blue”);//returns NaN  
3.强制类型转换
ECMAScript中可用的3种强制类型转换如下:
(1).Boolean(value)
把给定的值转换成Boolean型。
当要转换的值是至少有一个字符的字符串、非0数字或对象时,Boolean()函数将返回true。如果该值是空字符串、数字0、undefined或null,它将返回false。
如:
Js代码var b1 = Boolean(“”); // false;  var b2 = Boolean(“hi”);//true  var b3 = Boolean(100);//true  var b4 = Boolean(null);//false  var b5 = Boolean(0);//false  var b6 = Boolean(new Object());//true  
(2).Number(value)
把给定的值转换成数字(可以是整数或浮点数)。
还记得parseInt()和parseFloat()方法只转换第一个无效字符之前的字符串,因此”4.5.6″将被转换为”4.5″。用Number()进行强制类型转换,”4.5.6″将返回NaN,因为整个字符串值不能转换成数字。如果字符串能被完整地转换,Number()将判断是调用parseInt()方法还是调用parseFloat()方法。
如:
Js代码Number(false);//0  Number(true);//1  Number(undefined);//NaN  Number(null);//0  Number(“5.5″);//5.5  Number(“56″);//56  Number(“5.6.7″);//NaN  Number(new Object());//NaN  Number(100);//100  
(3).String(value)
把给定的值转换成字串。
与调用toString()方法的唯一不同之处在于,对null或undefined值强制类型转换可以生成字符串而不引发错误:
Js代码
var s1 = String(null);//”null”  var oNull = null;   var s2 = oNull.toString();//causes an error  
二、引用类型
引用类型通常叫作类(class),也就是说,遇到引用值时,所处理的就是对象。ECMAScript定义了“对象定义”,逻辑上等价于其他程序设计语言中的类。
1.Object类
ECMAScript中的所有类都由这个类继承而来,Object类中的所有属性和方法都会出现在其他类中(被覆盖)。
Object类的属性:
(1).Constructor—-对创建对象的函数的引用(指针)。对于Object类,该指针指向原始的object()函数。
(2).Prototype—-对该对象的对象原型的引用。对于所有的类,它默认返回Object对象的一个实例。

转自:http://blog.sina.com.cn/s/blog_4b7b2fc501010xar.html
背景:Newest 'owncloud' Questions - Stack Overflow Track down PHP error “Comments starting with '#' are deprecated in Unknown on line 1 at Unknown#0” I've just set up a RPi 2 with the latest ...

PHP Deprecated: Comments starting with '#' are deprecated in *.ini 警告解决办法

新装的CentOS7 64系统,使用新立得装的PHP 版本,但是每次我在命令行下执行php脚本时都会出如下的警告信息:

PHP Deprecated:  Comments starting with '#' are deprecated in /etc/php5/cli/conf.d/mcrypt.ini on line 1 in Unknown on line 0

上网查了一下,原来是新版本的PHP不赞成用'#'号作为注释符号,需要用分号';'。打开这个文件,把里面的#替换成;号,问题解决!

摘自:http://blog.csdn.net/rainday0310/article/details/6330115

Shell脚本风格的单行注释

  这种注释方式使用"#"的形式实现,它的用法与C++语言风格注释方式相似。使用Shell脚本风格进行单行注释的PHP示例代码如下:



参考:http://jackxiang.com/post/6532/
背景:写PHP时特别是调试页面时,不想有额外输出,于是相应的的调试插件出现了。
以前寫PHP都用var_dump來debug
現在改用ChromePHP來debug
ChromePHP是Chrome上的套件
在Firefox上也有Firephp
ChromePHP使用上也非常簡單
先到chrome web store
安裝ChromePHP套件
在去ChromePHP官網下載ChromePhp.php檔案
chromephp官網:http://www.chromephp.com/
接著只有在需要用的時後
include 'ChromePhp.php';
ChromePhp::log('需要輸出的var');
這樣一來就可以在Chrome控制台上的console看到輸出的訊息
如果要在CodeIgniter上使用
需要修改一下ChromePhp.php
把用本的private function __construct()
修改為public function __construct()
$this->load->library('ChromePhp');
$this->chromephp->log('需要輸出的var');
来自:http://blog.ipushs.com/codeigniter%E7%94%A8chromephp%E4%BE%86debugphp/?replytocom=78
最近研究安全性时,偶尔发现php.ini上并没有开启open_basedir,于是搜索了下,有人说开启后有性能影响,于是测试了一下。

首先,交代一下环境:centos + nginx + php-fpm + php + mysql,典型的lnmp了。

测试代码如下:
Php代码  收藏代码

执行100次,实测结果是未开启open_basedir时大约是0.00001秒。
开启后:0.001秒。
性能相差100倍。

在安全性和性能上,该怎么取舍呢。。。还是安全性吧?哈哈。。。

来自:http://exvision.iteye.com/blog/830506
背景:在一个项目中,有一个兄弟用init jquery时,用了这种写法,而不是$().ready(   ,参考:http://jackxiang.com/post/1983/ ,于是了解了一下~

学习一:
提问,
(function(window,undefined){})(window);
这个,为什么要将window和undefined作为参数传给它?
回答:
因为 javascript 执行JS代码是从里到外,因此把全局变量传进来,就避免了到外层去寻找。提高效率

提问Q:
不明白为什么JS 的undefined还可以做变量名。 undefined算是JS里面的什么呢?不是关键字,不是保留字,true跟false还有null也不是,不过跟undefined不同,不能用作变量名。
这些到底算是什么呢?
回答A:
可以避免 undefined 被别人定义了。
var undefined=8;
(function(window){
alert(window.undefined); //8
alert(undefined); //8
})(window);

var undefined=8;
(function(window,undefined){
alert(window.undefined); //8
alert(undefined); //此处undefined参数为局部的名称为undefined变量,值为undefined
})(window);

所以后者,就算外面的人把 ,undefined 定义了,里面的 undefined 依然不受影响。
大概是为了最大程度防止外界的变量定义对 所做封装的内部影响吧。

学习二,更和jquery结合更紧密:
详解jquery插件中(function ( $, window, document, undefined )的作用:
在jquery插件中我们经常看到以下这段代码
;(function ( $, window, document, undefined ){
//函数体内具体代码
})(jQuery, window,document);
对于很多初学者来说很难明白这表示什么,下边我将为大家介绍其相应的作用。

1、代码最前面的分号,可以防止多个文件压缩合并以为其他文件最后一行语句没加分号,而引起合并后的语法错误。

2、匿名函数(function(){})();:由于Javascript执行表达式是从圆括号里面到外面,所以可以用圆括号强制执行声明的函数。避免函数体内和外部的变量冲突。

3、$实参:$是jquery的简写,很多方法和类库也使用$,这里$接受jQuery对象,也是为了避免$变量冲突,保证插件可以正常运行。

4、window, document实参分别接受window, document对象,window, document对象都是全局环境下的,而在函数体内的window, document其实是局部变量,不是全局的window, document对象。这样做有个好处就是可以提高性能,减少作用域链的查询时间,如果你在函数体内需要多次调用window 或 document对象,这样把window 或 document对象当作参数传进去,这样做是非常有必要的。当然如果你的插件用不到这两个对象,那么就不用传递这两个参数了。

5、最后剩下一个undefined形参了,那么这个形参是干什么用的呢,看起来是有点多余。undefined在老一辈的浏览器是不被支持的,直接使用会报错,js框架要考虑到兼容性,因此增加一个形参undefined


http://www.bcty365.com/content-47-805-1.html









————————————————————为何有这一问(代码来自)————————————————————


代码来自:
http://jackxiang.com/post/7864/

更多疑问参考解答Url:http://zhidao.baidu.com/link?url=P4soG5CQSsXaZUo5DBfUX9uoFl9Mkbncf_dFs7CdC3XwdVdy7rSjWCAyTy4VWIMtIAkRzpV87TJh6uHxlvYPyq
CentOS 7下hhvm Nginx环境搭建:
http://www.linuxeye.com/Linux/2029.html
Supervisor管理hhvm进程:
http://www.linuxeye.com/Linux/Supervisor-hhvm.html
注意一下路径:
;logfile=/tmp/supervisord.log ; (main log file;default $CWD/supervisord.log)
logfile=/data/logs/supervisor/supervisord.log ; (main log file;default $CWD/supervisord.log)
pidfile=/var/run/supervisord.pid ; (supervisord pidfile;default supervisord.pid)

=======================================================
Q:多处出现:软件包boost-regex-1.54.0-9.el6.x86_64.rpm没有签名?
Q:大家都用source编译?我是想通过yum 安装了解一下php的hhvm 尽量用yum 安装。
A:比较容易标准化 机器多的话,可以统一标准化 对,标准化很重要
https://github.com/lj2007331/lnmp
淘宝一个人建的,其中functions目录把每个l n/a mp版本安装封装成了一个shell函数(包含了依赖包),有hhvm和php7。如果是在机器上体验一下,可以使用这个项目或者把他的函数抠出来,可以省去从源码编译挨个找依赖包的痛苦。

————————————————兼容过渡办法—————————————————

测试了下6月6日下载编译的PHP7和HHVM最新的3.7.1.
ab -c100 -n1000 http://127.0.0.1/wordpress/
100并发完成1000个请求,PHP7(开启opcache,5个PHP-FPM工作进程)每秒处理117个请求,HHVM则是每秒126个,性能差距很小.值得一提的是,HHVM没有热身时(第一次压测),每秒只能处理56个请求,而PHP7仍能处理117个请求.

这是我6月6日编译的PHP7开发版,你可以下载进行测试:
http://my.oschina.net/eechen/blog/411534

补充:
如果你觉得处于Alpha版本的PHP7还不够稳定,你可以配置Nginx,PHP7-FPM监听9000端口,PHP5-FPM监听9001端口,当PHP7崩掉的时候自动切换到作为备用的PHP5.

upstream php.backend {
    server 127.0.0.1:9000;
    server 127.0.0.1:9001 backup;
}
PHP-FPM是多进程的架构,PHP7并没有改动PHP-FPM的架构,所以说就算PHP-FPM工作进程因为内置的PHP7引擎发生故障,我估计也就工作进程会崩溃退出,而PHP-FPM的master进程会自动重启一个新的工作进程.
————————————————————————————————————————————————————

已加载插件:fastestmirror, refresh-packagekit, security
/var/run/yum.pid 已被锁定,PID 为 8085 的另一个程序正在运行。
另外一个程序锁定了 yum;等待它退出……
  The other application is: PackageKit
    Memory :  22 M RSS (328 MB VSZ)
    Started: Mon May  4 16:41:46 2015 - 00:09 ago
    State  : Uninterruptible, pid: 8085
另外一个程序锁定了 yum;等待它退出……
  The other application is: PackageKit
    Memory :  31 M RSS (339 MB VSZ)
    Started: Mon May  4 16:41:46 2015 - 00:11 ago
你怎么2个东西在跑,kill:


重复执行 install.sh

ps -ef | grep hhvm
service hhvm start

find . -name "hhvm"
./etc/rc.d/init.d/hhvm
./var/run/hhvm
./var/log/hhvm

如果说想配置nginx+hhvm,我用nginx+hhvm可以吧?
vhost.sh

最后,
mysql源码安装的是 mysql-server
mysql x86_64是客户端,别搞错。

还是有问题:
错误:Package: mysql-5.1.73-3.el6_5.x86_64 (base)
          Requires: libmysqlclient_r.so.16(libmysqlclient_16)(64bit)
          Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
              libmysqlclient_r.so.16(libmysqlclient_16)(64bit)
          已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
              Not found
错误:Package: mysql-devel-5.1.73-3.el6_5.x86_64 (base)
          Requires: libmysqlclient_r.so.16()(64bit)
          Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
              libmysqlclient_r.so.16()(64bit)
          已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
              Not found
错误:Package: mysql-5.1.73-3.el6_5.x86_64 (base)
          Requires: libmysqlclient.so.16()(64bit)
          Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
              libmysqlclient.so.16()(64bit)
          已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
              Not found
错误:Package: mysql-5.1.73-3.el6_5.x86_64 (base)
          Requires: libmysqlclient_r.so.16()(64bit)
          Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
              libmysqlclient_r.so.16()(64bit)
          已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
              Not found
错误:Package: mysql-5.1.73-3.el6_5.x86_64 (base)
          Requires: libmysqlclient.so.16(libmysqlclient_16)(64bit)
          Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
              libmysqlclient.so.16(libmysqlclient_16)(64bit)
          已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
              Not found
错误:Package: mysql-devel-5.1.73-3.el6_5.x86_64 (base)
          Requires: libmysqlclient.so.16()(64bit)
          Available: mysql-libs-5.1.73-3.el6_5.x86_64 (base)
              libmysqlclient.so.16()(64bit)
          已安装: mysql-libs-5.5.43-1.el6.remi.x86_64 (@remi)
              Not found
You could try using --skip-broken to work around the problem
问题在:
lnmp.org安装了mysql-
有可能不行 php 用的 mysql库 就有问题。

删除这个包就Ok了?mysql-libs-5.5.43-1.el6.remi.x86_64

Q:干嘛不用我的来安装 整套?
A:历史原因啊。
Q:删除两个?
rpm -e  mysql-libs-5.5.43-1.el6.remi.x86_64
rpm -e   mysql-5.5.43-1.el6.remi.x86_64

A:
rpm -e mysql-5.1.73-3.el6_5.x86_64  删掉

回家后实践,如下且成功:
rpm -qa |grep mysql
mysql-devel-5.5.43-1.el6.remi.x86_64
mysql-libs-5.5.43-1.el6.remi.x86_64
mysql-5.5.43-1.el6.remi.x86_64
实践是这样的:
rpm -e mysql-devel-5.5.43-1.el6.remi.x86_64
rpm -e mysql-5.5.43-1.el6.remi.x86_64      
rpm -e mysql-libs-5.5.43-1.el6.remi.x86_64

于是重新安装一次并重启:
./install.sh
________
ps aux|grep hhvm
www       3155 55.0  2.5 676320 150628 ?       R    22:56   0:09 /usr/bin/hhvm --mode server --user www --config /etc/hhvm/server.ini --config /etc/hhvm/php.ini --config /etc/hhvm/config.hdf


修改/usr/local/nginx/conf/nginx.conf使其中一段成为如下:

        location ~ .*\.(php|php5)?$  {
                #fastcgi_pass  unix:/data/runsock/php-cgi.sock;
                fastcgi_pass   unix:/data/runsock/hhvmsock/hhvm.sock;
                fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include        fastcgi_params;
                include        fastcgi_params;
                }
service nginx reload
详细配置看后面,安装就按上面安装得了。依赖太多,太麻烦了。

ps aux|grep hhvm  
www       3155  3.3  2.8 880828 172836 ?       Sl   23:23   0:22 /usr/bin/hhvm --mode server --user www --config /etc/hhvm/server.ini --config /etc/hhvm/php.ini --config /etc/hhvm/config.hdf
strace  -f -p 3155 //访问一下看有无输出,实践是有输出的。说明安装成功了。


CentOS7 hhvm交给supervisord管理了:
ps -ef | grep super supervisord 这个进程在吗?
service supervisord restart

最后解决,开机这个/var/run/hhvm 会不见了(CentOS7里估计是一个内存磁盘,重启就没了,导致启动失败。),呵,开机就创建好了:
创好是这样的: ls /var/run/hhvm/
hhvm.hhbc  pid  sock


配置hhvm
# vi /etc/hhvm/server.ini


vi /etc/hhvm/php.ini



一个www的hhvm去读取一个mysql.sock,
而我的sock是放在一个mysql的组目录下,如何实现无permission Denny的读取?
所以得注意权限,如下所示 :
[root@iZ25z0ugwgtZ runsock]# ll /data/runsock
drwxrwxrwx 2 www   www   4096 2月  17 17:30 hhvm
drwxrwxrwx 2 mysql mysql 4096 2月  17 17:28 mysqlsock
drwxrwxrwx 2 www   www   4096 2月  17 17:30 phpsock

因为hhvm是www运行,而mysql是mysql运行,这块hhvm去读取mysql的sock时, mysql这个sock上层目录是mysql,导致不能读取,于是得对mysql的这个sock进行777,chmod -R 777 /data/runsock/mysqlsock :
cd /data
chown -R www:www runsock hhvm logs
chmod -R 777 runsock hhvm logs

访问后是502,如下修改:
./jackxiang.conf:       fastcgi_pass   unix:/var/run/hhvm/sock;修改:
./jackxiang.conf:       fastcgi_pass   unix:/data/runsock/hhvmsock/hhvm.sock;

于是,就好了?没有,必须重启动nginx,而不是reload,
connect() to unix:/var/run/hhvm/sock failed (2: No such file or directory) while connecting to upstream, client: 106.37.79.53, server: jackxiang.com, request: "GET / HTTP/1.1", upstream: "fastcgi://unix:/var/run/hhvm/sock:", host: "jackxiang.com"

pkill -9 nginx //否则会出现还是找原来的sock:
../sbin/nginx
这样就不用前面的每次开机建立如下目录和赋权限:

centOs7.0也就可以使用hhvm了,性能用在wordpress上,结合前端nginx的cache插件相当不错~
———————————————————安装问题—————————————————————————
yum -y --nogpgcheck install hhvm 出现:
--> 处理依赖关系 libwebp.so.4()(64bit),它被软件包 hhvm-3.5.0-4.el6.x86_64 需要
--> 完成依赖关系计算
错误:Package: hhvm-3.5.0-4.el6.x86_64 (gleez)
          Requires: libwebp.so.4()(64bit)
You could try using --skip-broken to work around the problem

出现:
一)源码安装webp库:
先下载libwebp-0.3.0.tar.gz
tar -zxvf libwebp-0.3.0.tar.gz
cd libwebp-0.3.0
./configure && make && make install
cp /usr/local/lib/libwebp.so.4.0.2 /usr/lib64/
ln -s /usr/lib64/libwebp.so.4.0.2 /usr/lib64/libwebp.so.4
ln -s /usr/lib64/libwebp.so.4.0.2 /usr/lib64/libwebp.so

二)yum search libwebp :
libwebp-devel.i686 : Development files for libwebp, a library for the WebP format
libwebp-devel.x86_64 : Development files for libwebp, a library for the WebP format
libwebp-java.x86_64 : Java bindings for libwebp, a library for the WebP format
libwebp.i686 : Library and tools for the WebP graphics format
libwebp.x86_64 : Library and tools for the WebP graphics format
libwebp-tools.x86_64 : The WebP command line tools

处理依赖关系 libwebp.so.4()(64bit),它被软件包 hhvm-3.5.0-4.el6.x86_64 需要,于是:
root@119.10.6.23:~# ln -s /usr/lib64/libwebp.so /usr/lib64/libwebp.so.4
root@119.10.6.23:~# ls /usr/lib64/libwebp.so.4
/usr/lib64/libwebp.so.4
root@119.10.6.23:~# ls -lart  /usr/lib64/libwebp.so.4
lrwxrwxrwx 1 root root 21 4月  28 10:08 /usr/lib64/libwebp.so.4 -> /usr/lib64/libwebp.so

还缺一堆东西:
yum install libyaml.x86_64
yum install libyaml-devel.x86_64
yum install php-pecl-yaml.x86_64

yum install inotify-tools-devel.x86_64
yum install  boost-python.x86_64
yum install boost-random.x86_64
yum install mysql-libs.x86_64
软件包 boost-1.54.0-9.el6.x86_64.rpm 没有签名
rpm -e  boost-devel-1.41.0-25.el6.centos.x86_64
rpm -e boost-1.41.0-25.el6.centos.x86_64      




———————————————建议centos hhvm使用下面的安装脚本———————————————
这样直接就是最新的了hhvm3.4了
添加epel yum源
rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
安装hhvm所需要的依赖包
yum -y install libmcrypt-devel glog-devel jemalloc-devel tbb-devel libdwarf-devel mysql-devel \libxml2-devel libicu-devel pcre-devel gd-devel boost-devel sqlite-devel pam-devel \bzip2-devel oniguruma-devel openldap-devel readline-devel libc-client-devel libcap-devel \libevent-devel libcurl-devel libmemcached-devel
添加gleez yum源(官方地址被墙)
rpm -Uvh http://blog.linuxeye.com/wp-content/uploads/2014/05/gleez-repo-6-0.el6.noarch.rpm
添加remi yum源
rpm -Uvh http://rpms.famillecollet.com/enterprise/6/remi/x86_64/remi-release-6.5-1.el6.remi.noarch.rpm
从remi安装hhvm依赖包
yum -y --enablerepo=remi install libwebp mysql mysql-devel mysql-lib
安装hhvm
yum -y --nogpgcheck install hhvm
查看hhvm版本号
hhvm --versionHipHop VM 3.4.0-dev+2014.09.29 (rel)Compiler: heads/master-0-gfe70efe4efa8318536ea1d4940362e83e641d905Repo schema: e3bee358a000cf7efe3a0f9642cdc9b488963dcaExtension API: 20140829脚本来自:http://blog.linuxeye.com/


CentOS 7下hhvm Nginx环境搭建:
http://www.linuxeye.com/Linux/2029.html
———————————————————安装步骤—————————————————————————
一、CentOS 6.5 32位安装 HHVM:
安装:
yum -y install http://ftp.riken.jp/Linux/fedora/epel/6/i386/epel-release-6-8.noarch.rpm
cd /etc/yum.repos.d
wget http://www.hop5.in/yum/el6/hop5.repo
yum clean all
yum install hhvm
可能遇到的问题:
1.hhvm: error while loading shared libraries: liblcms2.so.2: cannot open shared object file: No such file or directory

yum install http://pkgrepo.linuxtech.net/el6/release/x86_64/liblcms2-2.4-1.el6.x86_64.rpm
2.其他相关文章
http://blog.csdn.net/ownfire/article/details/41366995
http://blog.linuxeye.com/396.html
http://blog.csdn.net/lxlmj/article/details/22283043


二、64位安装HHVM包:
安装hhvm
添加epel yum源

rpm -Uvh http://mirrors.ustc.edu.cn/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
安装hhvm所需要的依赖包

yum -y install libmcrypt-devel glog-devel jemalloc-devel tbb-devel libdwarf-devel mysql-devel \
libxml2-devel libicu-devel pcre-devel gd-devel boost-devel sqlite-devel pam-devel \
bzip2-devel oniguruma-devel openldap-devel readline-devel libc-client-devel libcap-devel \
libevent-devel libcurl-devel libmemcached-devel
添加gleez yum源(官方地址被墙)

rpm -Uvh http://blog.linuxeye.com/wp-content/uploads/2014/05/gleez-repo-6-0.el6.noarch.rpm
添加remi yum源

rpm -Uvh http://rpms.famillecollet.com/enterprise/6/remi/x86_64/remi-release-6.5-1.el6.remi.noarch.rpm
从remi安装hhvm依赖包

yum -y --enablerepo=remi install libwebp mysql mysql-devel mysql-lib
安装hhvm

yum -y --nogpgcheck install hhvm
查看hhvm版本号

hhvm --version
HipHop VM 3.4.0-dev+2014.09.29 (rel)
Compiler: heads/master-0-gfe70efe4efa8318536ea1d4940362e83e641d905
Repo schema: e3bee358a000cf7efe3a0f9642cdc9b488963dca
Extension API: 20140829
3. 配置hhvm
删除安装hhvm时创建的nginx用户

userdel -r nginx
修改hhvm目录权限为www

chown -R www.www /var/run/hhvm
chown -R www.www /var/log/hhvm
修改/usr/local/nginx/conf/nginx.conf使其中一段成为如下:

        location ~ .*\.(php|php5)?$  {
                fastcgi_pass   unix:/var/run/hhvm/sock;
                fastcgi_index  index.php;
                fastcgi_param  SCRIPT_FILENAME $document_root$fastcgi_script_name;
                include        fastcgi_params;
                }
service nginx reload
下载支持hhvm方式添加虚拟主机脚本 vhost_hhvm.sh

cd lnmp
wget http://blog.linuxeye.com/wp-content/uploads/2014/05/vhost_hhvm.sh
chmod +x vhost_hhvm.sh
配置hhvm修改/etc/hhvm/config.hdf,保持如下:

ResourceLimit {
  CoreFileSize = 0          # in bytes
  MaxSocket = 10000         # must be not 0, otherwise HHVM will not start
  SocketDefaultTimeout = 5  # in seconds
  MaxRSS = 0
  MaxRSSPollingCycle = 0    # in seconds, how often to check max memory
  DropCacheCycle = 0        # in seconds, how often to drop disk cache
}

Log {
  Level = Info
  AlwaysLogUnhandledExceptions = true
  RuntimeErrorReportingLevel = 8191
  UseLogFile = true
  UseSyslog = false
  File = /data/logs/hhvm/error.log
  Access {
    * {
      File = /data/logs/hhvm/access.log
      Format = %h %l %u % t \"%r\" %>s %b
    }
  }
}

MySQL {
  ReadOnly = false
  ConnectTimeout = 1000      # in ms
  ReadTimeout = 1000         # in ms
  SlowQueryThreshold = 1000  # in ms, log slow queries as errors
  KillOnTimeout = false
}

Mail {
  SendmailPath = /usr/sbin/sendmail -t -i
  ForceExtraParameters =
}
配置hhvm修改/etc/hhvm/server.ini,使内容保存如下:

; php options
pid = /var/run/hhvm/pid

; hhvm specific
;hhvm.server.port = 9001
hhvm.server.file_socket = /var/run/hhvm/sock
hhvm.server.type = fastcgi
hhvm.server.default_document = index.php
hhvm.log.use_log_file = true
hhvm.log.file = /var/log/hhvm/error.log
hhvm.repo.central.path = /var/run/hhvm/hhvm.hhbc
修改/etc/hhvm/php.ini,使内容保存如下:

hhvm.mysql.socket = /tmp/mysql.sock ;指定mysql.sock路径(hhvm默认路径sock路径是/var/lib/mysql/mysql.sock)
expose_php = 0 ;关闭头信息X-Powered-By (和hhvm.server.expose_hphp = false作用一样)
memory_limit = 400M
post_max_size = 50M
默认hhvm不提供php中类似disable_functions参数,如何禁用hhvm中shell_exec函数?(可选)
在/etc/hhvm/php.ini中追加如下:

hhvm.jit_enable_rename_function=true
auto_prepend_file= /home/wwwroot/default/disable_functions
新建/home/wwwroot/default/disable_functions,使该文件内容如下:

<?php

function __forbidden_function($name, $obj, $args, $data, &$done) {
  throw new Exception('Calling '.$name.' is forbidden.');
}

fb_intercept('shell_exec', '__forbidden_function');
配置service管理hhvm:

cd /etc/init.d/
rm -rf hhvm #官方默认脚本是以www运行,建议用我修改后的
wget http://blog.linuxeye.com/wp-content/uploads/2014/05/hhvm
chmod +x hhvm
chkconfig hhvm on
service hhvm restart


管理hhvm服务
systemctl enable hhvm #开机自启动
systemctl start hhvm #启动hhvm
systemctl stop hhvm #停止hhvm
systemctl restart hhvm #重启动hhvm
systemctl status hhvm #查看hhvm状态

添加虚拟主机:
vhost_hhvm.sh #和lnmp添加虚拟主机一样
测试wordpress完美运行,且速度非常快;discuz后台正常,前台页面显示有点问题
参考:https://github.com/facebook/hhvm/wiki/HHVM-Pre-built-packages-for-Centos-6.5

安装时,这个rpm包是有很多的依赖:
因为依赖关系问题而跳过的软件包:
    OpenEXR-libs-1.6.1-8.1.el6.x86_64 来自 base
    boost-1.54.0-9.el6.x86_64 来自 gleez
    boost-atomic-1.54.0-9.el6.x86_64 来自 gleez
    boost-chrono-1.54.0-9.el6.x86_64 来自 gleez
    boost-context-1.54.0-9.el6.x86_64 来自 gleez
    boost-date-time-1.54.0-9.el6.x86_64 来自 gleez
    boost-devel-1.54.0-9.el6.x86_64 来自 gleez
    boost-filesystem-1.54.0-9.el6.x86_64 来自 gleez
    boost-graph-1.54.0-9.el6.x86_64 来自 gleez
    boost-iostreams-1.54.0-9.el6.x86_64 来自 gleez
    boost-locale-1.54.0-9.el6.x86_64 来自 gleez
    boost-log-1.54.0-9.el6.x86_64 来自 gleez
    boost-math-1.54.0-9.el6.x86_64 来自 gleez
    boost-program-options-1.54.0-9.el6.x86_64 来自 gleez
    boost-python-1.54.0-9.el6.x86_64 来自 gleez
    boost-random-1.54.0-9.el6.x86_64 来自 gleez
    boost-regex-1.54.0-9.el6.x86_64 来自 gleez
    boost-serialization-1.54.0-9.el6.x86_64 来自 gleez
    boost-signals-1.54.0-9.el6.x86_64 来自 gleez
    boost-system-1.54.0-9.el6.x86_64 来自 gleez
    boost-test-1.54.0-9.el6.x86_64 来自 gleez
    boost-thread-1.54.0-9.el6.x86_64 来自 gleez
    boost-timer-1.54.0-9.el6.x86_64 来自 gleez
    boost-wave-1.54.0-9.el6.x86_64 来自 gleez
    hhvm-3.5.0-4.el6.x86_64 来自 gleez
    ilmbase-1.0.1-6.1.el6.x86_64 来自 base
    inotify-tools-3.14-1.el6.x86_64 来自 epel
    lcms2-2.3-2.el6.x86_64 来自 epel
    libvpx-1.3.0-5.el6_5.x86_64 来自 base
    libyaml-0.1.3-4.el6_6.x86_64 来自 updates


yum install boost-1.54.0-9.el6.x86_64

源码安装:http://tomlog.com/tech/2012/12/21/build-hhvm.html


安装脚本:http://amh.sh/bbs/post-4874-1-1.htm
背景:今天看自己的vps机器的PHP目录下有php -i|grep cookie_path  是session.cookie_path => / => / ,在目录:/usr/local/php/var/session 里有很多session文件,可一看配置: php -i|grep save_path  session.save_path => no value => no value ,于是有一问:
___________________________________________________________________________
session.cookie_path 与session.save_path 有什么区别?
————————————————————————————
有区别
session.save_path 是保存session的路径
session.cookie_path 指定了要session会话 cookie 的有效路径   可查看setcookie第四参数关于cookie有效路径设置相关信息

session ID通过cookie传递时 .. 要创建cookie, session.cookie_path就是设置默认的cookie有效路径

平时的cookie创建如 setcookie ("Test", "12345", time()+3600, "/wwwroot/abc/", ".example.com", 1 ); "/wwwroot/abc/" 就是该cookie只在此路径下有效

由于session创建cookie并没有调用setcookie, 所以创建cookie的所需参数先在ini里的session.cookie .. 进行设置 ..

摘自:http://bbs.phpchina.com/thread-167626-1-1.html

——————————————————————————————————————————————————
后面,我把位置给修改了:
/data/session
session.save_path = "/data/session"

service  php-fpm restart
Gracefully shutting down php-fpm .. done

php -i|grep session.save_path
session.save_path => /data/session => /data/session

背景:深入剖析PHP输入流 php://input ,文章Url:http://www.nowamagic.net/academy/detail/12220520 ,提到ngrep抓包,以前都是tcpdump,这个小工具有点意思,于是查了下,试着安装下Ngrep试一试。

一、使用说明:
如果要分析网络数据包,我们有Wireshark,它有着上千种设定、过滤器以及配置选项。它还有一个命令行版本Tshark。如果只是针对简单的任务,我觉得Wireshark就太重量级了,所以除非我需要更强大的功能,一般情况下就用ngrep来处理了。Ngrep可以让你像类似grep处理文件的方式来处理网络封包。

针对Web流量,你几乎总是想要加上-W byline选项,这会保留换行符,而-q选项可以抑制某些非匹配数据包而产生的输出。下面是一个抓取所有包含有GET或POST请求数据包的例子:

ngrep –q –W byline “^(GET|POST) .*”
你也可以传入附加的报文过滤选项,比如限制匹配的报文只针对某个特定的主机,IP或端口。这里我们把所有流经Google的流量做一个过滤,只针对80端口且报文中包含“search”。

ngrep –q –W byline “search” host www.google.com and port 80

摘处:
http://www.csdn.net/article/2012-11-15/2811906-practical-command-line-tools

二、Solaris安装ngrep:
使用ngrep监控网络接口
  ngrep 是grep(在文本中搜索字符串的工具)的网络版,他力求更多的grep特征,用于搜寻指定的数据包。正由于安装ngrep需用到libpcap库, 所以支持大量的操作系统和网络协议。它当前认可 IPv4/6, TCP, UDP, ICMPv4/6, IGMP和原始交叉以太网, PPP, SLIP, FDDI, 令牌网和空端口,并以与更为普遍的分组过滤工具相同的方式了解BPF过滤逻辑,例如tcpdump和snoop。
  FreeBSD下载和安装:
      #wget ftp://ftp.sunfreeware.com/pub/freeware/intel/10/ngrep-1.45-sol10-x86-local.gz
  #gunzip ngrep-1.45-sol10-x86-local.gz
  #pkgadd ngrep-1.45-sol10-x86-local

ngrep的安装就是configure/make/make install 三部曲。
configure时是遇到please wipe out all unused pcap installations
./configure --with-pcap-includes=/usr/local/include/pcap
在安装后输入ngrep来验证下安装是否成功。
  首先看看ngrep的参数,这里只介绍主要选项。
  -q 静默模式,如果没有此开关,未匹配的数据包都以“#”显示
  -e 显示空数据包
  -i 忽略大小写
  -v 反转匹配
  -x 以16进制格式显示
  -X 以16进制格式匹配
  -w 整字匹配
  -p 不使用混杂模式
  -t 在每个匹配的包之前显示时间戳
  -T 显示上一个匹配的数据包之间的时间间隔
  -M 仅进行单行匹配
  -I 从文件中读取数据进行匹配
  -O 将匹配的数据保存到文件
  -n 仅捕获指定数目的数据包进行查看
  -A 匹配到数据包后Dump随后的指定数目的数据包
  -W 设置显示格式byline将解析包中的换行符
  -c 强制显示列的宽度
  -F 使用文件中定义的bpf(Berkeley Packet Filter)
  -N 显示由IANA定义的子协议号
  -d 使用哪个网卡,可以用-L选项查询
  -L 查询网卡接口
  图 6 是没有参数的ngerp的输出界面。
  ngrep命令输出
                                               图6 ngrep命令输出
  下面我们看两个复杂一些的例子,使用命令:
ngrep -qd pcn0 ‘IT专家网’ tcp port 80
  这个命令让ngrep 为TCP报文监控pcn0的80接口,并且只包括“IT专家网”字符串。 这样就可以获得所有该子网中使用访问IT专家网的相关信息。
  另外一个命令:
ngrep -qd pcn0 ‘USER|PASS’ tcp port 21
  这个命令让ngrep 为TCP报文监控pcn0的21接口,并且只包括“user和pass”字符串。我们知道21端口是用来进行FTP连接的端口。 这样就可以获得用于FTP连接的用户名称和密码。

来自:http://security.ctocio.com.cn/tips/30/8196030_4.shtml



三、linux下的ngrep 安装使用:
1  安装libpcap
下载地址   http://www.tcpdump.org/#latest-release
解压                    
tar -zxvf libpcap-1.4.0.tar.gz
进入目录
cd  libpcap-1.4.0
./configure
make
make install

yum install libpcap-devel.x86_64

2  安装ngrep
下载地址
git clone git://git.code.sf.net/p/ngrep/code ngrep-code
Http的:
http://pkgs.fedoraproject.org/repo/pkgs/ngrep/ngrep-code-16ba99a863a89dab25cbf8e9ca410b19a7494c42.zip/a58321bda277a741dc94020a4484bcb6/

进入目录
cd ngrep-code
./configure --with-pcap-includes=/usr/local/include/pcap
make
make install

摘自:http://blog.csdn.net/zljjava/article/details/38046595
        

四、rpm安装:
CentOS:
先用yum install libpcap完全安装libpcap,注意有时候用libpcap安装包安装的不完整会影响ngrep的使用。
如果yum无法安装就用以下步骤安装libpcap
wget http://www.tcpdump.org/release/libpcap-1.3.0.tar.gz
tar -zxf libpcap-1.3.0.tar.gz
cd libpcap-1.3.0
./configure
make && make install

ngrep的安装就是configure/make/make install 三部曲。
configure时是遇到please wipe out all unused pcap installations
./configure --with-pcap-includes=/usr/local/include/pcap
在安装后输入ngrep来验证下安装是否成功。

我也遇到了:
Configuring Network Grep (ngrep) ...
checking for a complete set of pcap headers...
more than one set found in:
/usr/local/include
/usr/local/include/pcap
please wipe out all unused pcap installations
[root@test ngrep-code-16ba99a863a89dab25cbf8e9ca410b19a7494c42]# make

配置时加上路径参数:
./configure --with-pcap-includes=/usr/local/include/pcap
编译:
[root@test ngrep-code-16ba99a863a89dab25cbf8e9ca410b19a7494c42]# make
make  -C regex-0.12 regex.o
make[1]: Entering directory `/home/xiangdong/software/ngrep/ngrep-code-16ba99a863a89dab25cbf8e9ca410b19a7494c42/regex-0.12'
gcc -g  -DSTDC_HEADERS=1 -DHAVE_STRING_H=1 -DHAVE_ALLOCA_H=1 -DHAVE_ALLOCA=1  -I. -I. -c regex.c
make[1]: Leaving directory `/home/xiangdong/software/ngrep/ngrep-code-16ba99a863a89dab25cbf8e9ca410b19a7494c42/regex-0.12'
gcc  -DHAVE_CONFIG_H -DLINUX  -D_BSD_SOURCE=1 -D__FAVOR_BSD=1  -Iregex-0.12 -I/usr/local/include/pcap  -I.  -g -c ngrep.c
gcc  -s -o ngrep ngrep.o  regex-0.12/regex.o -L/usr/local/include/lib -lpcap  
安装:
[root@test ngrep-code-16ba99a863a89dab25cbf8e9ca410b19a7494c42]# make install
./install-sh -c -m 0755 ngrep  //usr/local/bin/ngrep
./install-sh -c -m 0644 ngrep.8 //usr/local/share/man/man8/ngrep.8

安装参考:http://blog.sina.com.cn/s/blog_4d14fb2b01012tqo.html

五、使用方法:
我经常使用的:
ngrep -W byline -d eth0 port 80
捕捉cloudian:18080端口的request和response。-W byline用来解析包中的换行符,否则包里的所有数据都是连续的,可读性差。-d lo是监听本地网卡
ngrep -W byline -d eth0 port 80
捕捉amazon:80端口的request和response。-d eth0 是用来监听对外的网卡

可以用-d any来捕捉所有的包,这个很管用。
ngrep '[a-zA-Z]' -t -W byline -d any tcp port 80


实践如下:



背景:这块明说是HHVM,其实不如说是PHP运行的一个机制及于C实现的一个性能差别及内存占用的对比原因分析。
http://www.csdn.net/article/2014-12-25/2823234

摘录:
对于“弱类型”的批评观点大致如下:

    在“严谨”的语言中,通常是预先定义好一个变量的类型,自始至终,变量的类型是固定的,使用范围也是固定。而PHP的变量,通常我们只能看见它名字,类型大部分都不可以预先定义,并且还可以随意改变。(内存分配不好管理)
    为了兼容弱类型特性,PHP需要实现大量兼容代码,包括类型判断、类型转换、存储方式等,增加了语言内部的复杂度。(执行效率低下)
    变量的类型是不可控的,在执行过程中存在大量的“隐性类型转换”,容易产生不可预知的结果。(这里的确需要强调,PHP的类型转换是个必须掌握的点,各种类型的互相转换的可能会产生很多问题,尤其是初学PHP的同学哈)

他们认为,这些都不符合“所见即所得”的简单性,而语法严谨的语言更高效率,也更容易“理解”。

受到类似批评的还有Javascript等语言,因为它在这个问题上的表现是一样的。但是,一门语言最终被大规模使用,必然有它们的道理。PHP成为Web服务开发的首选脚本语言,Javascript则直接称霸Web前端领域,能走到这一步都不可能是偶然因素,开发者们用脚投票选择了它们。编程语言是人类和机器沟通的桥梁,终极追求是实现“人人皆可编程”的宏伟目标。

——————————————————————————————————————————————————————————————————————————
http://liuzhichao.com/p/1909.html
分页: 6/24 第一页 上页 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 下页 最后页 [ 显示模式: 摘要 | 列表 ]