工作笔记



yii2请求生命周期
以下图表展示了一个应用如何处理请求:


请求生命周期


用户向入口脚本 web/index.php 发起请求。
入口脚本加载应用配置 并创建一个应用实例去处理请求。
应用通过请求组件 解析请求的路由。
应用创建一个控制器实例去处理请求。
控制器创建一个动作实例并针对操作执行过滤器。
如果任何一个过滤器返回失败,则动作取消。
如果所有过滤器都通过,动作将被执行。
动作会加载一个数据模型,或许是来自数据库。
动作会渲染一个视图,把数据模型提供给它。
渲染结果返回给响应组件。
响应组件发送渲染结果给用户浏览器。


-------------
Ctrl + Enter      智能线分割(HTML和JavaScript)
Shift + Enter     开始新的生产线
ALT+ ←/→  切换代码视图,标签切换
ALT+ ↑/↓  在方法间快速移动定位


ctrl + '-/+': 可以折叠项目中的任何代码块,
alt + '7': 显示当前的类/函数结构。类似于eclipse中的outline的效果。


熟悉redis和sphinx
session ,cookie ,request,response,admindb,component,
------------------
$headers = Yii::$app->response->headers;
$headers->add("snowname","snow");


 Event::on(\yii\web\response::className(),\yii\web\response::EVENT_BEFORE_SEND,function($event){
            echo "before send";
        });
发送响应
在yii\web\Response::send() 方法调用前响应中的内容不会发送给用户, 该方法默认在yii\base\Application::run() 结尾自动调用,尽管如此,可以明确调用该方法强制立即发送响应。


yii\web\Response::send() 方法使用以下步骤来发送响应:


触发 yii\web\Response::EVENT_BEFORE_SEND 事件.
调用 yii\web\Response::prepare() 来格式化 response data 为 response content.
触发 yii\web\Response::EVENT_AFTER_PREPARE 事件.
调用 yii\web\Response::sendHeaders() 来发送注册的HTTP头
调用 yii\web\Response::sendContent() 来发送响应主体内容
触发 yii\web\Response::EVENT_AFTER_SEND 事件.


返回JSON格式数据
$response = Yii::$app->response;
$response->format = \yii\web\Response::FORMAT_JSON;
$response->data = ['message' => 'hello world'];
-----------------


----------------
502错误解决方法


http://down.chinaz.com/server/201105/576_1.htm
--------------------------------------------------
gulp详细入门教程
http://www.ydcss.com/archives/18#lesson5
---------yii2 rules----------------


array('dev_mac', 'match', 'pattern' => '/^[A-F0-9]+$/'),
['verificationCode', 'captcha']; #说明:CCaptchaValidator 的别名,确保了特性的值等于 CAPTCHA 显示出来的验证码. 
['age', 'compare', 'compareValue' => 30, 'operator' => '>=']; #说明:compareValue(比较常量值) - operator(比较操作符)  #说明:CCompareValidator 的别名,确保了特性的值等于另一个特性或常量. 


[['username', 'email'], 'filter', 'filter' => 'trim', 'skipOnArray' => true]; #说明:CFilterValidator 的别名, 使用一个filter转换属性. 
['level', 'in', 'range' => [1, 2, 3]]; #说明:CRangeValidator 的别名,确保了特性出现在一个预订的值列表里. 
['username', 'unique'] #说明:CUniqueValidator 的别名,确保了特性在数据表字段中是唯一的. 
[['from', 'to'], 'date'];
['username', 'string', 'length' => [4, 24]];


------------------------ beanstalkd----
 beanstalkd消息队列在生产环境的应用
 http://www.te.gd/extension/yii2-beanstalk/
 
 get_called_class 
 get_class
 array_pop
 $app->language = Yii::$app->session->get("language");
  补充:Yii 提供了相当多类似的小部件去帮你生成复杂且动态的视图。
  在后面你还会了解到自己写小部件是多么简单。你可能会把自己的很多视图代码转化成小部件以提高重用,加快开发效率。
--------------------yii2分页-----
下面小伙为大家介绍第二种分页方法:


控制器 CommentController 里面的任意一个方法,在这里我的方法是 actionComment();


<?php


use yii\data\Pagination;
use app\models\Comment;


  public function actionComment(){
       $data = Comment::find()->andWhere(['id' => '10']);
       $pages = new Pagination(['totalCount' =>$data->count(), 'pageSize' => '2']);
       $model = $data->offset($pages->offset)->limit($pages->limit)->all();
       
       return $this->render('comment',[
             'model' => $model,
             'pages' => $pages,
       ]);
  }
?>
好的,到这里,控制器部分基本就结束了。我们接续看 view 里面的代码:


Comment.php 文件代码如下所示


<?php


use yii\widgets\LinkPager;
?>


      foreach($model as $key=>$val)
      {
           这里就是遍历数据了,省略......
      }


      <?= LinkPager::widget(['pagination' => $pages]); ?>
-------------------------------------


-----------------分页-------------
 public function actionComment(){
       $data = Comment::find()->andWhere(['id' => '10']);
       $pages = new Pagination(['totalCount' =>$data->count(), 'pageSize' => '2']);
       $model = $data->offset($pages->offset)->limit($pages->limit)->all();
       
       return $this->render('comment',[
             'model' => $model,
             'pages' => $pages,
       ]);
  }
  
  
      foreach($model as $key=>$val)
      {
           这里就是遍历数据了,省略......
      }


      <?= LinkPager::widget(['pagination' => $pages]); ?>
-----------------------------------
php://input 是个只读流,用于获取请求体。  php://input 是个可以访问请求的原始数据的只读流
php://input 是返回整个HTTP请求中,除去HTTP头部的全部原始内容, 而不管是什么Content Type(或称为编码方式)。 相比较之下, $_POST 只支持 application/x-www-form-urlencoded 和 multipart/form-data-encoded 两种Content Type。其中前一种就是简单的HTML表单以 method="post" 提交时的形式, 后一种主要是用于上传文档。因此,对于诸如 application/json 等Content Type,这往往是在AJAX场景下使用, 那么使用 $_POST 得到的是空的内容,这时就必须使用 php://input 。
相比较于 $HTTP_RAW_POST_DATA , php://input 无需额外地在php.ini中 激活 always-populate-raw-post-data ,而且对于内存的压力也比较小。
当编码方式为 multipart/form-data-encoded 时, php://input 是无效的。这种情况一般为上传文档。 这种情况可以使用传统的 $_FILES 或者 yii\web\UploadedFile 。


1, php://input 可以读取http entity body中指定长度的值,由Content-Length指定长度,不管是POST方式或者GET方法提交过来的数据。但是,一般GET方法提交数据 时,http request entity body部分都为空。 
2,php://input 与$HTTP_RAW_POST_DATA读取的数据是一样的,都只读取Content-Type不为multipart/form-data的数据。
学习笔记
 1,Coentent-Type仅在取值为application/x-www-data-urlencoded和multipart/form-data两种情况下,PHP才会将http请求数据包中相应的数据填入全局变量$_POST 
 2,PHP不能识别的Content-Type类型的时候,会将http请求包中相应的数据填入变量$HTTP_RAW_POST_DATA 
 3, 只有Coentent-Type为multipart/form-data的时候,PHP不会将http请求数据包中的相应数据填入php://input,否则其它情况都会。填入的长度,由Coentent-Length指定。 
 4,只有Content-Type为application/x-www-data-urlencoded时,php://input数据才跟$_POST数据相一致。 
 5,php://input数据总是跟$HTTP_RAW_POST_DATA相同,但是php://input比$HTTP_RAW_POST_DATA更凑效,且不需要特殊设置php.ini 
 6,PHP会将PATH字段的query_path部分,填入全局变量$_GET。通常情况下,GET方法提交的http请求,body为空。


---------
http://blog.csdn.net/u012979009/article/details/51611013 
yii2框架-formatter格式化(九)






硬弹和软弹区别?
要每个3个月清理一下订阅人列表,避免触发垃圾邮件陷进。
Generitech 立刻删除了John的企业邮箱地址,但是过了几年,这家公司被垃圾邮件骚扰的不胜其烦,于是他们重新启用了John的邮箱地址作为垃圾邮件陷阱使用


垃圾邮件陷阱是绝对不会订阅任何邮件的
我们认为,最佳的解决方案就是在第一次订阅邮件时,采取双重确认策略。这不仅是保证用户输入正确邮件地址的好办法,也可以保证用户是真心实意的希望收到你的邮件。


哦对了,千万千万别花钱买邮件地址,我可是认真的。


EDM系统主要功能是集合各网站用户数据,定期给用户发送相应的促销、邀请、广告等邮件。
EDM测试机

加密
http://www.2cto.com/article/201505/399598.html
-=-------------------------------
yii2-redis在使用时,有时会不稳定,经常报错,错误指向: 
Connection.php的 386行:


    /**
     * @param string $command
     * @return mixed
     * @throws Exception on error
     */
    private function parseResponse($command)
    {
        if (($line = fgets($this->_socket)) === false) {
            throw new Exception("Failed to read from socket.\nRedis command was: " . $command);
        }


解决方法: 
修改php.ini,设置: 
default_socket_timeout = -1


可以在index.php入口处加:


<?php
ini_set('default_socket_timeout', -1);


----------------------------
(想要了解海外买家的付费习惯和快速接入全球各国的本土支付方式,请咨询payssion官网或关注微信公号:payssion)

------------
整个句子的后面部分就是操作的具体内容。


lynx -dump https://www.yourdomain.com/script.php


00 */2 * * *  curl -i  http://www.yourdomain.com/script.php


意思就是说通过lynx访问这个url。我们在使用中主要用到lynx、curl、wget来实现对url的远程访问,而如果要提高效率,直接用php去执行本地php文件是最佳选择,例如:


00 */2 * * * /usr/local/bin/php /home/www/script.php


测试请求只返回http状态码:
curl -I -m 10 -o /dev/null -s -w %{http_code} www.baidu.com


查看磁盘空间信息


# df -h


系统盘的使用率是 94%,块空间没满


再看inode使用情况


# df -i


系统盘的Inodes使用率100%


没Inodes可用空间,自然干啥都有问题,现在最紧急的就是清理空间


------------------
批量杀死进程


ps -x|grep worker|grep -v grep |cut -c 1-6|xargs kill -9

------------------信号处理
signal(SIGHUP, SIG_IGN);
signal信号函数,第一个参数表示需要处理的信号值(SIGHUP),第二个参数为处理函数或者是一个表示,这里,SIG_IGN表示忽略SIGHUP那个注册的信号。
SIGHUP
和控制台操作有关,当控制台被关闭时系统会向拥有控制台sessionID的所有进程发送HUP信号,默认HUP信号的action是 
exit,如果远程登陆启动某个服务进程并在程序运行时关闭连接的话会导致服务进程退出,所以一般服务进程都会用nohup工具启动或写成一个 daemon




signal(SIGPIPE, SIG_IGN)  


当服务器close一个连接时,若client端接着发数据。根据TCP 协议的规定,会收到一个RST响应,client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,告诉进程这个连接已经断开了,不要再写了。 
  根据信号的默认处理规则SIGPIPE信号的默认执行动作是terminate(终止、退出),所以client会退出。若不想客户端退出可以把SIGPIPE设为SIG_IGN 
  如:    signal(SIGPIPE,SIG_IGN); 
  这时SIGPIPE交给了系统处理。 
  服务器采用了fork的话,要收集垃圾进程,防止僵尸进程的产生,可以这样处理: 
  signal(SIGCHLD,SIG_IGN); 交给系统init去回收。 
  这里子进程就不会产生僵尸进程了。 
-------------------
or create a new repository on the command line


echo "# jobManager" >> README.md
git init
git add README.md
git commit -m "first commit"
git remote add origin git@github.com:snowonbridge/jobManager.git
git push -u origin master
…or push an existing repository from the command line


git remote add origin git@github.com:snowonbridge/jobManager.git
git push -u origin master






----------------------
http://www.th7.cn/db/mysql/201607/195660.shtml mysql经典问题解决
-----------------------


    SIGTSTP与SIGSTOP都是使进程暂停(都使用SIGCONT让进程重新激活)。唯一的区别是SIGSTOP不可以捕获。
捕捉SIGTSTP后一般处理如下:
1)处理完额外的事
2)恢复默认处理
3)发送SIGTSTP信号给自己。(使进程进入suspend状态。)




getimagesize() 函数用于获取图像尺寸,类型等信息。
imagesx() 函数用于获取图像的宽度。
imagesy() 函数用于获取图像的高度。
返回结果说明
索引 0 给出的是图像宽度的像素值
索引 1 给出的是图像高度的像素值
索引 2 给出的是图像的类型,返回的是数字,其中1 = GIF,2 = JPG,3 = PNG,4 = SWF,5 = PSD,6 = BMP,7 = TIFF(intel byte order),8 = TIFF(motorola byte order),9 = JPC,10 = JP2,11 = JPX,12 = JB2,13 = SWC,14 = IFF,15 = WBMP,16 = XBM
索引 3 给出的是一个宽度和高度的字符串,可以直接用于 HTML 的 <image> 标签
索引 bits 给出的是图像的每种颜色的位数,二进制格式
索引 channels 给出的是图像的通道值,RGB 图像默认是 3
索引 mime 给出的是图像的 MIME 信息,此信息可以用来在 HTTP Content-type 头信息中发送正确的信息,如:
header("Content-type: image/jpeg");
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值