轮询和长轮询

  1. 轮询:客户端定时向服务器发送Ajax请求,服务器接到请求后马上返回响应信息并关闭连接。
    优点:后端程序编写比较容易。
    缺点:请求中有大半是无用,浪费带宽和服务器资源。
    实例:适于小型应用。
  2. 长轮询:客户端向服务器发送Ajax请求,服务器接到请求后hold住连接,直到有新消息才返回响应信息并关闭连接,客户端处理完响应信息后再向服务器发送新的请求。
    优点:在无消息的情况下不会频繁的请求。
    缺点:服务器hold连接会消耗资源。
    实例:WebQQ、Hi网页版、Facebook IM。

另外,对于长连接和socket连接也有区分:

  1. 长连接:在页面里嵌入一个隐蔵iframe,将这个隐蔵iframe的src属性设为对一个长连接的请求,服务器端就能源源不断地往客户端输入数据。
    优点:消息即时到达,不发无用请求。
    缺点:服务器维护一个长连接会增加开销。
    实例:Gmail聊天
  2. Flash Socket:在页面中内嵌入一个使用了Socket类的 Flash 程序JavaScript通过调用此Flash程序提供的Socket接口与服务器端的Socket接口进行通信,JavaScript在收到服务器端传送的信息后控制页面的显示。
    优点:实现真正的即时通信,而不是伪即时。
    缺点:客户端必须安装Flash插件;非HTTP协议,无法自动穿越防火墙。
    实例:网络互动游戏。

以上是四种请求方式的介绍和优缺点比较。

php 编码习惯

习惯的力量

命名非常重要

适当的使用注释

使用一个变量,需要初始化

function getDocs($id){

$ids = implode(“,”,$id);

$query = $this->db->query(“SELECT  *  FROM doc WHERE id IN($ids)”);

while($doc=$this->dv->fetch_array($query)){

$doc[‘rawtitle’]=$doc[‘title’];

$doc[‘title’]=htmlspecialchars($doc[‘title’]);

$docs[]=$doc;

}

return $docs;

//代码问题,如果数据库查不到数据会返回未定义。所以最好先定义 $docs=[]

}

优先使用单引号

$row[‘id’]的效率是$row[id]的7倍,默认id会去常量里边找

$user = array()

if(0=$uid){

$user[‘uid’]=0;

$user[‘groupid’]=0;

}else{

$user=$this->getUserByid($uid);

} //常量写前边,变量写后边容易发现错误

防御式编程思想

用自己可控的环境参数

  • 明确包含文件的路径
  • 给予恰当的默认值
  • 自定义错误报警的级别
  • 不依赖系统环境参数,程序要动态了解所处的环境

PHP结束标记可以省略

纯PHP代码不要结束  //end of file代替

嵌入式的代码必须要有结束标记

header头的编码

坚持字符编码统一

$phpcoding=PHP文件编码;

$tplcoding=模板编码;

$mysqlcoding = 数据库编码;

$phpcoding == $tplcoding==$mysqlcoding

error_reporting(7)

1:   E_ERROR

2:  E_WARNING

3: E_PARSE

杜绝

优先使用PHP内置函数

filter_var(‘zh851122@126.com’,FILTER_VALIDATE_EMALL);  //验证邮箱

get_extension($filename){

return_pathinfo($filename,PATHINFO_EXTENSION);

}

usort–使用用户自定义的比较函数对数组中的值进行排序

rawurlencode –按照RFC  1 738 对url 进行编码

parse_url–解析URL,返回其组成部分

http_build_query –生成URL-encode之后的请求字符串

exif_imagetype–判断一个图像的类型

levenshtein –计算两个字符串之间的编辑距离

uniqid–生成一个唯一id

get_browser –获取浏览器具有的功能

get_definen_vars–返回有所有已定义变量所组成的数组

str_word_count–返回字符串中单词的使用情况

laravel artisan命令 学习

c:\wamp\www\lv5>php artisan list

Laravel Framework version 5.0.13

Usage:

[options] command [arguments]

Options(选项):

–help (-h) Display this help message

                显示帮助信息

–quiet (-q) Do not output any message

                不输出任何消息

–verbose (-v|vv|vvv) Increase the verbosity of messages:

                1 for normal output, 2 for more verbose output and 3 for debug 

                增加冗长的消息:1 正常输出 2 更加详细的输出 3调试输出

–version (-V) Display this application version

                显示此应用程序的版本

–ansi Force ANSI output

                 强制用 ANSI码输出

–no-ansi Disable ANSI output

                 禁用用 ANSI码输出

–no-interaction (-n) Do not ask any interactive question

                不要问任何交互式问题

–env The environment the command should run under.

                在环境命令下运行

Available commands(可用的命令):

clear-compiled Remove the compiled class file

                清除编译后的类文件

down Put the application into maintenance mode

                使应用程序进入维修模式

env Display the current framework environment

                显示当前框架环境

fresh Remove the scaffolding included with the framework

            清楚包含框架外的支架

help Displays help for a command

            显示命令行的帮助

inspire Display an inspiring quote

                显示一个启发灵感的引用

list Lists commands

            列出命令

migrate Run the database migrations

             运行数据库迁移

optimize Optimize the framework for better performance

            为了更好的框架去优化性能

serve Serve the application on the PHP development server

            在php开发服务器中服务这个应用

tinker Interact with your application

            在你的应用中交互

up Bring the application out of maintenance mode

            退出应用程序的维护模式

app

app:name Set the application namespace

            设置应用程序命名空间

auth

auth:clear-resets Flush expired password reset tokens

                清除过期的密码重置密钥

cache

cache:clear Flush the application cache

            清除应用程序缓存

cache:table Create a migration for the cache database table

            创建一个缓存数据库表的迁移

config

config:cache Create a cache file for faster configuration loading

            创建一个加载配置的缓存文件 

config:clear Remove the configuration cache file

            删除配置的缓存文件

db

db:seed Seed the database with records

            发送数据库的详细记录

event

event:generate Generate the missing events and handlers based on registration

            在记录上生成错过的事件和基础程序

handler

handler:command Create a new command handler class

            创建一个新的命令处理程序类

handler:event Create a new event handler class

            创建一个新的事件处理程序类

key

key:generate Set the application key

            设置程序密钥

make

make:command Create a new command class

                生成一个命令类

make:console Create a new Artisan command

                生成一个Artisan命令

make:controller Create a new resource controller class

                生成一个资源控制类

make:event Create a new event class

                生成一个事件类

make:middleware Create a new middleware class

                生成一个中间件

make:migration Create a new migration file

                生成一个迁移文件

make:model Create a new Eloquent model class

                生成一个Eloquent 模型类

make:provider Create a new service provider class

                生成一个服务提供商的类

make:request Create a new form request class

                生成一个表单消息类

migrate

migrate:install Create the migration repository

                创建一个迁移库文件

migrate:refresh Reset and re-run all migrations

                复位并重新运行所有的迁移

migrate:reset Rollback all database migrations

                回滚全部数据库迁移

migrate:rollback Rollback the last database migration

                回滚最后一个数据库迁移

migrate:status Show a list of migrations up/down

                显示列表的迁移 上/下

queue

queue:failed List all of the failed queue jobs

                列出全部失败的队列工作

queue:failed-table Create a migration for the failed queue jobs database table

                创建一个迁移的失败的队列数据库工作表

queue:flush Flush all of the failed queue jobs

                清除全部失败的队列工作

queue:forget Delete a failed queue job

                删除一个失败的队列工作

queue:listen Listen to a given queue

                监听一个确定的队列工作

queue:restart Restart queue worker daemons after their current job

                重启现在正在运行的所有队列工作

queue:retry Retry a failed queue job

                重试一个失败的队列工作

queue:subscribe Subscribe a URL to an Iron.io push queue 去Iron.io

                订阅URL,放到队列上  

queue:table Create a migration for the queue jobs database table

                创建一个迁移的队列数据库工作表

queue:work Process the next job on a queue

                进行下一个队列任务

route

route:cache Create a route cache file for faster route registration

                为了更快的路由登记,创建一个路由缓存文件

route:clear Remove the route cache file

                清除路由缓存文件

route:list List all registered routes

                列出全部的注册路由 

schedule

schedule:run Run the scheduled commands

                运行预定命令

session

session:table Create a migration for the session database table

                创建一个迁移的SESSION数据库工作表

vendor

vendor:publish Publish any publishable assets from vendor packages

使用如下哪个接口,可实现对一个对象进行 foreach 遍历的功能?

因为php对象也是复合数据类型(还一种复合数据类型是数组),既然是复合数据类型,所以也能对其遍历,不过对对象的遍历其实就是对其属性的遍历

class  A{

public $name = ‘酱油’;

private $age = 18;

public $hobby = array();

public function test(){}

}

$a = new A;

foreach($a as $k=>$v){

var_dump($k,$v);

}

运行结果如下:

string(4) “name” string(6) “酱油” string(5) “hobby” array(0) { }

这里我们可以看到对象的遍历只遍历public属性(其实遍历也等于类外访问,限定修饰符依然有作用)

但是有的时候我们想对对象的遍历的时候,遍历的是其中的一个是数组的对象的元素,像上个例子中的hobby,如果我们想遍历对象的时候和遍历hobby属性的效果一样,那么我们需要实现Iterator这个接口,代码如下:

class  A implements Iterator{
public $name = ‘酱油’;
private $age = 18;
public $hobby = array(‘游泳’,’旅游’,’玩游戏’);
public function test(){}
public function addPlayer($p) {
$this->hobby[] = $p;
}
public function rewind() {     //初始化
reset($this->hobby);
}
public function valid() {      //合法性验证
return key($this->hobby) !== NULL;
}
public function current() {    //获得值变量
return current($this->hobby);
}
public function key() {       //获得键变量
return key($this->hobby);
}
public function next() {     //移动指针
next($this->hobby);
}
}
$a = new A;
foreach($a as $k=>$v){
var_dump($k,$v);
}

运行结果如下:

int(0) string(6) “游泳” int(1) string(6) “旅游” int(2) string(9) “玩游戏”

Foreach是根据当前对象所属类是否实现了Iterator接口来决定foreach遍历类型的。

小程序验证码倒计时

<form bindsubmit="formSubmit" bindreset="formReset">
<view class="fidpas">
 <input type="number" class="fidpas_inp"placeholder-class="lgin_place" placeholder="请输入手机号" name="phonenumber" />
 <input type="number" class="fidpas_inp2"placeholder-class="lgin_place" placeholder="请输入短信验证码" name="msg" />
 <button class="{{sendmsg}}" bindtap="sendmessg">{{getmsg}}</button>
</view>
<button class="lgbut" formType="submit">下一步</button>
</form>
data: {
 sendmsg: "sendmsg",
 getmsg:"获取短信验证码",
 },
 /**
 * 获取短信验证码
 */
 sendmessg:function(e){
 if (timer==1){
 timer=0
 var that=this
 var time=60
 that.setData({
 sendmsg:"sendmsgafter",
 })
 var inter=setInterval(function(){
  that.setData({
  getmsg: time + "s后重新发送",
  })
  time--
  if(time<0){
  timer=1
  clearInterval(inter)
  that.setData({
   sendmsg: "sendmsg",
   getmsg: "获取短信验证码",
  })
  }
 },1000)}
 },