php7 memcache 扩展你们用哪个版本安装成功的?
https://github.com/php-memcached-dev/php-memcached/tree/php7
php7 的redis扩展 有吗?
https://github.com/phpredis/phpredis/tree/php7@tru
背景:对于kohana早期框架对类里面的before after以及controller和action的函数均可以用反射类来灵活按既定顺序执行,而在执行的时候假如异常,可以通过PHP提供的异常捕获进行捕获输出,这就涉及到类变对象后其参数的传递问题了,怎么给反射类里面的函数传递多参数乃至引用参数,这个PHP也提供了对应的反射类里函数传入的方法ReflectionMethod::invokeArgs。
使用代码片段如下:

参考更多相关反射的文章:
http://flandycheng.blog.51cto.com/855176/326021/
http://www.phperz.com/article/14/0809/17371.html

自己研究:http://jackxiang.com/post/2090/

ReflectionMethod::invokeArgs

(PHP 5 >= 5.1.0)

ReflectionMethod::invokeArgs — 带参数执行

说明

public mixed ReflectionMethod::invokeArgs ( object $object , array $args )
使用数组给方法传送参数,并执行他。
参数
object
调用方法的对象,如果是静态对象,设置为 null
args
使用 array 传送的方法参数。
返回值
返回方法返回值
错误/异常
如果 object 指定的实例无法执行方法,那么产生 ReflectionException 异常。
如果方法调用失败,产生 ReflectionException
范例
Example #1 ReflectionMethod::invokeArgs() example

<?php
class HelloWorld {

    public function sayHelloTo($name) {
        return 'Hello ' . $name;
    }

}

$reflectionMethod = new ReflectionMethod('HelloWorld', 'sayHelloTo');
echo $reflectionMethod->invokeArgs(new HelloWorld(), array('Mike'));
?>
以上例程会输出:
Hello Mike
注释
Note:
如果函数有参数需为引用,那么它们必须以引用方式传入。
参见
ReflectionMethod::invoke() - Invoke
__invoke()
call_user_func_array() - 调用回调函数,并把一个数组参数作为回调函数的参数
来自:http://help.bitscn.com/php/reflectionmethod.invokeargs.html
背景:这玩意是感觉把rpc的生成变成他自己的了,有点意思,不知底层是不是还是xdr交换统一数据结构,还是php的unpack实现客户端的。
http://www.tuicool.com/articles/NV3Yni3

背景:对于ip限定缩小范围,最好是采用出口IP通过公司的所有进行放行,而获取用户Ip地址通用方法常见安全隐患(HTTP_X_FORWARDED_FOR)的,所以最好是nginx在代理时就限定死:
deny  *.*.*.66;
deny  *.*.*.79;
deny  *.*.*.80;
deny  *.*.*.77;
Nginx的日志的最后一个IP并不安全:


*.*.*.57 - jackxiang.com [15/Mar/2016:18:02:33 +0800] "GET /h5ds/themes/common/mobile/js/maps/swiper.min.js.map HTTP/1.0" 404 20 "-" "Mozilla/5.0 (iPhone; CPU iPhone OS 7_0 like Mac OS X; en-us) AppleWebKit/537.51.1 (KHTML, like Gecko) Version/7.0 Mobile/11A465 Safari/9537.53" 202.*.*.78  
分析过程
这个来自一些项目中,获取用户Ip,进行用户操作行为的记录,是常见并且经常使用的。 一般朋友,都会看到如下通用获取IP地址方法。

function getIP() {
  if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) {
    $realip = $_SERVER['HTTP_X_FORWARDED_FOR'];
  } elseif (isset($_SERVER['HTTP_CLIENT_IP'])) {
    $realip = $_SERVER['HTTP_CLIENT_IP'];
  } else {
    $realip = $_SERVER['REMOTE_ADDR'];
    }
    return $realip;
  }
这个是网上常见获取,ip函数,用这些值获取IP,我们首先要弄清楚,这些数据是从那个地方传过来的。

IP获取来源
1.’REMOTE_ADDR’  是远端IP,默认来自tcp 连接是,客户端的Ip。可以说,它最准确,确定是,只会得到直接连服务器客户端IP。如果对方通过代理服务器上网,就发现。获取到的是代理服务器IP了。

如:a->b(proxy)->c  ,如果c 通过’REMOTE_ADDR’ ,只能获取到b的IP,获取不到a的IP了。

另外:该IP想篡改将很难实现,在传递知道生成php server值,都是直接生成的。

2.’HTTP_X_FORWARDED_FOR’,’HTTP_CLIENT_IP’ 为了能在大型网络中,获取到最原始用户IP,或者代理IP地址。对HTTp协议进行扩展。定义了实体头。

HTTP_X_FORWARDED_FOR = clientip,proxy1,proxy2  所有IP用”,”分割。 HTTP_CLIENT_IP 在高级匿名代理中,这个代表了代理服务器IP。既然是http协议扩展一个实体头,并且这个值对于传入端是信任的,信任传入方按照规则格式输入的。以下以x_forword_for例子加以说明,正常情况下,这个值变化过程。

来自:http://blog.chacuo.net/98.html
背景:目前虚拟机和云的兴起,对一些应用的封装啥的还没有火起来,比如:FreeBSD的jail啥的,目前出了一个叫docker的,可以了解了解。

基本概念
Docker 是一个开源的应用容器引擎,让开发者可以打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上。
Docker是一个重新定义了程序开发测试、交付和部署过程的开放平台,Docker则可以称为构建一次,到处运行,这就是docker提出的“Build once,Run anywhere”

备注:java提出的是” compile Once,Run Anywhere”
Docker与linux内核的关系
docker与linux内核的关系
Cgroup: 对资源进行限制(如对物理资源CPU、内存、I/O的限制)
Namespace:对进程进行隔离
Chroot: 能改变当前运行的进程和子进程的根目录
AUFS:联合文件系统,Docker利用AUFS将不同的Layer结合到1个image中去
Docker架构
Docker采用C/S架构,客户端与服务器端不一定要在一起。客户端可以运行在windows、linux等机器上,然后服务器端必须运行在linux 64bit的操作系统上。
Docker“组件间”关系
ü  主机:运行容器的机器
ü  镜像:文件的层次结构,以及包含如何运行容器的元数据, Dockerfile中的每条命令都会在文件系统中创建一个新的层次结构,文件系统在这些层次上构建起来,镜像就构建于这些联合的文件系统之上
ü  容器:一个从镜像中启动,包含正在运行的程序的进程
ü  Registry(镜像仓库):存放镜像的地方,如Docker Hub
ü  Volumn(卷):将物理机的文件夹挂载到容器内部.与openstack的volumn不一样,openstack中的卷是块存储,不能共享。而这里的volumn可以共享。
ü  Dockerfile:用于创建镜像的脚本
Docker应用场景
面向开发人员:快速开发、交付应用程序
主要体现在三个方面:
ü  代码一致:
在没有docker之前,开发、测试、生成环境可能不一样,如发布某个服务的端口时,开发是1000,而生产是2000,这就导致配置文件不一致。然而使用docker后,我在容器内的端口都是一样的,而容器对外暴露的端口可能不一样。
ü  开发环境与生产环境的一致性
我们知道,在生产环境的部署比较复杂,服务非常繁多。通过docker,我们可以单机版上通过容器来模拟生产环境的分布式环境。从而让开发人员的开发更有效率。
ü  快速部署
可以将docker理解为轻量级的虚拟机,启动docker容器速度很快,启动虚拟机很慢。
面向运维人员:降低运维成本
ü  节约安装各种软件的时间。
     在没有docker之前,在部署程序之前,势必要搭建环境,而搭建环境很花费时间,还要解决环境的各种依赖,而docker通过镜像机制,将你的代码和运行环境直接打包成镜像,扔到容器启动即可。
ü  降低运维成本。
在没有docker之前,由于技术不断发展,运维也要不停的学习各种软件的使用技能,如Node.js、redis等。有了docker,根本不用关系这些技术(或者少关心),只需要关注容器就可以了,能够正常的发布容器,停止容器、删除容器、迁移容器就可以了。
面向企业: Paas层的实现
Coding.net、Oschina这些代码托管平台,有个功能即提供给用户程序的演示环境,我不知道他们底层到底采用的什么技术,但是如果Iaas层的openstack,给用户直接提供虚拟机,先得太“笨重”,因为虚拟机本身对物理机的开销就比较大,如果采用Docker,我1台物理机可以部署多个容器,可以降低企业的采购物理机的费用,而且运行效率上应该比采用Iaas层的方案快。

Docker基本命令
Docker安装相关命令
参考: https://docs.docker.com/installation/ubuntulinux/

摘自:http://blog.csdn.net/opensure/article/details/46490749
聚贤庄中原各路英雄围攻乔峰,主要矛盾是因为乔峰不是汉人。而乔峰使太祖长拳战尽天下英雄而不败就是为了讽刺这些人。
太祖长拳是宋开国皇帝赵匡胤发明的拳术,又名三十二势长拳、宋太祖拳、太祖拳、赵家拳、赵门、太祖门,有的地方也叫红拳、洪拳、炮捶、赵门炮拳。其精神偶像是赵匡胤。明代,该拳法已名闻天下。并对戚家拳、太极拳、洪洞通背拳等拳种产生了重要影响。因此,又有“百拳之母”的称谓。

林,而少林功夫又发源于西域,那些所谓的英雄围攻乔峰是因为他不是汉人,而他们却都用西域功夫,只有乔峰用本朝太祖的长拳,绝妙的讽刺
阅读全文
总之,这种情况主要还是因为php-fpm.conf或php.ini里有#号引起的,我发现尽管php-fpm.conf里用#号能注释,但是会有影响,
我之前安装的是PHP 5.6.18,在运行程序时往往运行nginx请求出现:Comments starting with '#' are deprecated in Unknown on line 1,
后来我再次安装低版本时默认启动没有问题,再将PHP 5.6.18里的php/etc/php-fpm.conf挪动回来后再启动就发生:Comments starting with '#' are deprecated in Unknown on line ,原来里面有一些以#号的中文注释导致的,如:

结论:尽量别用#号注释,php.conf和php-fpm.conf两个,一个是;注释,别用#号,另一个是尽量别用#号,一个#都不要留更好。

===========================================================================
ErrorException [ 8192 ]: Comments starting with '#' are deprecated in Unknown on line 1

find /usr/local/php/ -name "*.ini" -exec sed -i -re 's/^(\s*)#(.*)/\1;\2/g' {} \;
来自:http://stackoverflow.com/questions/29211550/track-down-php-error-comments-starting-with-are-deprecated-in-unknown-on-li


8192   E_DEPRECATED (integer)   运行时通知。启用后将会对在未来版本中可能无法正常工作的代码给出警告。   since PHP 5.3.0
错误码来自:http://www.jb51.net/article/47793.htm
应该是新版本的PHP出现的一个mysql推荐用mysqlli和pdo提示的问题,把错误关掉,再打开就好了,这块儿可能PHP还是有点问题:
error_reporting(E_ALL ^ E_NOTICE ^ E_DEPRECATED);//解决Deprecated: mysql_connect(): The mysql extension is deprecated and will be removed in the future:                                                                                                  
ini_set('display_startup_errors', 0);
ini_set('display_errors', 0);
阅读全文
背景:对的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
背景:自己是https的,想调用别人的一些华东解锁验证码的一些js不是https的,于是被阻止了,怎么办?

    从 Firefox 18 开始,如果 HTTPS 页面中包含非加密的 HTTP 内容,浏览器会在控制台输出警告,记录 Mixed Active Content 请求。而从 Firefox 23 开始,浏览器会默认阻止 HTTPS 页面中可能影响网页安全的 HTTP 请求(即阻止 Mixed Active Content)。这样做会牺牲一些网站的兼容性,但对安全性的提高是很有帮助的。

获取 Mixed Content 相当于发起部分加密的连接,其中未加密的部分存在被中间人攻击的可能。不同类型的 Mixed Content 所产生的危害程度也有所不同,Mixed Passive Content 可能会使中间人获取到用户的设备信息,或让用户看到不正确的图片、音频等信息。而 Mixed Active Content 则可能导致用户的敏感数据被窃取,比如账号密码等。

解决问题

解决方案一 (一劳永逸)

避免在 HTTPS 页面中包含 HTTP 的内容。

解决方案二 (让 Firefox 暂时不阻止)

mixed_content_01

解决方案三 (配置本地 Firefox,让其不再阻止)

打开新标签页,在地址栏输入 about:config,进入配置页面。

mixed_content_02

为什么 Mixed Content Blocker 不是阻止所有的 HTTP 请求?

Mixed Content 可以分为两类:

Mixed Passive Content
Mixed Active Content
Mixed Passive Content (a.k.a. Mixed Display Content)

Mixed Passive Content 是在 HTTPS 页面中一些对安全性影响不大的 HTTP 内容,比如 Image、Audio、Video 等。即使这些内容被中间人篡改,所产生的影响也只是 —— 中间人得知了用户的浏览器信息 (through user-agent included by HTTP headers)、用户看到了一张不正确的图片,这些被篡改的内容无法修改 DOM 树,也无法执行。另外,Mixed Passive Content 在 Web 上普遍存在。因此 Firefox 默认不会阻止 Mixed Passive Content。

Mixed Active Content (a.k.a. Mixed Script Content)

Mixed Active Content 是在 HTTPS 页面中一些能够修改 DOM 树的 HTTP 内容,如 JavaScript、CSS、XMLHttpRequest、iFrame 等。这些 HTTP 内容被中间人修改以后,可能会影响原有 HTTPS 内容的安全性,导致敏感的用户数据被盗。因此 Firefox 会默认阻止 Mixed Active Content。

深入思考

为什么 Frame 应该是 Mixed Active Content?

Frame 之所以不能被分类为 Mixed Passive Content 主要有以下几个原因:
一个 frame 可以将外层可靠的 HTTPS 页面跳转到恶意盗取信息的仿造页面。
如果一个 HTTPS 页面嵌套着 HTTP frame,而这个 frame 包含表单用以输入用户信息,那么用户信息将会以 HTTP 方式传送,有被中间攻击者窃取的危险,而用户却毫不知情,还以为一切都在安全的 HTTPS 里。

如何判定 Mixed Content 是 Active 还是 Passive?

该 Mixed Content 是否会影响页面的 DOM 结构。(Yes -> Active, No -> Passive)

来自:http://www.ipeld.net/archives/8860.html
背景:测试人员提出在Html里一次性上传传了个8G文件,为何接口没有立即返回超过限定大小了,这块Html5里有对文件大小作限定,之前也有浏览器也提出过类似问题,接收方但目前如果采用一次性Post目前的PHP上传是没有办法立即通过分析Http协议的content-lenth告诉浏览器,你超了,目前都是通过http上传的httpBody,如Nginx这块配置一下大小,PHP里也配置一下大小进行拦截,测试的这种想法是好,目前但没法实施,除非你用断点上传且得在H5的浏览器的帮助下进行浏览器过滤一次,服务端再过滤一次才可行。

阅读全文
问题一:
在测试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
背景:像下拉这样的控件,有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
对于cpu密集型运算,PHP看来还是在性能上需要提高,解释性语音还是和编译性的c或c++不在一个层面上,hhvm用在smarty和WordPress上提升明显:

http://ju.outofmemory.cn/entry/105151
rango也写了一个博文作了一下比较,较为客观:
http://rango.swoole.com/archives/291
背景:个人博客因为升级chrome浏览器遇到的问题:配置nginx服务器完成后测试,360se,极速浏览器可以访问,但是FF,chrome不能,还好IE可以。
——————————————————————————————————————————————————————————————————————————
chrome版本40以上不支持SSLv3的解决办法:
今天接到业务反馈问题。
用chrome浏览器打不开我们的https网页。
原因是chrome版本号40以上的版本不支持SSLv3,我们需要在nginx的vhost里修改一下:

修改为:
    ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
    ssl_ciphers HIGH:!aNULL:!MD5;
然后重起nginx
来自:http://blog.sina.com.cn/s/blog_5425edf40102vl8i.html
来自:http://blog.sina.com.cn/s/blog_5425edf40102vl8f.html
====================================================
实践如下,对里面的SSLv3去掉,再就是之前是MEDIUM,后在startssl升级为高级后也得修改为HIGH,:
server {
        listen       443 ssl;
        ssl on;
        ssl_certificate     ssl/justwinit.crt;
        ssl_certificate_key ssl/justwinit.key;
        #ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 SSLv3;
        #ssl_ciphers         MEDIUM:!aNULL:!MD5;
        ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
        ssl_ciphers HIGH:!aNULL:!MD5;  
————————————————————————————————————————————————
加上SSLv3也可以,实践发现出现ERR_SSL_VERSION_OR_CIPHER_MISMATC错的根本原因是因为:
ssl_ciphers         MEDIUM:!aNULL:!MD5;  ==》 ssl_ciphers HIGH:!aNULL:!MD5;导致没有对上号。
server {
        listen       443 ssl;
        ssl on;
        ssl_certificate     ssl/justwinit.crt;
        ssl_certificate_key ssl/justwinit.key;
        #ssl_protocols       TLSv1 TLSv1.1 TLSv1.2 SSLv3;
        #ssl_ciphers         MEDIUM:!aNULL:!MD5;
        #ssl_protocols   TLSv1 TLSv1.1 TLSv1.2;                                                                                                              
        ssl_protocols   TLSv1 TLSv1.1 TLSv1.2 SSLv3;
        ssl_ciphers HIGH:!aNULL:!MD5;
====================================================
目前还未解决:
FF报错:连接 ****.cn 时发生错误。 无法安全地与对等端通信:没有双方共用的加密算法。 (错误码: ssl_error_no_cypher_overlap)

Chrome报错:A secure connection cannot be established because this site uses an unsupported protocol.
错误代码:ERR_SSL_VERSION_OR_CIPHER_MISMATCH



经同事帮忙查明原因,赶紧记录下:

在服务器/usr/local/nginx/conf/include/下的lvs 配置 lvscheck.****.net_ssl.conf 中  下面这行导致的,原因是FF,chrome不支持SSLv3。

ssl_protocols SSLv3 ;

参照其他正常的服务器修改为:

ssl_protocols      TLSv1 TLSv1.1 TLSv1.2 SSLv3;
批量替换,我是因为顺序写不一致,注意下顺序:


来自:http://blog.sina.com.cn/s/blog_40e1ba640102vctc.html
Chrome还是不行:
http://www.oschina.net/news/56603/chrome-will-disable-sslv3-support
FF:
查看网页信息,连接加密这一行上会有加密凡是,例如百度就是AES-128,进入about:config中搜索AES就可以了。
操作系统每过一定时间就会唤醒kswapd ,看看内存是否紧张,如果不紧张,则睡眠,在 kswapd 中,有2 个阀值, pages_hige和pages_low,当空闲内存页的数量低于 pages_low 的时候, kswapd进程就会扫描内存并且每次释放出32 个free pages,直到 free page 的数量到达pages_high.
通过检查vmstat 的输出结果,发现在那个时间段内,系统的页面换入换成现象很严重。
就是说,问题是内存紧张了,导致了交换分区频繁使用到。kswapd0 进程需要换入换出虚拟内存磁盘空间,导致了系统出现短时间摇摆。
http://mikixiyou.iteye.com/blog/1573976

背景:阿里云的VPS服务器里常常发现有一个Kswapd0的cpu有点高,升级了内核了也很高,于是原来是内存没有释放导致的,https://www.dba-china.com/topic/35:
  PID USER      PR  NI    VIRT    RES    SHR S %CPU %MEM     TIME+        COMMAND
   55 root         20   0       0         0        0 D       6.2  0.0            316:54.64  kswapd0


售后工程师 :  您好,linux 系统cpu占用异常请您参考:
https://help.aliyun.com/knowledge_detail/13129846.html  

ECS如果无法远程连接,可以通过ECS的管理控制台中的“更多操作”里的“连接管理终端”连接服务器。使用方面的帮助,您可以参考:https://help.aliyun.com/document_detail/25433.html  


获得当前系统中运行的最占内存的前10个程序:
ps aux | sort -k 6 -rn | head -n10

kswapd进程,就是虚拟内存管理进程,它的存在和占用CPU,即表明实际可用内存很少;而大量的si,so正是说明了这一点.这确实可能与你设置的内存段不合理有及大的关系。一旦使用到虚拟内存,IO读写一定会成为瓶颈。
http://www.linuxidc.com/wap.aspx?nid=64538&p=1&cp=1&cid=0


设置后还是不行,cpu下不来,只能是云盾了,[求助]阿里云ECScpu使用率经常跑满100%:
https://bbs.aliyun.com/read/260014.html?pos=17
1核  内存1G 带宽2m
网站日IP100+   pv1000+     是小站
我用的wp控制面板  开了每30分钟备份一次数据库。
一个月前出现了一次cpu使用率100%的情况,找了淘宝上的大神 花了30元搞定,他的意思是我开的30分钟一次数据库备份的原因,让我关了。        我没有关。
10天前 又出现了一次cpu使用率跑满的情况,我自己登上阿里云主机,把 云盾 全体体检设置里的  深度扫描 和扫描都关了。cpu使用率立马降了下来。事后几天我又把云盾扫描 打开了。
今天凌晨 又出现一次cpu跑满100%的情况,我刚发现,把 云盾 全体体检设置里的  深度扫描 和扫描都关了  重启了服务器,10分钟后 cpu使用率恢复正常,网站正常。(事实上 我不清楚是重启服务器还是关了云盾扫描的原因才让网站恢复正常打开)


大家给个建议,这种情况 是我的配置低吗(如果是  是增加内存还是弄成双核   注意我的网站日ip100+  pv1000+    )
                                        是我开的每30分钟备份一次数据库的原因吗(我的数据库比较重要,我希望高频次备份,如果有不需要高频次备份的方法 请指出)
                                       是阿里云服务器   云盾  体检扫描的原因吗(我怀疑是,但是我是小白,不代表我的怀疑是正确的)
阿里云的大神们啊  请赐高见!!

这里有一个教程,但改版了,这个关闭功能好像给去了,目前找了下但是没有找到:http://xiedexu.cn/aliyun-close-yundun.htm
发现一个新的东西:服务器安全(安骑士)-->实例列表-->安全设置->有一个IP登录白名单和登录地进行修改的,还可以直接关闭安骑士。


实实在在的提个工单:
售后工程师 :  您的问题我们已收到,会尽快为您查看。请您耐心等待,谢谢  
2016-03-16 11:02:48
售后工程师 :  您好,您可以参考以下说明解释:
http://help.aliyun.com/knowledge_detail/7591195.html  
2016-03-16 11:06:23
jac***@aliyun.com : 这个链接也太大而化之了吧,free -m查看明明还剩下很多内存的啊。请工程师给实际勘察下,多谢了。  
2016-03-16 11:26:02
售后工程师 :  我方转给后端专员查看下,请稍等  
2016-03-16 11:28:35
售后工程师 :  您好,您这样试下
在vim /etc/sysctl.conf中添加
vm.min_free_kbytes = 22528
设置的小点然后sysctl -p生成,之后看下cpu使用情况  
设置后重启后,今天好像好了,但不保证后面会不会好。
查了下:
min_free_kbytes  
/proc/sys/vm/min_free_kbytes
该文件表示强制Linux VM最低保留多少空闲内存(Kbytes)。
32位系统,设vm.min_free_kbytes时,需注意lowmem的值:
http://blog.sina.com.cn/s/blog_69cc2f0b0100z0la.html
______________________________________________________________________________________________________________________
步骤一:设置分为永久和临时设置:
这个设置才好了,下面给的一个彻底取消swap的设置有问题,导致nginx启动不了,php也有些问题,如下:
(1)永久修改: /etc/sysctl.conf

vm.swappiness = 17
vm.min_free_kbytes = 22528
//vm.swappiness=20  //阿里去vps这个值差不多,但容易crontab的内存不段交换不够,一天后左右死机和它相关。

sysctl -p
.          临时性修改:[root@rhce ~]# sysctl vm.swappiness=10

   (2)文件/proc/sys/vm/drop_caches设
置为1
、2、3,设置
多少直到
kswapd0不占用90%以上CPU,得结合前面步骤里的vm.swappiness=20块调整:
开机启动修改(这个玩法感觉没有太大价值,即使防crontab也一样):
/etc/rc.local
#解决kswapd0长期占cpu但剩余的内存还有很多buffer不正常
echo 1 >/proc/sys/vm/drop_caches        [这个设置有一定效果,前面那个vm.swappiness=20,和10感觉根本没效果。]
/usr/sbin/sysctl  vm.swappiness=10  
————————————————————————————————————————————————————————————————

Nginx:
/usr/local/scripts/autoStartNginxEnterSSLKey.sh
nginx: [alert] mmap(MAP_ANON|MAP_SHARED, 134217728) failed (12: Cannot allocate memory)

[root@iZ25dcp92ckZ ngx_fcgi_cache2]# cat /proc/swaps
Filename                                Type            Size    Used    Priority
/swapfile                               file            1048572 0       -1

PHP:
[10-Jan-2016 21:35:21 Asia/Shanghai] PHP Fatal error:  Out of memory (allocated 2097152) (tried to allocate 232245 bytes) in /data/htdocs/jackxiang.com/inc/boblog_class_run.php on line 548


重新分配:http://blog.csdn.net/wxqee/article/details/7970110
步骤一:dd if=/dev/zero of=/swapfile bs=2048 count=131072   (257M)
            dd if=/dev/zero of=/swapfile bs=2048 count=196608   (385M)
            dd if=/dev/zero of=/swapfile bs=2048 count=262144   (512M)
            dd if=/dev/zero of=/swapfile bs=2048 count=327680   (641M)
            dd if=/dev/zero of=/swapfile bs=2048 count=589824    (1.2G)
            dd if=/dev/zero of=/swapfile bs=2048 count=720896    (1.4G)

在root提示符下,键入下面的命令,其中count大小等于所要求的块大小:
dd if=/dev/zero of=/swapfile bs=1024 count=65536
记录了1024+0 的读入
记录了1024+0 的写出
1073741824字节(1.1 GB)已复制,21.6104 秒,49.7 MB/秒
步骤二:mkswap /swapfile
[root@iZ25dcp92ckZ ngx_fcgi_cache2]# mkswap swapfile
[root@iZ25dcp92ckZ ~]# mkswap /swapfile
正在设置交换空间版本 1,大小 = 262140 KiB
无标签,UUID=80386ab9-4ce9-4608-8bd6-3315e80a212e
步骤三:swapon /swapfile  立即生效
[root@iZ25dcp92ckZ ngx_fcgi_cache2]# swapon swapfile
[root@iZ25dcp92ckZ ~]# swapon /swapfile
swapon: /swapfile:不安全的权限 0644,建议使用 0600。
[root@iZ25dcp92ckZ ~]# chmod 0600 /swapfile
步骤四:/swapfile    swap    swap    defaults    0 0
在每次开机的时候自动加载swap文件, 需要在 /etc/fstab 文件中增加一行:
/swapfile    swap    swap    defaults    0 0
步骤五:检查是否成功
cat /proc/swaps 或者free命令的输出来查看swap是否已打开。
[root@iZ25dcp92ckZ ~]# cat /proc/swaps
Filename                                Type            Size    Used    Priority
/swapfile                               file            262140  0       -1
步骤六:建立错位置了,先停止swap分区并删除掉
1)先停止swap分区:
swapoff  /swapfile
2)删除掉分区:
rm -Rf /swapfile
3)从fstab里删除掉:
修改/etc/fstab文件,把/swapfile    swap    swap    defaults    0 0 这行删除。这样就能把手动增加的分区删除了。


请使用RHEL/CentOS 6.4及更新版本内核的MySQL同志们注意,vm.swappiness = 0的默认行为修改了,如果继续设置vm.swappiness = 0,有可能导致系统内存溢出,从而导致MySQL被意外kill掉。
扩展swap分区:http://blog.sina.com.cn/s/blog_779eecd8010124ta.html
在ubuntu 里面,swappiness的值的大小对如何使用swap分区是有着很大的联系的。swappiness=0的时候表示最大限度使用物理内存,然后才是 swap空间,swappiness=100的时候表示积极的使用swap分区,并且把内存上的数据及时的搬运到swap空间里面。两个极端,对于ubuntu的默认设置,这个值等于60,建议修改为10。具体这样做:
1.查看你的系统里面的swappiness
$ cat /proc/sys/vm/swappiness
不出意外的话,你应该看到是 60
2.修改swappiness值为10
$ sudo sysctl vm.swappiness=10
但是这只是临时性的修改,在你重启系统后会恢复默认的60,所以,还要做一步:
$ gksudo gedit /etc/sysctl.conf
在这个文档的最后加上这样一行:
vm.swappiness=10

来自:http://blog.csdn.net/tianlangxiaoyue/article/details/7249484

http://blog.csdn.net/zhsh87/article/details/8954493

_________________________________________________________________________________________________________

1.kswapd0
Linux uses kswapd for virtual memory management such that pages that have been recently accessed are kept in memory and less active pages are paged out to disk.
(what is a page?)…Linux uses manages memory in units called pages.
So,the kswapd process regularly decreases the ages of unreferenced pages…and at the end they are paged out(moved out) to disk
系统每过一定时间就会唤醒kswapd,看看内存是否紧张,如果不紧张,则睡眠,在kswapd中,有2个阀值,pages_hige和pages_low,当空闲内存页的数量低于pages_low的时候,kswapd进程就会扫描内存并且每次释放出32个free pages,直到free page的数量到达pages_high.


内存16G,但buffer就占了11G之多,cache很少,不仅这样,swap也被占用了一部分,而且总在交换(kswapd0一直占cpu90%以上)。
服务器上只有apache和nfsd服务。用作图片服务器。
buffer占的内存无法回收(用命令:echo 3 >/proc/sys/vm/drop_caches)
Linux下清理内存和Cache方法,Linux下清理内存和Cache方法,修改/etc/sysctl.conf 添加如下选项后就不会内存持续增加,这个设置有问题导致nginx和Php出现问题别千万直接粘贴:

如何让/etc/sysctl.conf修改永久生效:
写入到/etc/sysctl.conf就已经永久生效了,如果要让刚写入的立即也生效可以执行以下sysctl -p.
更多值:http://www.linuxidc.com/Linux/2010-03/24939.htm
阅读全文
背景:http2是一个二进制协议:调试这样的协议将需要curl这样的工具,要进一步地分析网络数据流需要类似Wireshark的http2解析器。
键是浏览器的支持非常好,无论开多少标签页,都是复用1个链接。高版本IE也是支持的。http2还要一段时间才能铺开。

HTTP/2笔记之流和多路复用:
http://www.blogjava.net/yongboy/archive/2015/03/19/423611.aspx

除开头压缩外,还有省流量还有:
哈夫曼编码更安全:
HTTPS和SPDY的压缩机制被发现有受BREACH和CRIME攻击的隐患。通过向流中注入一些已知的文本来观察输出的变化,攻击者可以推出原始发送的数据。
为协议的动态内容进行压缩并使其免于被攻击,需要仔细且全面的考虑。而这正是HTTPbis小组尝试去做的。
HPACK,HTTP/2头部压缩,顾名思义它是一个专为http2头部设计的压缩格式。确切的讲,它甚至被制定写入在另外一个单独的草案里。新的格式同时引入了一些其他对策让破解压缩变得困难,例如采用帧的可选填充和用一个bit作为标记,来让中间人不压缩指定的头部。
用Roberto Peon(HPACK的设计者之一)的话说,“HPACK旨在提供一个一致性的实现使信息量的损失尽可能少,使编解码快速而方便,使接收方能控制压缩文本的大小,允许代理重新建立索引(如,通过代理在前后端共享状态),以及对哈夫曼编码串的更快速比较”。

发出content-lenth可后悔:
HTTP 1.1的有一个缺点是:当一个含有确切值的Content-Length的HTTP消息被送出之后,你就很难中断它了。当然,通常你可以断开整个TCP链接(但也不总是可以这样),但这样导致的代价就是需要重新通过三次握手建立一个新的TCP连接。
一个更好的方案是只终止当前传输的消息并重新发送一个新的。在http2里面,我们可以通过发送RST_STREAM帧来实现这种需求,从而避免浪费带宽和中断已有的连接。



HTTP2讲解:
http://www.kancloud.cn/kancloud/http2-explained/49803

HTTP2技术变革的冲击和影响分析:
http://blog.csdn.net/jiayanhui2877/article/details/45395771


Http2.0的RFC文档,有兴趣可以去看看:
http://httpwg.org/specs/rfc7540.html
Raspberry Pi在FreeBSD下试图编译swoole扩展出现如下问题:
root@rpi2:~/software/swoole-src-swoole-1.8.1-stable # phpize
Configuring for:
PHP Api Version:         20131106
Zend Module Api No:      20131226
Zend Extension Api No:   220131226
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.

解决办法:
pkg install autoconf
pkg install m4

重新编译:
root@rpi2:~/software/swoole-src-swoole-1.8.1-stable # phpize
root@rpi2:~/software/swoole-src-swoole-1.8.1-stable # ./configure
root@rpi2:~/software/swoole-src-swoole-1.8.1-stable # make && make install
/usr/local/include/php/ext/pcre/php_pcre.h:29:10: fatal error: 'pcre.h' file not found

其实这是由于缺少了pcre开发包所导致的,既然缺少那就装上吧:-),我是在Debian环境下当然想通过apt-get这个命令解决问题了,不过搜索了网络,只找到了CentOS的yum命令:
yum update
yum install pcre-devel
好吧,我只有依葫芦画瓢,把yum直接改成apt-get,不过apt-get install pcre-devel这步出错了,找不到包,仔细搜索了网络才知道,原来Debian系下不叫这个名字,正确的命令如下:
apt-get update
apt-get install libpcre3 libpcre3-dev
这样折腾一下,然后再pecl install apc一次,好了,成功安装了!
FreeBSD呢? 试一试:pkg install  pcre-devel  发现没有于是再度下:pkg install libpcre3 libpcre3-dev ,也没有。
看下pcre有没有最新,再看下:
root@rpi2:~/software/swoole-src-swoole-1.8.1-stable # pkg install pcre
Updating rpi repository catalogue...
rpi repository is up-to-date.
All repositories are up-to-date.
Checking integrity... done (0 conflicting)
The most recent version of packages are already installed
于是按:mac 10.10.3下安装Swoole扩展,提示pcre.h文件找不到:https://segmentfault.com/q/1010000002886696

正如@韩天峰 所说,你需要pcre扩展库文件,按照swoole的默认安装,程序会在/usr/local以及php include_path里面取搜索,事实上在安装pcre的时候你已经安装了这个库文件。

大概的位置/opt/local/include/pcre.h,所以你需要做一个软链
sudo ln -s /opt/local/include/pcre.h /usr/include/

如果没在这个位置你就搜索一下find / -name pcre,然后软链过去


真正实践OK的办法是:
./configure --with-php-config=/usr/local/bin/php-config  //这样也是不行的。
root@rpi2:/ # find . -name "pcre.h"
./usr/local/include/pcre.h
这行是关键:
ln -s /usr/local/include/pcre.h   /usr/include/pcre.h
就可以编译通过了,并生成了swoole.so,如下:
----------------------------------------------------------------------

Build complete.
Don't forget to run 'make test'.

Installing shared extensions:     /usr/local/lib/php/20131226-zts/
root@rpi2:~/software/swoole-src-swoole-1.8.1-stable # ls /usr/local/lib/php/20131226-zts/
swoole.so


root@rpi2:/usr/local/etc # cp php.ini-development php.ini
extension=swoole.so
root@rpi2:/usr/local/etc # php -m
[PHP Modules]
swoole

试一下程序:

httpServer.php: new file: 17 lines, 451 characters.
root@rpi2:~/php # php httpServer.php
[2016-02-18 06:46:50 @13407.0]  WARN    swSocket_set_buffer_size(:333): setsockopt(3, SOL_SOCKET, SO_SNDBUF, 8388608) failed. Error: No buffer space available[55].
[2016-02-18 06:46:50 @13407.0]  WARN    swSocket_set_buffer_size(:333): setsockopt(4, SOL_SOCKET, SO_SNDBUF, 8388608) failed. Error: No buffer space available[55].
[2016-02-18 06:46:50 @13407.0]  WARN    swSocket_set_buffer_size(:333): setsockopt(5, SOL_SOCKET, SO_SNDBUF, 8388608) failed. Error: No buffer space available[55].
[2016-02-18 06:46:50 @13407.0]  WARN    swSocket_set_buffer_size(:333): setsockopt(6, SOL_SOCKET, SO_SNDBUF, 8388608) failed. Error: No buffer space available[55].
[2016-02-18 06:46:50 @13407.0]  WARN    swSocket_set_buffer_size(:333): setsockopt(7, SOL_SOCKET, SO_SNDBUF, 8388608) failed. Error: No buffer space available[55].
[2016-02-18 06:46:50 @13407.0]  WARN    swSocket_set_buffer_size(:333): setsockopt(8, SOL_SOCKET, SO_SNDBUF, 8388608) failed. Error: No buffer space available[55].
[2016-02-18 06:46:50 @13407.0]  WARN    swSocket_set_buffer_size(:333): setsockopt(9, SOL_SOCKET, SO_SNDBUF, 8388608) failed. Error: No buffer space available[55].
[2016-02-18 06:46:50 @13407.0]  WARN    swSocket_set_buffer_size(:333): setsockopt(10, SOL_SOCKET, SO_SNDBUF, 8388608) failed. Error: No buffer space available[55].


root@rpi2:~/php # netstat
Active Internet connections
Proto Recv-Q Send-Q Local Address          Foreign Address        (state)
tcp4      78      0 localhost.9502         localhost.24050        CLOSE_WAI

root@rpi2:~/php # telnet localhost 9502
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.

root@rpi2:~/php # curl "http://127.0.0.1:9502"
出现:
php httpServer.php
[2016-02-18 06:55:17 #13407.0]  WARN    swServer_signal_hanlder: Fatal Error: manager process exit. status=0, signal=0.
[2016-02-18 06:55:23 $13408.0]  WARN    swManager_check_exit_status: worker#2 abnormal exit, status=0, signal=11
[2016-02-18 06:55:31 $13408.0]  WARN    swManager_check_exit_status: worker#1 abnormal exit, status=0, signal=11
[2016-02-18 06:55:38 $13408.0]  WARN    swManager_check_exit_status: worker#0 abnormal exit, status=0, signal=11
[2016-02-18 06:55:42 $13408.0]  WARN    swManager_check_exit_status: worker#2 abnormal exit, status=0, signal=11
——————————————缺少安装包来自———————————————————————
运行/usr/local/webserver/php/bin/phpize时出现:
Configuring for:
PHP Api Version:         20041225
Zend Module Api No:      20060613
Zend Extension Api No:   220060519
Cannot find autoconf. Please check your autoconf installation and the
$PHP_AUTOCONF environment variable. Then, rerun this script.
根据网上的解决办法是:

# cd /usr/src
# wget http://ftp.gnu.org/gnu/m4/m4-1.4.9.tar.gz
# tar -zvxf m4-1.4.9.tar.gz
# cd m4-1.4.9/
# ./configure && make && make install
# cd ../
# wget http://ftp.gnu.org/gnu/autoconf/autoconf-2.62.tar.gz
# tar -zvxf autoconf-2.62.tar.gz
# cd autoconf-2.62/
# ./configure && make && make install
更简单的办法
# yum install m4
# yum install autoconf

来自:http://blog.csdn.net/21aspnet/article/details/7471574

1. 现象
放假期间收到zabbix报警,提示主站访问不了,报502。

2.排查思路及过程
因为是过年休息,放假前又没有更新,基本可以排除是更新和配置导致的问题。ssh连上服务器发现服务器连接和资源都没问题。这是一套lnamp架构的网站,就是nginx反向代理到Apache,所以考虑是Apache的问题,于是重启httpd服务。

重启httpd服务的时候启动失败,没有看到错误,所以去查看日志文件,看到如下报错:
tail -200 /var/log/httpd/error_log

[TIME 2016] [error] SSL Library Error: -8181 Certificate has expired
[TIME 2016] [error] Unable to verify certificate 'Server-Cert'. Add "NSSEnforceValidCerts off" to nss.conf so the server can start until the problem can be resolved.
可以看到是证书过期了,并且给出了一种解决方法是添加‘NSSEnforceValidCerts off’到nss.conf服务器就可以启动,就是不验证证书过期时间。

Apache是用https需要mod_nss的模块支持,我的理解就是使用https需要安装mod_nss,下面给一个官方说明:
   The mod_nss module provides strong cryptography for the Apache Web server via the Secure Sockets Layer (SSL) and Transport Layer Security (TLS) protocols using the Network Security Services (NSS) security library.

我的解决方法是重新生成新的证书
cd /etc/httpd/alias
#删除旧的证书
rm -f *.db
#创建新证书
/usr/sbin/gencert /etc/httpd/alias > /etc/httpd/alias/install.log 2>&1
#查看证书信息
certutil -d /etc/httpd/alias -L -n Server-Cert
Certificate:
Data:
    Version: 3 (0x2)
    Serial Number: 3 (0x3)
    Signature Algorithm: PKCS #1 SHA-1 With RSA Encryption
    Issuer: "CN=Certificate Shack,O=example.com,C=US"
    Validity:
        Not Before: Mon Feb 15 02:05:10 2016
        Not After : Sat Feb 15 02:05:10 2020
现在可以看到证书的有效期是4年,新生成的证书到2020年过期。httpd服务可以正常启动。

启动httpd服务后发现首页还是不能访问,可以确认服务都正常启动配置没有问题。继续查看httpd的错误日志发现了新的报错:
[TIME 2016] [error] SSL Library Error: -8038 SEC\_ERROR\_NOT\_INITIALIZED  
[TIME 2016] [error] NSS_Initialize failed. Certificate database: /etc/httpd/alias.

百度了下发现是权限问题,重新授下权搞定。
chown root.apache /etc/httpd/alias/*.db
chmod 0640 /etc/httpd/alias/*.db

摘自解决一次由于SSL证书到期导致的网站不能访问的问题(Nginx,php,Apache):http://branguo.blog.51cto.com/9768383/1742157
背景:Raspberry Pi下的FreeBSD关机时候出现:

========================================================
刚搞uboot 学习下 写下来这些自己的小经验
我的终端用的是SecureCRT.exe
烧写uboot后 提示 Hit any key to stop autoboot : 几秒后 aoto运行
如果没有设置好 按键是没有用的 解决方法是:
选择 你打开的串口的会话设置  再选择 键映射  当然还有其他的方法 这里你映射几个键 既可以了

来自:http://blog.sina.com.cn/s/blog_6b94d5680100ms8g.html
SecureCRT 更改键盘映射功能 : http://blog.chinaunix.net/uid-20773865-id-4040702.html
背景:在Raspberry Pi上装了一个FreeBSD,之前是linux,用ssh连接时出现问题,这个ssh其实linux上也是一样的,于是按linux上的办法解决了该问题,重启动sshd后,用我的手机重新ssh到Raspberry pi上,提示error消失,连接正常。
root@rpi2:/usr/local # Feb 18 03:50:39 rpi2 sshd[4917]: error: Could not load host key: /etc/ssh/ssh_host_dsa_key
魅族手机ssh访问:
Feb 18 03:50:41 rpi2 sshd[4917]: error: PAM: authentication error for root from meizu-mx4-pro.lan

Could not load host key: /etc/ssh/ssh_host_dsa_key,那就生成这个key:
root@rpi2:/usr/local # ssh-keygen -t dsa -f /etc/ssh/ssh_host_dsa_key
Generating public/private dsa key pair.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /etc/ssh/ssh_host_dsa_key.
Your public key has been saved in /etc/ssh/ssh_host_dsa_key.pub.
The key fingerprint is:
SHA256:0gV9unsS+HmqgE0j45aqtNQVhVsYNUiX2pgBbbmBLbM root@rpi2
The key's randomart image is:
+---[DSA 1024]----+
|   .*oB=o.       |
|   + @oo... .    |
|    =.@   .o     |
|   E *.o ..      |
|    o.+ S. .     |
|  ...B o. o      |
| o .= o  . +     |
|o .o   .  = o    |
|.o.     ...=     |
+----[SHA256]-----+

重新启动ssh服务:
root@rpi2:/usr/local # /etc/rc.d/sshd restart
Performing sanity check on sshd configuration.
Could not load host key: /etc/ssh/ssh_host_dsa_key
Stopping sshd.
Waiting for PIDS: 799.
Performing sanity check on sshd configuration.
Could not load host key: /etc/ssh/ssh_host_dsa_key
Starting sshd.



参考自:http://blog.163.com/zhengjiu_520/blog/static/3559830620118851822482/
分页: 15/245 第一页 上页 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 下页 最后页 [ 显示模式: 摘要 | 列表 ]