php __call()方法实现数据库连贯操作
Php/Js/Shell/Go jackxiang 2016-3-8 11:11
背景:对的jquery有一种叫链式操作的dom的,而PHP在写sql时也可以使用类似的方法,如:
这种写法有点类似Jquery的链式写法,如下:
__call函数相关介绍:http://jackxiang.com/post/2834/
=================================================
使用__call()方法来实现数据库连贯操作
---------- 调试PHP ----------
SELECT sex, count(sex) FROM user where sex in ("男","女") group by sex
having avg(age) > 25
Output completed (0 sec consumed) - Normal Termination
来自:http://blog.sina.com.cn/s/blog_6109978501017154.html
这种写法有点类似Jquery的链式写法,如下:
__call函数相关介绍:http://jackxiang.com/post/2834/
=================================================
使用__call()方法来实现数据库连贯操作
---------- 调试PHP ----------
SELECT sex, count(sex) FROM user where sex in ("男","女") group by sex
having avg(age) > 25
Output completed (0 sec consumed) - Normal Termination
来自:http://blog.sina.com.cn/s/blog_6109978501017154.html
PHP提示Notice: Undefined variable的解决办法,Warning: Missing argument 1 for function,warning: Missing argument 2 for variable_get()。
Php/Js/Shell/Go jackxiang 2016-3-1 23:05
问题一:
在测试PHP代码的过程中,会遇到这样的问题:PHP提示Notice: Undefined variable,遇到这样的问题很纠结,但是很容易解决。
今天晚上,我就遇到了这样的问题,到网上搜索了很多解决方法,整理如下,仅供参考,同时再次感谢网上各位大牛给大家提供的各式各样的方法!
PHP默认的配置会报这个错误,虽然有利于发现错误,但同时字现实实践中会出现很多问题。
解决方法如下:
一、修改php.ini配置文件
error_reporting设置:
找到error_reporting = E_ALL
修改为error_reporting = E_ALL & ~E_NOTICE
error_reporting(E_ALL ^ E_DEPRECATED ^ E_NOTICE);//解决Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future
原理是:减弱PHP的敏感程度,使其遇到这种问题不报错。
二、在文件的php的头部加入一下代码:
ini_set("error_reporting","E_ALL & ~E_NOTICE");
同样也可以解决问题。
三、参考一下这篇文章:
《当遇到:Notice …Undefined variable…》
网址是:http://www.phpiask.com/?p=276
来自:http://blog.csdn.net/chenyanggo/article/details/7430383
问题二:
遇到Warning: Missing argument 1 for checkLogin(), called in C:\wamp\www\library222\admin\main.php on line 4 and defined in C:\wamp\www\library222\admin\inc\conn.php on line 51
/***********************************************************************/
//检查管理员是否登录
function checkLogin($id)
{
session_start();
if(!isset($_SESSION['sid']))
{
echo "<script language='javascript'>alert('请先登录!');parent.location.href='index.php';</script>";
}
if($id==0)return;
}
?>
调用函数checkLogin的时候少了参数。
稍微改下:
function checkLogin($id = 0){
...
}
来自:http://zhidao.baidu.com/link?url=wddMxfPvxDPCMFGo-uc5kRc2gflkJgofmKutyj1A2d4fc_6B566BjWftMvRpeQvAgjhR6Guznz1BfLa2uH8_Qi0P53TyIto_GeDYYe81Slq
来自:http://www.thinkindrupal.com/node/495
在测试PHP代码的过程中,会遇到这样的问题:PHP提示Notice: Undefined variable,遇到这样的问题很纠结,但是很容易解决。
今天晚上,我就遇到了这样的问题,到网上搜索了很多解决方法,整理如下,仅供参考,同时再次感谢网上各位大牛给大家提供的各式各样的方法!
PHP默认的配置会报这个错误,虽然有利于发现错误,但同时字现实实践中会出现很多问题。
解决方法如下:
一、修改php.ini配置文件
error_reporting设置:
找到error_reporting = E_ALL
修改为error_reporting = E_ALL & ~E_NOTICE
error_reporting(E_ALL ^ E_DEPRECATED ^ E_NOTICE);//解决Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future
原理是:减弱PHP的敏感程度,使其遇到这种问题不报错。
二、在文件的php的头部加入一下代码:
ini_set("error_reporting","E_ALL & ~E_NOTICE");
同样也可以解决问题。
三、参考一下这篇文章:
《当遇到:Notice …Undefined variable…》
网址是:http://www.phpiask.com/?p=276
来自:http://blog.csdn.net/chenyanggo/article/details/7430383
问题二:
遇到Warning: Missing argument 1 for checkLogin(), called in C:\wamp\www\library222\admin\main.php on line 4 and defined in C:\wamp\www\library222\admin\inc\conn.php on line 51
/***********************************************************************/
//检查管理员是否登录
function checkLogin($id)
{
session_start();
if(!isset($_SESSION['sid']))
{
echo "<script language='javascript'>alert('请先登录!');parent.location.href='index.php';</script>";
}
if($id==0)return;
}
?>
调用函数checkLogin的时候少了参数。
稍微改下:
function checkLogin($id = 0){
...
}
来自:http://zhidao.baidu.com/link?url=wddMxfPvxDPCMFGo-uc5kRc2gflkJgofmKutyj1A2d4fc_6B566BjWftMvRpeQvAgjhR6Guznz1BfLa2uH8_Qi0P53TyIto_GeDYYe81Slq
来自:http://www.thinkindrupal.com/node/495
html select美化模拟jquery插件select2.js
Php/Js/Shell/Go jackxiang 2016-3-1 13:33
背景:像下拉这样的控件,有jQuery 插件autocomplete ,现在出来一个select2.js。
select2.js是一个html select美化模拟类jquery插件,但是select2.js又远非简单的模拟美化那么简单,它还具有搜索功能,多选功能(可限制选择数量),ajax方式加载数据,可以设置placeholder,
可以设置禁用状态disabled,并且设置非常简单,如:$(".js-example-disabled").prop("disabled", false);
select2.js默认值设置:$("#select2").val("1").trigger("change"); 多选的默认值可以使用$("#select2").val(["1","2"]).trigger("change"); 这样传递数组过去。
select2还有丰富的自定义事件
$("#select2").on("select2:open", function (e) { log("select2:open", e); });
$("#select2").on("select2:close", function (e) { log("select2:close", e); });
$("#select2").on("select2:select", function (e) { log("select2:select", e); });
$("#select2").on("select2:unselect", function (e) { log("select2:unselect", e); });
$("#select2").on("change", function (e) { log("change"); });
更多丰富的select2用法请参考https://select2.github.io/examples.html,懒人建站也会在稍后给出实际应用中的一些例子,和一些方便调用的小花招。
select2小花招:自己定义当前选中的selected值,我们在select2的节点上给出一个<select class="test1" data-selected="2"> 看红色部分,然后我们就可以在设置选中值得时候就可以使用如下js代码,
$("#select2").val(function(){
return $(this).data("selected")
}).trigger("change");
利用val()接收一个函数,而且可以利用 this
本文链接:html select美化模拟jquery插件select2.js
http://www.51xuediannao.com/js/jquery/select2.html
select2.js是一个html select美化模拟类jquery插件,但是select2.js又远非简单的模拟美化那么简单,它还具有搜索功能,多选功能(可限制选择数量),ajax方式加载数据,可以设置placeholder,
可以设置禁用状态disabled,并且设置非常简单,如:$(".js-example-disabled").prop("disabled", false);
select2.js默认值设置:$("#select2").val("1").trigger("change"); 多选的默认值可以使用$("#select2").val(["1","2"]).trigger("change"); 这样传递数组过去。
select2还有丰富的自定义事件
$("#select2").on("select2:open", function (e) { log("select2:open", e); });
$("#select2").on("select2:close", function (e) { log("select2:close", e); });
$("#select2").on("select2:select", function (e) { log("select2:select", e); });
$("#select2").on("select2:unselect", function (e) { log("select2:unselect", e); });
$("#select2").on("change", function (e) { log("change"); });
更多丰富的select2用法请参考https://select2.github.io/examples.html,懒人建站也会在稍后给出实际应用中的一些例子,和一些方便调用的小花招。
select2小花招:自己定义当前选中的selected值,我们在select2的节点上给出一个<select class="test1" data-selected="2"> 看红色部分,然后我们就可以在设置选中值得时候就可以使用如下js代码,
$("#select2").val(function(){
return $(this).data("selected")
}).trigger("change");
利用val()接收一个函数,而且可以利用 this
本文链接:html select美化模拟jquery插件select2.js
http://www.51xuediannao.com/js/jquery/select2.html
hhvm在百度的smarty里渲染工作上的确有所较大提升。
Php/Js/Shell/Go jackxiang 2016-3-1 09:39
对于cpu密集型运算,PHP看来还是在性能上需要提高,解释性语音还是和编译性的c或c++不在一个层面上,hhvm用在smarty和WordPress上提升明显:
http://ju.outofmemory.cn/entry/105151
rango也写了一个博文作了一下比较,较为客观:
http://rango.swoole.com/archives/291
http://ju.outofmemory.cn/entry/105151
rango也写了一个博文作了一下比较,较为客观:
http://rango.swoole.com/archives/291
背景:今天在swoole群里贴了一个nodejs和swoole的形象区别,于是出现了两派互相不服的文字争论,nodejs高大上的部署方式-PM2和swoole自带的一个辩论。
下面3点摘自:http://blog.csdn.net/leftfist/article/details/41891407
1)CPU密集型任务存在短板
如上所述,nodejs的机制是单线程,这个线程里面,有一个事件循环机制,处理所有的请求。如图所示。在事件处理过程中,它会智能地将一些涉及到IO、网络通信等耗时比较长的操作,交由worker threads去执行,执行完了再回调,这就是所谓的异步IO非阻塞吧。但是,那些非IO操作,只用CPU计算的操作,它就自己扛了,比如算什么斐波那契数列之类。它是单线程,这些自己扛的任务要一个接着一个地完成,前面那个没完成,后面的只能干等。因此,对CPU要求比较高的CPU密集型任务多的话,就有可能会造成号称高性能,适合高并发的node.js服务器反应缓慢。结论是:NodeJS适合运用在高并发、I/O密集、少量业务逻辑的场景。
2)无法利用CPU的多核
最开始,线程只是用于分配单个处理器处理时间的一种机制。但假如操作系统本身支持多个CPU/内核,那么每个线程都可以得到一个不同自己的CPU/内核,实现真正的“并行运算”。在这种情况下,多线程程序可以提高资源使用效率。Node.js是单线程程序,它只有一个event loop,也只占用一个CPU/内核。现在大部分服务器都是多CPU或多核的,当Node.js程序的event loop被CPU密集型的任务占用,导致有其它任务被阻塞时,却还有CPU/内核处于闲置的状态,造成资源的浪费。
解决方案
利用原生模块或第三方模块,开辟进程或子进程,用于处理这些特殊的任务。
3)如果有异常抛出,因为是单线程,整个项目将不可用。但这归根到底是代码的问题,糟糕的代码,不管什么体系,都会有问题,即使不崩溃。解决办法是用pm2等工具来运行?
说到密集型计算:其实PHP也好不到哪儿去,这块还得c和c++,解释性的语言对于密集型计算都好不到哪去,这块即使是nginx也可能出现事件队列出现阻塞的情况,(见:http://jackxiang.com/post/8433/):
nodejs的机制是单线程,这个线程里面,有一个事件循环机制,处理所有的请求。如图所示。在事件处理过程中,它会智能地将一些涉及到IO、网络通信等耗时比较长的操作,交由worker threads去执行,执行完了再回调,这就是所谓的异步IO非阻塞吧。但是,那些非IO操作,只用CPU计算的操作,它就自己扛了,比如算什么斐波那契数列之类。它是单线程,这些自己扛的任务要一个接着一个地完成,前面那个没完成,后面的只能干等。因此,对CPU要求比较高的CPU密集型任务多的话,就有可能会造成号称高性能,适合高并发的node.js服务器反应缓慢。
=======================================================================================
附录,对话记录,QQ及Email均*替代,保留昵称:
回忆未来-向东-Jàck(********7693) 15:48:05
作为顾问,必须把这个swoole形象化,
swoole解决了nodejs的这样一个问题:
无聊咔咔(*******) 15:51:47
用swoole就不用部署啊阅读全文
下面3点摘自:http://blog.csdn.net/leftfist/article/details/41891407
1)CPU密集型任务存在短板
如上所述,nodejs的机制是单线程,这个线程里面,有一个事件循环机制,处理所有的请求。如图所示。在事件处理过程中,它会智能地将一些涉及到IO、网络通信等耗时比较长的操作,交由worker threads去执行,执行完了再回调,这就是所谓的异步IO非阻塞吧。但是,那些非IO操作,只用CPU计算的操作,它就自己扛了,比如算什么斐波那契数列之类。它是单线程,这些自己扛的任务要一个接着一个地完成,前面那个没完成,后面的只能干等。因此,对CPU要求比较高的CPU密集型任务多的话,就有可能会造成号称高性能,适合高并发的node.js服务器反应缓慢。结论是:NodeJS适合运用在高并发、I/O密集、少量业务逻辑的场景。
2)无法利用CPU的多核
最开始,线程只是用于分配单个处理器处理时间的一种机制。但假如操作系统本身支持多个CPU/内核,那么每个线程都可以得到一个不同自己的CPU/内核,实现真正的“并行运算”。在这种情况下,多线程程序可以提高资源使用效率。Node.js是单线程程序,它只有一个event loop,也只占用一个CPU/内核。现在大部分服务器都是多CPU或多核的,当Node.js程序的event loop被CPU密集型的任务占用,导致有其它任务被阻塞时,却还有CPU/内核处于闲置的状态,造成资源的浪费。
解决方案
利用原生模块或第三方模块,开辟进程或子进程,用于处理这些特殊的任务。
3)如果有异常抛出,因为是单线程,整个项目将不可用。但这归根到底是代码的问题,糟糕的代码,不管什么体系,都会有问题,即使不崩溃。解决办法是用pm2等工具来运行?
说到密集型计算:其实PHP也好不到哪儿去,这块还得c和c++,解释性的语言对于密集型计算都好不到哪去,这块即使是nginx也可能出现事件队列出现阻塞的情况,(见:http://jackxiang.com/post/8433/):
nodejs的机制是单线程,这个线程里面,有一个事件循环机制,处理所有的请求。如图所示。在事件处理过程中,它会智能地将一些涉及到IO、网络通信等耗时比较长的操作,交由worker threads去执行,执行完了再回调,这就是所谓的异步IO非阻塞吧。但是,那些非IO操作,只用CPU计算的操作,它就自己扛了,比如算什么斐波那契数列之类。它是单线程,这些自己扛的任务要一个接着一个地完成,前面那个没完成,后面的只能干等。因此,对CPU要求比较高的CPU密集型任务多的话,就有可能会造成号称高性能,适合高并发的node.js服务器反应缓慢。
=======================================================================================
附录,对话记录,QQ及Email均*替代,保留昵称:
回忆未来-向东-Jàck(********7693) 15:48:05
作为顾问,必须把这个swoole形象化,
swoole解决了nodejs的这样一个问题:
无聊咔咔(*******) 15:51:47
用swoole就不用部署啊阅读全文
[遇到问题]解决 recv() failed (104: Connection reset by peer) while reading response header from upstream
Php/Js/Shell/Go jackxiang 2016-2-16 16:31
问题如下:
2016/02/16 16:29:05 [error] 11925#0: *50 recv() failed (104: Connection reset by peer) while reading response header from upstream
解决办法:
Nginx出现502 Bad Gateway 错误,
查了Nginx的错误日志为:
2014/08/02 16:14:31 [error] 17029#0: *17941 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 210.61.12.2, server: blog.lixiphp.com, request: “POST /api/1.0 HTTP/1.1″, upstream: “fastcgi://127.0.0.1:9000″, host: “blog.lixiphp.com”2014/08/02 16:24:52 [error] 29615#0: *3 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 58.220.197.35, server: blog.lixiphp.com, request: “GET /404 HTTP/1.1″, upstream: “fastcgi://127.0.0.1:9000″, host: “blog.lixiphp.com”
不要使用php-fpm的request_terminate_timeout,最好设成request_terminate_timeout=0;
vi /etc/php-fpm.d/www.conf
修改为:
; The timeout for serving a single request after which the worker process will
; be killed. This option should be used when the ‘max_execution_time’ ini option
; does not stop script execution for some reason. A value of ’0′ means ‘off’.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
request_terminate_timeout = 0
因为这个参数会直接杀掉php进程,然后重启php进程,这样前端nginx就会返回104: Connection reset by peer。这个过程是很慢,总体感觉就是网站很卡。
重启 php-fpm 和 Nginx 一切正常。
service nginx restart
killall php-fpm
php-fpm
再打开就OK了。
来自:http://www.th7.cn/Program/php/201408/254237.shtml
2016/02/16 16:29:05 [error] 11925#0: *50 recv() failed (104: Connection reset by peer) while reading response header from upstream
解决办法:
Nginx出现502 Bad Gateway 错误,
查了Nginx的错误日志为:
2014/08/02 16:14:31 [error] 17029#0: *17941 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 210.61.12.2, server: blog.lixiphp.com, request: “POST /api/1.0 HTTP/1.1″, upstream: “fastcgi://127.0.0.1:9000″, host: “blog.lixiphp.com”2014/08/02 16:24:52 [error] 29615#0: *3 recv() failed (104: Connection reset by peer) while reading response header from upstream, client: 58.220.197.35, server: blog.lixiphp.com, request: “GET /404 HTTP/1.1″, upstream: “fastcgi://127.0.0.1:9000″, host: “blog.lixiphp.com”
不要使用php-fpm的request_terminate_timeout,最好设成request_terminate_timeout=0;
vi /etc/php-fpm.d/www.conf
修改为:
; The timeout for serving a single request after which the worker process will
; be killed. This option should be used when the ‘max_execution_time’ ini option
; does not stop script execution for some reason. A value of ’0′ means ‘off’.
; Available units: s(econds)(default), m(inutes), h(ours), or d(ays)
; Default Value: 0
request_terminate_timeout = 0
因为这个参数会直接杀掉php进程,然后重启php进程,这样前端nginx就会返回104: Connection reset by peer。这个过程是很慢,总体感觉就是网站很卡。
重启 php-fpm 和 Nginx 一切正常。
service nginx restart
killall php-fpm
php-fpm
再打开就OK了。
来自:http://www.th7.cn/Program/php/201408/254237.shtml
PHP安装与使用VLD查看opcode代码【PHP安装第三方扩展的方法】
Php/Js/Shell/Go jackxiang 2016-2-15 15:08
背景:自从PHP引入了一个叫OPcache的扩展,那么如何看OPcache呢,这儿有一个扩展分析PHP代码的性能叫VLD。
需要分析PHP代码的性能,或者说实现同样功能的代码到底哪个更好呢?或者说想知道底层的实现可以使用VLD查看opcode
下载与安装VLD
# wget http://pecl.php.net/get/vld-0.11.2.tgz
# tar zxvf vld-0.11.2.tgz
# cd ./vld-0.11.2
# /usr/local/php/bin/phpize 或者直接phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-vld
# make && make install
---------------------------------
编辑php.ini文件激活vld扩展:
php.ini位置
#cd /usr/local/php/lib
增加
extension=vld.so
重启Apache:
# /usr/local/apache2/bin/apachectl restart
---------------------------------
查看phpinfo()信息
--------------------------------
至此,VLD就安装完了。写个简单的test.php
[php] view plain copy
$a='123';
echo $a;
# php -dvld.active=1 ./test.php
如果没有设置php环境变量的话
#/usr/local/php/bin/php -dvld.active=1 test.php
查看结果
。。。。
下面是举例说明怎么看...
更多请转向:http://blog.csdn.net/21aspnet/article/details/7002644
需要分析PHP代码的性能,或者说实现同样功能的代码到底哪个更好呢?或者说想知道底层的实现可以使用VLD查看opcode
下载与安装VLD
# wget http://pecl.php.net/get/vld-0.11.2.tgz
# tar zxvf vld-0.11.2.tgz
# cd ./vld-0.11.2
# /usr/local/php/bin/phpize 或者直接phpize
# ./configure --with-php-config=/usr/local/php/bin/php-config --enable-vld
# make && make install
---------------------------------
编辑php.ini文件激活vld扩展:
php.ini位置
#cd /usr/local/php/lib
增加
extension=vld.so
重启Apache:
# /usr/local/apache2/bin/apachectl restart
---------------------------------
查看phpinfo()信息
--------------------------------
至此,VLD就安装完了。写个简单的test.php
[php] view plain copy
$a='123';
echo $a;
# php -dvld.active=1 ./test.php
如果没有设置php环境变量的话
#/usr/local/php/bin/php -dvld.active=1 test.php
查看结果
。。。。
下面是举例说明怎么看...
更多请转向:http://blog.csdn.net/21aspnet/article/details/7002644
[疑难问题]PHP下使用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): too many connections in
Php/Js/Shell/Go jackxiang 2016-2-13 01:48
背景:把mysql换成mysqli时出现,连接数过多,其实际上并不是,原因是我挪动了一下php的sock文件位置导致,因这几个socket修改没有修改完全,于是出现了too many connections ,从mysql里show processlist并没有发现真的有连接,其实用tshark抓下包估计能看到(http://jackxiang.com/post/7458/),并没有发出请求,而估计是mysqli的客户端自己报出来的,别看这个问题小,搞了老半天,都想重新安装Php了,发现原来是路径写错了同时mysqli的客户端提示连接数过多的误提示导致方向走错了。如下:
修改后记得重启动php-fpm:
[root@iZ25z0ugwgtZ etc]# service php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm done
还会出现在localhost时连接找不到sock时提示诡异,如下:Warning: mysqli::mysqli(): (HY000/2002): No such file or directory in
开始的回答有点不严谨,估计也没有解决问题,修改了答案,解决办法如下,或配置php.ini,参考:http://jackxiang.com/post/8499/
问题出现的原因:
当主机填写为localhost时MySQL会采用 unix domain socket连接,当主机填写为127.0.0.1时MySQL会采用TCP/IP的方式连接。使用Unix socket的连接比TCP/IP的连接更加快速与安全。这是MySQL连接的特性,可以参考官方文档的说明4.2.2. Connecting to the MySQL Server:
On Unix, MySQL programs treat the host name localhost specially, in a way that is
likely different from what you expect compared to other network-based programs.
For connections to localhost, MySQL programs attempt to connect to the local server
by using a Unix socket file. This occurs even if a --port or -P option is given to
specify a port number. To ensure that the client makes a TCP/IP connection to the
local server, use --host or -h to specify a host name value of 127.0.0.1, or the IP
address or name of the local server. You can also specify the connection protocol
explicitly, even for localhost, by using the --protocol=TCP option.
这个问题有以下几种解决方法:
使用TCP/IP代替Unix socket。即在连接的时候将localhost换成127.0.0.1。
修改MySQL的配置文件my.cnf,指定mysql.socket的位置:
/var/lib/mysql/mysql.sock (你的mysql.socket路径)。
直接在php建立连接的时候指定my.socket的位置(官方文档:mysqli_connect)。比如:
$db = new MySQLi('localhost', 'root', 'root', 'my_db', '3306', '/var/run/mysqld/mysqld.sock')
如果哪里没有说清楚或者说错了,欢迎提出了~~
______________________排查要点如下_______________________________
warning: mysqli::real_connect(): (hy000/1040): too many connections in:
出现场景 :手动编译安装mysql,并制定安装位置,php以localhost方式连接mysql
原因分析 :手动编译安装制定位置后所有的mysql文件都在制定的目录或者data目录下面,php默认只会寻找/temp/mysql.sock找这个sock文件,所以会导致sock文件无法找到。
解决方法 :
1.给sock文件做个软链
ln -s /data/mysqldb/mysql.sock /tmp/mysql.sock;
或者
2.修改php的默认mysql.sock连接地址
mysql.default_socket=/data/mysqldb/mysql.sock
3.使用tcp socket的方式进行连接
mysql('127.0.0.1','username','passwod');
来自:http://ju.outofmemory.cn/entry/144221
修改后记得重启动php-fpm:
[root@iZ25z0ugwgtZ etc]# service php-fpm restart
Gracefully shutting down php-fpm . done
Starting php-fpm done
还会出现在localhost时连接找不到sock时提示诡异,如下:Warning: mysqli::mysqli(): (HY000/2002): No such file or directory in
开始的回答有点不严谨,估计也没有解决问题,修改了答案,解决办法如下,或配置php.ini,参考:http://jackxiang.com/post/8499/
问题出现的原因:
当主机填写为localhost时MySQL会采用 unix domain socket连接,当主机填写为127.0.0.1时MySQL会采用TCP/IP的方式连接。使用Unix socket的连接比TCP/IP的连接更加快速与安全。这是MySQL连接的特性,可以参考官方文档的说明4.2.2. Connecting to the MySQL Server:
On Unix, MySQL programs treat the host name localhost specially, in a way that is
likely different from what you expect compared to other network-based programs.
For connections to localhost, MySQL programs attempt to connect to the local server
by using a Unix socket file. This occurs even if a --port or -P option is given to
specify a port number. To ensure that the client makes a TCP/IP connection to the
local server, use --host or -h to specify a host name value of 127.0.0.1, or the IP
address or name of the local server. You can also specify the connection protocol
explicitly, even for localhost, by using the --protocol=TCP option.
这个问题有以下几种解决方法:
使用TCP/IP代替Unix socket。即在连接的时候将localhost换成127.0.0.1。
修改MySQL的配置文件my.cnf,指定mysql.socket的位置:
/var/lib/mysql/mysql.sock (你的mysql.socket路径)。
直接在php建立连接的时候指定my.socket的位置(官方文档:mysqli_connect)。比如:
$db = new MySQLi('localhost', 'root', 'root', 'my_db', '3306', '/var/run/mysqld/mysqld.sock')
如果哪里没有说清楚或者说错了,欢迎提出了~~
______________________排查要点如下_______________________________
warning: mysqli::real_connect(): (hy000/1040): too many connections in:
出现场景 :手动编译安装mysql,并制定安装位置,php以localhost方式连接mysql
原因分析 :手动编译安装制定位置后所有的mysql文件都在制定的目录或者data目录下面,php默认只会寻找/temp/mysql.sock找这个sock文件,所以会导致sock文件无法找到。
解决方法 :
1.给sock文件做个软链
ln -s /data/mysqldb/mysql.sock /tmp/mysql.sock;
或者
2.修改php的默认mysql.sock连接地址
mysql.default_socket=/data/mysqldb/mysql.sock
3.使用tcp socket的方式进行连接
mysql('127.0.0.1','username','passwod');
来自:http://ju.outofmemory.cn/entry/144221
[实践Ok]Mysql连接升级为Mysqli函数对应关系以解决The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in 报错
Php/Js/Shell/Go jackxiang 2016-2-12 20:10
解决Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future:
mysqli 更严谨 安全 高效
php 5个版本,5.2、5.3、5.4、5.5,怕跟不上时代,新的服务器直接上5.5,但是程序出现如下错误:Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in,看意思就很明了,说mysql_connect这个模块将在未来弃用,请你使用mysqli或者PDO来替代。
解决方法1:
禁止php报错
display_errors = On
改为
display_errors = Off
鉴于这个服务器都是给用户用的,有时候他们需要报错(…都是给朋友用的,^_^),不能这做,让他们改程序吧,看方案2.
解决方法2:
<?php
error_reporting(E_ALL ^ E_DEPRECATED);
以上来自:http://www.cnblogs.com/bjxing/p/3555929.html
————————————————————————————————————————————————————————————
解决The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in 报错
很明显的提示 mysql扩展模块就要被放弃使用了,所以请使用mysqli代替
这个说明你的php版本过高造成的。
解决方法:
把mysql的相关模块全都改为mysqli就行了。
比如:
1、mysql_connect 改为mysqli_connect
2、mysql_query 改为mysqli_query
3、mysql_close 改为 mysqli_close
4、mysql_select_db 改为 mysqli_select_db
5、mysql_error 改为 mysqli_error
等等!
来自:http://www.inbeijing.org/archives/1017
———————————————————————————————————
mysql_select_db ==> mysqli_select_db:
来自:http://www.runoob.com/php/func-mysqli-select-db.html
用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): too many connections in :
https://jackxiang.com/post/8500/
mysqli 更严谨 安全 高效
php 5个版本,5.2、5.3、5.4、5.5,怕跟不上时代,新的服务器直接上5.5,但是程序出现如下错误:Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in,看意思就很明了,说mysql_connect这个模块将在未来弃用,请你使用mysqli或者PDO来替代。
解决方法1:
禁止php报错
display_errors = On
改为
display_errors = Off
鉴于这个服务器都是给用户用的,有时候他们需要报错(…都是给朋友用的,^_^),不能这做,让他们改程序吧,看方案2.
解决方法2:
<?php
error_reporting(E_ALL ^ E_DEPRECATED);
以上来自:http://www.cnblogs.com/bjxing/p/3555929.html
————————————————————————————————————————————————————————————
解决The mysql extension is deprecated and will be removed in the future: use mysqli or PDO instead in 报错
很明显的提示 mysql扩展模块就要被放弃使用了,所以请使用mysqli代替
这个说明你的php版本过高造成的。
解决方法:
把mysql的相关模块全都改为mysqli就行了。
比如:
1、mysql_connect 改为mysqli_connect
2、mysql_query 改为mysqli_query
3、mysql_close 改为 mysqli_close
4、mysql_select_db 改为 mysqli_select_db
5、mysql_error 改为 mysqli_error
等等!
来自:http://www.inbeijing.org/archives/1017
———————————————————————————————————
mysql_select_db ==> mysqli_select_db:
来自:http://www.runoob.com/php/func-mysqli-select-db.html
用mysqli的函数连接mysql出现warning: mysqli::real_connect(): (hy000/1040): too many connections in :
https://jackxiang.com/post/8500/
[实践OK]通过curl测试服务器是否支持断点续传的办法。
Php/Js/Shell/Go jackxiang 2016-1-6 11:52
1)CURL实现探测:能够找到Content-Range则表明服务器支持断点续传,有些服务器还会返回Accept-Ranges:
2)用wget实现分片下载的探测:
————————————————————————————————————————————————————————————————
curl -i --range 0-9 http://www.baidu.com/img/bdlogo.gif
HTTP/1.1 206 Partial Content
Date: Thu, 13 Mar 2014 00:20:10 GMT
Server: Apache
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Set-Cookie: BAIDUID=AC9512E1E6932D67A05F4F090DE836FC:FG=1; expires=Fri, 13-Mar-15 00:20:10 GMT;
max-age=31536000; path=/; domain=.baidu.com; version=1
Last-Modified: Fri, 22 Feb 2013 03:45:02 GMT
ETag: "627-4d648041f6b80"
Accept-Ranges: bytes
Content-Length: 10
Cache-Control: max-age=315360000
Expires: Sun, 10 Mar 2024 00:20:10 GMT
Content-Range: bytes 0-9/1575
Connection: Keep-Alive
Content-Type: image/gif
上面是curl获取到的响应头信息,其中如果能够找到Content-Range则表明服务器支持断点续传,有些服务器还会返回Accept-Ranges。
Accept-Ranges:表明服务器是否支持指定范围请求及哪种类型的分段请求
Content-Range:在整个返回体中本部分的字节位置,因为我们请求的是图片的前10个字节,所以Content-Range的值是bytes 0-9/1575,后面的1575是图片总的字节数。
另一种方法
wget -S http://www.baidu.com/img/bdlogo.gif 2>&1 | grep 'Accept-Ranges'
如果能看到输出Accept-Ranges,则表明服务器支持断点续传,否则不支持。
Nginx服务器默认支持断点续传的,无线做任何额外配置。
来自:http://www.letuknowit.com/post/45.html
2)用wget实现分片下载的探测:
————————————————————————————————————————————————————————————————
curl -i --range 0-9 http://www.baidu.com/img/bdlogo.gif
HTTP/1.1 206 Partial Content
Date: Thu, 13 Mar 2014 00:20:10 GMT
Server: Apache
P3P: CP=" OTI DSP COR IVA OUR IND COM "
Set-Cookie: BAIDUID=AC9512E1E6932D67A05F4F090DE836FC:FG=1; expires=Fri, 13-Mar-15 00:20:10 GMT;
max-age=31536000; path=/; domain=.baidu.com; version=1
Last-Modified: Fri, 22 Feb 2013 03:45:02 GMT
ETag: "627-4d648041f6b80"
Accept-Ranges: bytes
Content-Length: 10
Cache-Control: max-age=315360000
Expires: Sun, 10 Mar 2024 00:20:10 GMT
Content-Range: bytes 0-9/1575
Connection: Keep-Alive
Content-Type: image/gif
上面是curl获取到的响应头信息,其中如果能够找到Content-Range则表明服务器支持断点续传,有些服务器还会返回Accept-Ranges。
Accept-Ranges:表明服务器是否支持指定范围请求及哪种类型的分段请求
Content-Range:在整个返回体中本部分的字节位置,因为我们请求的是图片的前10个字节,所以Content-Range的值是bytes 0-9/1575,后面的1575是图片总的字节数。
另一种方法
wget -S http://www.baidu.com/img/bdlogo.gif 2>&1 | grep 'Accept-Ranges'
如果能看到输出Accept-Ranges,则表明服务器支持断点续传,否则不支持。
Nginx服务器默认支持断点续传的,无线做任何额外配置。
来自:http://www.letuknowit.com/post/45.html
PHP 7内核之HashTable实现,PHP7的hash实现由双向变单向链表。-来自:华仔。
Php/Js/Shell/Go jackxiang 2015-12-22 21:41
Hash贯穿了PHP的数组、对象,总之,这个hash是个很基础重要的东西:
http://blog.csdn.net/heiyeshuwu/article/details/44259865
http://blog.csdn.net/heiyeshuwu/article/details/44259865
[转]shell脚本执行时报"bad interpreter: Text file busy"的解决方法
Php/Js/Shell/Go jackxiang 2015-12-22 21:35
在执行一个shell脚本时,遇到了“-bash: ./killSession.sh: /bin/bash: bad interpreter: Text file busy”错误提示,如下所示:
[oracle@DB-Server bin]$ ./killSession.sh
-bash: ./killSession.sh: /bin/bash: bad interpreter: Text file busy
此时只需要在#!/bin/bash,加一空格#! /bin/bash即可解决问题。
另外一种情况: 当有其它进程访问这个文件,可以通过lsof | grep killSession.sh来查看是否有其它进程正在访问该文件。
此时可以用kill命令杀掉其它进程。解决上面这个问题。
转自:http://www.cnblogs.com/kerrycode/p/4038934.html
[oracle@DB-Server bin]$ ./killSession.sh
-bash: ./killSession.sh: /bin/bash: bad interpreter: Text file busy
此时只需要在#!/bin/bash,加一空格#! /bin/bash即可解决问题。
另外一种情况: 当有其它进程访问这个文件,可以通过lsof | grep killSession.sh来查看是否有其它进程正在访问该文件。
此时可以用kill命令杀掉其它进程。解决上面这个问题。
转自:http://www.cnblogs.com/kerrycode/p/4038934.html
PHP filesize() 函数是有缓存的,你需要清除文件状态缓存。
Php/Js/Shell/Go jackxiang 2015-12-17 19:01
背景:有时有做一些H5的websocket做模仿linux下的tail -f,形成一个实时日志查看工具时,会对写入事件前的文件大小和写入事件后的文件大小作一个计算,而在实际调试时发现这个PHP的filessize函数是有缓存的,这个链接的兄弟在问怎么破?(http://segmentfault.com/q/1010000003843245),如下文所示 。
定义和用法
clearstatcache()函数的作用是:清除文件状态缓存。
PHP的缓存数据对更快更好的运行函数是非常有利的。如果一个文件在脚本中测试了多次,你也许会禁止对正确的结果进行缓存。为了实现这点,你可以使用clearstatcache()函数。
语法
clearstatcache()
提示和注意
提示:执行缓存的函数:
stat()
lstat()
file_exists()
is_writable()
is_readable()
is_executable()
is_file()
is_dir()
is_link()
filectime()
fileatime()
filemtime()
fileinode()
filegroup()
fileowner()
filesize()
filetype()
fileperms()
案例
上述代码将输出下面的结果:
事件前文件大小:59635
事件后文件大小:59639
来自:http://www.chinaz.com/program/2010/0302/107501.shtml
定义和用法
clearstatcache()函数的作用是:清除文件状态缓存。
PHP的缓存数据对更快更好的运行函数是非常有利的。如果一个文件在脚本中测试了多次,你也许会禁止对正确的结果进行缓存。为了实现这点,你可以使用clearstatcache()函数。
语法
clearstatcache()
提示和注意
提示:执行缓存的函数:
stat()
lstat()
file_exists()
is_writable()
is_readable()
is_executable()
is_file()
is_dir()
is_link()
filectime()
fileatime()
filemtime()
fileinode()
filegroup()
fileowner()
filesize()
filetype()
fileperms()
案例
上述代码将输出下面的结果:
事件前文件大小:59635
事件后文件大小:59639
来自:http://www.chinaz.com/program/2010/0302/107501.shtml
RocksDB介绍:一个比LevelDB更彪悍的引擎
Php/Js/Shell/Go jackxiang 2015-12-8 17:24
背景:听说要写rocksdb的PHP扩展,推荐到PHP官方去,一看发现这个db很牛,支持key-value的查找,Facebook开源闪存数据库RocksDB。
关于LevelDB的资料网上还是比较丰富的,如果你尚未听说过LevelDB,那请稍微预习一下,因为RocksDB实际上是在LevelDB之上做的改进。本文主要侧重在架构上对RocksDB对LevelDB改进的地方做个简单介绍并添加一些个人的看法,更详细的信息读者可参考其官网:http://rocksdb.org/
RocksDB是在LevelDB原来的代码上进行改进完善的,所以在用法上与LevelDB非常的相似。如下,就是简单的把原来Leveldb信息替换为Rocksdb,从继承的角度看,Rocksdb就像是Leveldb的后辈。
RocksDB:
#include "rocksdb/db.h"
rocksdb::DB* db;
rocksdb::Options options;
options.create_if_missing = true;
rocksdb::Status status = rocksdb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status = db->Get(rocksdb::ReadOptions(), key1, &value);
status = db->Put(rocksdb::WriteOptions(), key2, value);
status = db->Delete(rocksdb::WriteOptions(), key1);
delete db;
#include "rocksdb/db.h"
rocksdb::DB* db;
rocksdb::Options options;
options.create_if_missing = true;
rocksdb::Status status = rocksdb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status = db->Get(rocksdb::ReadOptions(), key1, &value);
status = db->Put(rocksdb::WriteOptions(), key2, value);
status = db->Delete(rocksdb::WriteOptions(), key1);
delete db;
LevelDB:
#include "leveldb/db.h"
leveldb::DB *db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status = db->Get(leveldb::ReadOptions(), key1, &value);
status = db->Put(leveldb::WriteOptions(), key2, value);
status = db->Delete(leveldb::WriteOptions(), key1);
delete db;
#include "leveldb/db.h"
leveldb::DB *db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status = db->Get(leveldb::ReadOptions(), key1, &value);
status = db->Put(leveldb::WriteOptions(), key2, value);
status = db->Delete(leveldb::WriteOptions(), key1);
delete db;
RocksDB虽然在代码层面上是在LevelDB原有的代码上进行开发的,但却借鉴了Apache HBase的一些好的idea。在云计算横行的年代,开口不离Hadoop,RocksDB也开始支持HDFS,允许从HDFS读取数据。而LevelDB则是一个比较单一的存储引擎,有点我就是我,除了我依然只有我的感觉。也是因为LevelDB的单一性,在做具体的应用的时候一般需要对其作进一步扩展。
RocksDB支持一次获取多个K-V,还支持Key范围查找。LevelDB只能获取单个Key
RocksDB除了简单的Put、Delete操作,还提供了一个Merge操作,说是为了对多个Put操作进行合并。站在引擎实现者的角度来看,相比其带来的价值,其实现的成本要昂贵很多。个人觉得有时过于追求完美不见得是好事,据笔者所测(包括测试自己编写的引擎),性能的瓶颈其实主要在合并上,多一次少一次Put对性能的影响并无大碍。
RocksDB提供一些方便的工具,这些工具包含解析sst文件中的K-V记录、解析MANIFEST文件的内容等。有了这些工具,就不用再像使用LevelDB那样,只能在程序中才能知道sst文件K-V的具体信息了。
RocksDB支持多线程合并,而LevelDB是单线程合并的。LSM型的数据结构,最大的性能问题就出现在其合并的时间损耗上,在多CPU的环境下,多线程合并那是LevelDB所无法比拟的。不过据其官网上的介绍,似乎多线程合并还只是针对那些与下一层没有Key重叠的文件,只是简单的rename而已,至于在真正数据上的合并方面是否也有用到多线程,就只能看代码了。
RocksDB增加了合并时过滤器,对一些不再符合条件的K-V进行丢弃,如根据K-V的有效期进行过滤。
压缩方面RocksDB可采用多种压缩算法,除了LevelDB用的snappy,还有zlib、bzip2。LevelDB里面按数据的压缩率(压缩后低于75%)判断是否对数据进行压缩存储,而RocksDB典型的做法是Level 0-2不压缩,最后一层使用zlib,而其它各层采用snappy。
在故障方面,RocksDB支持增量备份和全量备份,允许将已删除的数据备份到指定的目录,供后续恢复。
RocksDB支持在单个进程中启用多个实例,而LevelDB只允许单个实例。
RocksDB支持管道式的Memtable,也就说允许根据需要开辟多个Memtable,以解决Put与Compact速度差异的性能瓶颈问题。在LevelDB里面因为只有一个Memtable,如果Memtable满了却还来不及持久化,这个时候LevelDB将会减缓Put操作,导致整体性能下降。笔者目前写的引擎在这方面竟然跟RocksDB不谋而合,这里偷偷乐一下,呵呵。
看完上面这些介绍,相比LevelDB是不是觉得RocksDB彪悍的不可思议,很多该有的地方都有,该想的都想到了,简直不像在做引擎库,更像是在做产品。不过虽然RocksDB在性能上提升了不少,但在文件存储格式上跟LevelDB还是没什么变化的, 稍微有点更新的只是RocksDB对原来LevelDB中sst文件预留下来的MetaBlock进行了具体利用。
个人觉得RocksDB尚未解决的地方:
依然是完全依赖于MANIFEST,一当该文件丢失,则整个数据库基本废掉。
合并上依然是整个文件载入,一些没用的Value将被多次的读入内存,如果这些Value很大的话,那没必要的内存占用将是一个可观的成本。
关于这两个问题,尤其是后面那个问题,笔者已有相应的解决方案,至于结果如何只等日后实现之后再作解说了。
来自:http://tech.uc.cn/?p=2592
关于LevelDB的资料网上还是比较丰富的,如果你尚未听说过LevelDB,那请稍微预习一下,因为RocksDB实际上是在LevelDB之上做的改进。本文主要侧重在架构上对RocksDB对LevelDB改进的地方做个简单介绍并添加一些个人的看法,更详细的信息读者可参考其官网:http://rocksdb.org/
RocksDB是在LevelDB原来的代码上进行改进完善的,所以在用法上与LevelDB非常的相似。如下,就是简单的把原来Leveldb信息替换为Rocksdb,从继承的角度看,Rocksdb就像是Leveldb的后辈。
RocksDB:
#include "rocksdb/db.h"
rocksdb::DB* db;
rocksdb::Options options;
options.create_if_missing = true;
rocksdb::Status status = rocksdb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status = db->Get(rocksdb::ReadOptions(), key1, &value);
status = db->Put(rocksdb::WriteOptions(), key2, value);
status = db->Delete(rocksdb::WriteOptions(), key1);
delete db;
#include "rocksdb/db.h"
rocksdb::DB* db;
rocksdb::Options options;
options.create_if_missing = true;
rocksdb::Status status = rocksdb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status = db->Get(rocksdb::ReadOptions(), key1, &value);
status = db->Put(rocksdb::WriteOptions(), key2, value);
status = db->Delete(rocksdb::WriteOptions(), key1);
delete db;
LevelDB:
#include "leveldb/db.h"
leveldb::DB *db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status = db->Get(leveldb::ReadOptions(), key1, &value);
status = db->Put(leveldb::WriteOptions(), key2, value);
status = db->Delete(leveldb::WriteOptions(), key1);
delete db;
#include "leveldb/db.h"
leveldb::DB *db;
leveldb::Options options;
options.create_if_missing = true;
leveldb::Status status = leveldb::DB::Open(options, "/tmp/testdb", &db);
assert(status.ok());
status = db->Get(leveldb::ReadOptions(), key1, &value);
status = db->Put(leveldb::WriteOptions(), key2, value);
status = db->Delete(leveldb::WriteOptions(), key1);
delete db;
RocksDB虽然在代码层面上是在LevelDB原有的代码上进行开发的,但却借鉴了Apache HBase的一些好的idea。在云计算横行的年代,开口不离Hadoop,RocksDB也开始支持HDFS,允许从HDFS读取数据。而LevelDB则是一个比较单一的存储引擎,有点我就是我,除了我依然只有我的感觉。也是因为LevelDB的单一性,在做具体的应用的时候一般需要对其作进一步扩展。
RocksDB支持一次获取多个K-V,还支持Key范围查找。LevelDB只能获取单个Key
RocksDB除了简单的Put、Delete操作,还提供了一个Merge操作,说是为了对多个Put操作进行合并。站在引擎实现者的角度来看,相比其带来的价值,其实现的成本要昂贵很多。个人觉得有时过于追求完美不见得是好事,据笔者所测(包括测试自己编写的引擎),性能的瓶颈其实主要在合并上,多一次少一次Put对性能的影响并无大碍。
RocksDB提供一些方便的工具,这些工具包含解析sst文件中的K-V记录、解析MANIFEST文件的内容等。有了这些工具,就不用再像使用LevelDB那样,只能在程序中才能知道sst文件K-V的具体信息了。
RocksDB支持多线程合并,而LevelDB是单线程合并的。LSM型的数据结构,最大的性能问题就出现在其合并的时间损耗上,在多CPU的环境下,多线程合并那是LevelDB所无法比拟的。不过据其官网上的介绍,似乎多线程合并还只是针对那些与下一层没有Key重叠的文件,只是简单的rename而已,至于在真正数据上的合并方面是否也有用到多线程,就只能看代码了。
RocksDB增加了合并时过滤器,对一些不再符合条件的K-V进行丢弃,如根据K-V的有效期进行过滤。
压缩方面RocksDB可采用多种压缩算法,除了LevelDB用的snappy,还有zlib、bzip2。LevelDB里面按数据的压缩率(压缩后低于75%)判断是否对数据进行压缩存储,而RocksDB典型的做法是Level 0-2不压缩,最后一层使用zlib,而其它各层采用snappy。
在故障方面,RocksDB支持增量备份和全量备份,允许将已删除的数据备份到指定的目录,供后续恢复。
RocksDB支持在单个进程中启用多个实例,而LevelDB只允许单个实例。
RocksDB支持管道式的Memtable,也就说允许根据需要开辟多个Memtable,以解决Put与Compact速度差异的性能瓶颈问题。在LevelDB里面因为只有一个Memtable,如果Memtable满了却还来不及持久化,这个时候LevelDB将会减缓Put操作,导致整体性能下降。笔者目前写的引擎在这方面竟然跟RocksDB不谋而合,这里偷偷乐一下,呵呵。
看完上面这些介绍,相比LevelDB是不是觉得RocksDB彪悍的不可思议,很多该有的地方都有,该想的都想到了,简直不像在做引擎库,更像是在做产品。不过虽然RocksDB在性能上提升了不少,但在文件存储格式上跟LevelDB还是没什么变化的, 稍微有点更新的只是RocksDB对原来LevelDB中sst文件预留下来的MetaBlock进行了具体利用。
个人觉得RocksDB尚未解决的地方:
依然是完全依赖于MANIFEST,一当该文件丢失,则整个数据库基本废掉。
合并上依然是整个文件载入,一些没用的Value将被多次的读入内存,如果这些Value很大的话,那没必要的内存占用将是一个可观的成本。
关于这两个问题,尤其是后面那个问题,笔者已有相应的解决方案,至于结果如何只等日后实现之后再作解说了。
来自:http://tech.uc.cn/?p=2592
PHP7 now is GA,GA是啥意思?
Php/Js/Shell/Go jackxiang 2015-12-4 07:54
背景:说WordPress提升了229%,我怎么没有察觉到呢?不管怎么样,GA了。
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:贾旭
链接:http://www.zhihu.com/question/20790599/answer/16225807
来源:知乎
GA:General Availability(正式发布的版本)在国外都是用GA来说明release版本的
其他的还有:
RC 0版。是 0Release 0Candidate 0的缩写,意思是发布倒计时,候选版本,处于Gamma阶段,该版本已经完成全部功能并清除大部分的 BUG。到了这个阶段只会除BUG,不会对软件做任何大的更改。从
Alpha到Beta再到Gamma是改进的先后关系,但RC1、RC2往往是取舍关系。
Final:正式版。
摘录自邮件:
PHP 7.0 also uses much less memory thanks to the compact data structures and the highly-refactored codebase of Zend Engine 3.0. Memory consumption gains between 30% and 50% are commonly realized, allowing you to serve more concurrent users without adding additional server hardware.
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:贾旭
链接:http://www.zhihu.com/question/20790599/answer/16225807
来源:知乎
GA:General Availability(正式发布的版本)在国外都是用GA来说明release版本的
其他的还有:
RC 0版。是 0Release 0Candidate 0的缩写,意思是发布倒计时,候选版本,处于Gamma阶段,该版本已经完成全部功能并清除大部分的 BUG。到了这个阶段只会除BUG,不会对软件做任何大的更改。从
Alpha到Beta再到Gamma是改进的先后关系,但RC1、RC2往往是取舍关系。
Final:正式版。
摘录自邮件:
PHP 7.0 also uses much less memory thanks to the compact data structures and the highly-refactored codebase of Zend Engine 3.0. Memory consumption gains between 30% and 50% are commonly realized, allowing you to serve more concurrent users without adding additional server hardware.
PHP7 now is GA,GA是啥意思?
Php/Js/Shell/Go jackxiang 2015-12-4 07:54
背景:说WordPress提升了229%,我怎么没有察觉到呢?不管怎么样,GA了。
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:贾旭
链接:http://www.zhihu.com/question/20790599/answer/16225807
来源:知乎
GA:General Availability(正式发布的版本)在国外都是用GA来说明release版本的
其他的还有:
RC 0版。是 0Release 0Candidate 0的缩写,意思是发布倒计时,候选版本,处于Gamma阶段,该版本已经完成全部功能并清除大部分的 BUG。到了这个阶段只会除BUG,不会对软件做任何大的更改。从
Alpha到Beta再到Gamma是改进的先后关系,但RC1、RC2往往是取舍关系。
Final:正式版。
摘录自邮件:
PHP 7.0 also uses much less memory thanks to the compact data structures and the highly-refactored codebase of Zend Engine 3.0. Memory consumption gains between 30% and 50% are commonly realized, allowing you to serve more concurrent users without adding additional server hardware.
著作权归作者所有。
商业转载请联系作者获得授权,非商业转载请注明出处。
作者:贾旭
链接:http://www.zhihu.com/question/20790599/answer/16225807
来源:知乎
GA:General Availability(正式发布的版本)在国外都是用GA来说明release版本的
其他的还有:
RC 0版。是 0Release 0Candidate 0的缩写,意思是发布倒计时,候选版本,处于Gamma阶段,该版本已经完成全部功能并清除大部分的 BUG。到了这个阶段只会除BUG,不会对软件做任何大的更改。从
Alpha到Beta再到Gamma是改进的先后关系,但RC1、RC2往往是取舍关系。
Final:正式版。
摘录自邮件:
PHP 7.0 also uses much less memory thanks to the compact data structures and the highly-refactored codebase of Zend Engine 3.0. Memory consumption gains between 30% and 50% are commonly realized, allowing you to serve more concurrent users without adding additional server hardware.
PHP的普罗米修斯--"Swoole"项目--思维转换之前篇
Php/Js/Shell/Go jackxiang 2015-12-2 14:42
背景:swoole的出现,其背景是带有腾讯mongo和rango,mongo曾经在腾达30楼(想不起了)传PHP道时,见过半面,问过一个问题,rango兄弟出来后带着其思想重新写了swoole,于是,swoole主要思想和之前的pws有一部分相同,但其更主要用在嵌入式的长连接这块,其省掉了rinit这块在高并发的性能上更高一些,但变量上不能运行完销毁导致不能定相同变量,这块追求性能是要有代价的。
众所周知,传统的 PHP 应用程序有 Request Startup 和 Request Shutdown 的生命周期,所有的对象在请求后都将销毁,而 Blink 于此不同, Blink 许多对象都能留存与多个请求之间,减少对象反复创建销毁的性能损失。
摘自:http://www.oschina.net/p/blink-framework
作为swoole的顾问(故得上就细问,顾不上就问一下),我想swoole的开源思想比技术可能更重要,未来swoole的方面可能会向linux裁剪下的内存小于8M的上面作一定程度的倾斜,用在非常小的cpu和路由上,以php为界面操作路由,联网控制长连为基础,把体积变更小,更省硬件成本。
http://mp.weixin.qq.com/s?__biz=MzI2OTA5NTM2Mg==&mid=400981627&idx=1&sn=1367db94644ff7f28e29971abde433d1
众所周知,传统的 PHP 应用程序有 Request Startup 和 Request Shutdown 的生命周期,所有的对象在请求后都将销毁,而 Blink 于此不同, Blink 许多对象都能留存与多个请求之间,减少对象反复创建销毁的性能损失。
摘自:http://www.oschina.net/p/blink-framework
作为swoole的顾问(故得上就细问,顾不上就问一下),我想swoole的开源思想比技术可能更重要,未来swoole的方面可能会向linux裁剪下的内存小于8M的上面作一定程度的倾斜,用在非常小的cpu和路由上,以php为界面操作路由,联网控制长连为基础,把体积变更小,更省硬件成本。
http://mp.weixin.qq.com/s?__biz=MzI2OTA5NTM2Mg==&mid=400981627&idx=1&sn=1367db94644ff7f28e29971abde433d1