当前仓库属于暂停状态,部分功能使用受限,详情请查阅 仓库状态说明
8 Star 19 Fork 5

悠悠山雨 / ComBlog
暂停

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
mysql_database.sql 140.69 KB
一键复制 编辑 原始数据 按行查看 历史
xcxxkj 提交于 2018-12-16 00:48 . new
SET FOREIGN_KEY_CHECKS=0;
-- ----------------------------
-- Table structure for `admin`
-- ----------------------------
DROP TABLE IF EXISTS `admin`;
CREATE TABLE `admin` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`username` char(12) NOT NULL DEFAULT '',
`password` char(32) DEFAULT '',
`session_id` char(26) DEFAULT '',
`cookie_token` char(32) DEFAULT '',
`cookie_expire` int(10) unsigned DEFAULT 0,
`update_time` timestamp NULL DEFAULT current_timestamp() ON UPDATE current_timestamp(),
`create_time` timestamp NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of admin
-- ----------------------------
-- ----------------------------
-- Table structure for `admin_login_log`
-- ----------------------------
DROP TABLE IF EXISTS `admin_login_log`;
CREATE TABLE `admin_login_log` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`admin_id` int(10) unsigned NOT NULL DEFAULT 0,
`ip` varchar(15) DEFAULT '',
`lang` varchar(20) DEFAULT '',
`browser` varchar(120) DEFAULT '',
`time` timestamp NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of admin_login_log
-- ----------------------------
-- ----------------------------
-- Table structure for `article`
-- ----------------------------
DROP TABLE IF EXISTS `article`;
CREATE TABLE `article` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`cid` tinyint(1) unsigned NOT NULL DEFAULT 3,
`title` varchar(200) NOT NULL DEFAULT '',
`description` varchar(150) DEFAULT '',
`content` text DEFAULT NULL,
`markdown` text DEFAULT NULL,
`create_time` timestamp NULL DEFAULT current_timestamp(),
`update_time` timestamp NULL DEFAULT current_timestamp(),
PRIMARY KEY (`id`),
FULLTEXT KEY `title` (`title`,`content`)
) ENGINE=MyISAM AUTO_INCREMENT=19 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of article
-- ----------------------------
INSERT INTO `article` VALUES ('1', '2', 'Mysql-PDO 应用代码', 'PDO一是PHP数据对象(PHP Data Object)的缩写', '<h1>PDO简介</h1>\n<p>PDO一是PHP数据对象(PHP Data Object)的缩写</p>\n<h2>代码示例</h2>\n<h3>初始化</h3>\n<pre><code class="language-php">$pdo_conf=[\n \'dsn\'=>\'mysql:host=127.0.0.1;dbname=com;port=3306;charset=utf8\',\n \'user\'=>\'root\',\n \'pass\'=>\'root\',\n \'param\'=>[\n //文档:http://php.net/manual/en/pdo.setattribute.php\n PDO::ATTR_CASE => PDO::CASE_NATURAL,//字段名称大小写\n PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,//抛出异常\n PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,//在获取数据时将空字符串转换成 SQL 中的 NULL\n PDO::ATTR_STRINGIFY_FETCHES => false,//将数值转换为字符串\n PDO::ATTR_EMULATE_PREPARES => false,//进行参数转义\n PDO::ATTR_PERSISTENT => false,//开启长连接\n PDO::MYSQL_ATTR_INIT_COMMAND=> \'SET NAMES UTF8\',//设置编码\n PDO::ATTR_DEFAULT_FETCH_MODE=> PDO::FETCH_ASSOC,//以数组形式返回数据\n ]\n];\n$pdo = new PDO($pdo_conf[\'dsn\'], $pdo_conf[\'user\'], $pdo_conf[\'pass\'],$pdo_conf[\'param\']);</code></pre>\n<h3>查询</h3>\n<pre><code>$sql=\'select goods_id,goods_name from ecs_goods limit 5\';\n$pdos=$pdo->query($sql); //PDOStatement\n$result=$pdos->fetch(); //一维数组数据\n\n$pdos=$pdo->query($sql);\n$result=$pdos->fetchColumn(0);//字符串数据(获取第一个字段值)\n\n$pdos=$pdo->query($sql);\n$result=$pdos->fetchAll();//二维数组数据</code></pre>\n<h3>执行</h3>\n<pre><code>$sql=\'insert ecs_goods (goods_name,goods_sn) values ("test_goods","t_05")\';\n$count=$pdo->exec($sql); //1\n$id=$pdo->lastInsertId(); //2454(id)</code></pre>\n<h3>事务</h3>\n<pre><code>$pdo->beginTransaction();\ntry{\n $in_transaction=$pdo->inTransaction();//true\n $sql=\'insert ecs_goods (goods_name,goods_sn) values ("test_goods","t_05")\';\n $count=$pdo->exec($sql);\n $sql=\'insert ecs_goods_activity (act_name,act_desc) values ("test_goods_act","test_desc")\';\n $count=$pdo->exec($sql);\n $pdo->commit();\n}catch(PDOException $e){\n $e->getMessage();//SQLSTATE[42S02]: Base table or view not found: 1146 Table \'com.ecs_goods_activit\' doesn\'t exist\n $pdo->rollBack();\n}</code></pre>\n<h3>参数绑定</h3>\n<pre><code>$sql = \'SELECT * FROM ecs_goods WHERE goods_id=?\';\n$pdos = $pdo->prepare($sql);\n$pdos->bindValue(1,2454);//绑定变量或值\n$status = $pdos->execute();//true\n$pdos->queryString;//SELECT * FROM ecs_goods WHERE goods_id=?\n\n$sql = \'SELECT * FROM ecs_goods WHERE goods_id=:id \';\n$pdos = $pdo->prepare($sql);\n$id = 2454;\n$pdos->bindParam(\':id\',$id);//只能绑定变量\n$status = $pdos->execute();//true\n$count = $pdos->rowCount();//1\n\n$sql=\'select goods_id,goods_name from ecs_goods order by goods_id asc limit 1\';\n$pdos = $pdo->prepare($sql);\n$status = $pdos->execute();\n$pdos->bindColumn(1,$goods_id);\n$pdos->bindColumn(2,$goods_name);\n$pdos->fetch();\n$goods_id;//1\n$goods_name;//测试商品</code></pre>\n<h3>关闭连接</h3>\n<pre><code>$pdos=null;\n$pdo=null;</code></pre>', '# PDO简介\r\nPDO一是PHP数据对象(PHP Data Object)的缩写\r\n\r\n## 代码示例\r\n### 初始化\r\n``` php\r\n$pdo_conf=[\r\n \'dsn\'=>\'mysql:host=127.0.0.1;dbname=com;port=3306;charset=utf8\',\r\n \'user\'=>\'root\',\r\n \'pass\'=>\'root\',\r\n \'param\'=>[\r\n //文档:http://php.net/manual/en/pdo.setattribute.php\r\n PDO::ATTR_CASE => PDO::CASE_NATURAL,//字段名称大小写\r\n PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION,//抛出异常\r\n PDO::ATTR_ORACLE_NULLS => PDO::NULL_NATURAL,//在获取数据时将空字符串转换成 SQL 中的 NULL\r\n PDO::ATTR_STRINGIFY_FETCHES => false,//将数值转换为字符串\r\n PDO::ATTR_EMULATE_PREPARES => false,//进行参数转义\r\n PDO::ATTR_PERSISTENT => false,//开启长连接\r\n PDO::MYSQL_ATTR_INIT_COMMAND=> \'SET NAMES UTF8\',//设置编码\r\n PDO::ATTR_DEFAULT_FETCH_MODE=> PDO::FETCH_ASSOC,//以数组形式返回数据\r\n ]\r\n];\r\n$pdo = new PDO($pdo_conf[\'dsn\'], $pdo_conf[\'user\'], $pdo_conf[\'pass\'],$pdo_conf[\'param\']);\r\n```\r\n### 查询\r\n```\r\n$sql=\'select goods_id,goods_name from ecs_goods limit 5\';\r\n$pdos=$pdo->query($sql); //PDOStatement\r\n$result=$pdos->fetch(); //一维数组数据\r\n\r\n$pdos=$pdo->query($sql);\r\n$result=$pdos->fetchColumn(0);//字符串数据(获取第一个字段值)\r\n\r\n$pdos=$pdo->query($sql);\r\n$result=$pdos->fetchAll();//二维数组数据\r\n```\r\n### 执行\r\n```\r\n$sql=\'insert ecs_goods (goods_name,goods_sn) values (\"test_goods\",\"t_05\")\';\r\n$count=$pdo->exec($sql); //1\r\n$id=$pdo->lastInsertId(); //2454(id)\r\n```\r\n### 事务\r\n```\r\n$pdo->beginTransaction();\r\ntry{\r\n $in_transaction=$pdo->inTransaction();//true\r\n $sql=\'insert ecs_goods (goods_name,goods_sn) values (\"test_goods\",\"t_05\")\';\r\n $count=$pdo->exec($sql);\r\n $sql=\'insert ecs_goods_activity (act_name,act_desc) values (\"test_goods_act\",\"test_desc\")\';\r\n $count=$pdo->exec($sql);\r\n $pdo->commit();\r\n}catch(PDOException $e){\r\n $e->getMessage();//SQLSTATE[42S02]: Base table or view not found: 1146 Table \'com.ecs_goods_activit\' doesn\'t exist\r\n $pdo->rollBack();\r\n}\r\n```\r\n### 参数绑定\r\n```\r\n$sql = \'SELECT * FROM ecs_goods WHERE goods_id=?\';\r\n$pdos = $pdo->prepare($sql);\r\n$pdos->bindValue(1,2454);//绑定变量或值\r\n$status = $pdos->execute();//true\r\n$pdos->queryString;//SELECT * FROM ecs_goods WHERE goods_id=?\r\n\r\n$sql = \'SELECT * FROM ecs_goods WHERE goods_id=:id \';\r\n$pdos = $pdo->prepare($sql);\r\n$id = 2454;\r\n$pdos->bindParam(\':id\',$id);//只能绑定变量\r\n$status = $pdos->execute();//true\r\n$count = $pdos->rowCount();//1\r\n\r\n$sql=\'select goods_id,goods_name from ecs_goods order by goods_id asc limit 1\';\r\n$pdos = $pdo->prepare($sql);\r\n$status = $pdos->execute();\r\n$pdos->bindColumn(1,$goods_id);\r\n$pdos->bindColumn(2,$goods_name);\r\n$pdos->fetch();\r\n$goods_id;//1\r\n$goods_name;//测试商品\r\n```\r\n\r\n### 关闭连接\r\n```\r\n$pdos=null;\r\n$pdo=null;\r\n```', '2017-01-19 15:33:28', '2017-06-25 13:35:17');
INSERT INTO `article` VALUES ('2', '2', 'Laravel-Auth 会员分析', 'Laravel Auth 模块代码代码逻辑分析', '<h3>用户登录</h3>\n<pre><code>//账号密码登录\n$loginStatus = Auth::guard()->attempt(\n $request->only(\'email\', \'password\'), $request->has(\'remember\')\n);\n//直接登录\n$user = User::get(1);\nAuth::guard()->login($user,$remember);\n//注销登录\nAuth::guard()->logout();</code></pre>\n<h3>密码加密</h3>\n<pre><code>$password = \'admin\';\n$passwordHash=password_hash($password, PASSWORD_BCRYPT, [\'cost\' => 10]);\n//$2y$10$mrVfgSTlVfd/h.kPckUdzetSWlvd.7JERfXtg1N.FK4mrUyKk1bnm\n//密码加密后共60位,开头6位为$2y$10\n$passwordVerify=password_verify(\'admin\',$passwordHash);\n//true</code></pre>\n<h3>登录流程</h3>\n<pre><code>// 判断同时多次登录 (use IlluminateFoundationAuthThrottlesLogins)\n if ($this->hasTooManyLoginAttempts($request)) {\n $this->fireLockoutEvent($request);\n\n return $this->sendLockoutResponse($request);\n }\n\n// 尝试登陆\n if ($this->attemptLogin($request)) {\n return $this->sendLoginResponse($request);\n }\n\n// 增加尝试登录次数,响应登录失败\n $this->incrementLoginAttempts($request);\n return $this->sendFailedLoginResponse($request);</code></pre>\n<h4>尝试登录</h4>\n<pre><code>// 根据config/auth.php配置信息创建Guard\n$guard = $this->guard();\n\n// 调用\'create\'.ucfirst($config[\'driver\']).\'Driver\'形式方法\n// 可在AuthManager使用过extend()扩展\n$driverMethod = \'create\'.ucfirst($config[\'driver\']).\'Driver\';\nif (method_exists($this, $driverMethod)) return $this->{$driverMethod}($name, $config);\n\n// 根据配置创建供应商EloquentUserProvider,DatabaseUserProvider\n// 可在AuthManager使用provider()扩展\n$provider = $this->createUserProvider($config[\'provider\']);\n\n// 创建凭证存储类SessionGuard,TokenGuard,RequestGuard\n$guard = new SessionGuard(name, UserProvider, SessionInterface);\n\n// 尝试登录\n$guard->attempt([$username,$password], $remember);\n// 触发尝试登录事件 EventsAttempting\n$this->fireAttemptEvent($credentials, $remember, $login);\n\n// EloquentUserProvider根据账号取回数据,判断密码是否正确\n$this->provider->retrieveByCredentials();\n$this->provider->validateCredentials();\n\n// 更新登录标识\n$this->updateSession($user->getAuthIdentifier());\n\n// 更新remember_token,存储id|remember_token到cookie\n$this->createRememberTokenIfDoesntExist($user);\n$this->queueRecallerCookie($user);\n\n// 触发登录事件 EventsLogin\n$this->fireLoginEvent($user, $remember);\n\n// 存储$user到Guard\n// 触发认证事件 EventsAuthenticated\n$this->setUser($user);\n</code></pre>\n<h3>事件</h3>\n<pre><code>protected $listen = [\n // new EventsAttempting($credentials, $remember, $login)\n \'IlluminateAuthEventsAttempting\' => [\n \'AppListenersLogAuthenticationAttempt\',\n ],\n //new EventsAuthenticated($user)\n \'IlluminateAuthEventsAuthenticated\' => [\n \'AppListenersLogAuthenticated\',\n ],\n //EventsLogin($user, $remember)\n \'IlluminateAuthEventsLogin\' => [\n \'AppListenersLogSuccessfulLogin\',\n ],\n //new EventsLogout($user)\n \'IlluminateAuthEventsLogout\' => [\n \'AppListenersLogSuccessfulLogout\',\n ],\n\n \'IlluminateAuthEventsLockout\' => [\n \'AppListenersLogLockout\',\n ],\n];</code></pre>\n<h3>路由</h3>\n<pre><code>| GET|HEAD | login | login | AppHttpControllersAuthLoginController@showLoginForm | web,guest |\n| POST | login | | AppHttpControllersAuthLoginController@login | web,guest |\n| POST | logout | logout | AppHttpControllersAuthLoginController@logout | web |\n| POST | password/email | | AppHttpControllersAuthForgotPasswordController@sendResetLinkEmail | web,guest |\n| GET|HEAD | password/reset | | AppHttpControllersAuthForgotPasswordController@showLinkRequestForm | web,guest |\n| POST | password/reset | | AppHttpControllersAuthResetPasswordController@reset | web,guest |\n| GET|HEAD | password/reset/{token} | | AppHttpControllersAuthResetPasswordController@showResetForm | web,guest |\n| GET|HEAD | register | register | AppHttpControllersAuthRegisterController@showRegistrationForm | web,guest |\n| POST | register | | AppHttpControllersAuthRegisterController@register | web,guest |</code></pre>\n<h3>注册路由</h3>\n<pre><code>//IlluminateRoutingRouter\n\npublic function auth()\n{\n // Authentication Routes...\n $this->get(\'login\', \'AuthLoginController@showLoginForm\')->name(\'login\');\n $this->post(\'login\', \'AuthLoginController@login\');\n $this->post(\'logout\', \'AuthLoginController@logout\')->name(\'logout\');\n\n // Registration Routes...\n $this->get(\'register\', \'AuthRegisterController@showRegistrationForm\')->name(\'register\');\n $this->post(\'register\', \'AuthRegisterController@register\');\n\n // Password Reset Routes...\n $this->get(\'password/reset\', \'AuthForgotPasswordController@showLinkRequestForm\');\n $this->post(\'password/email\', \'AuthForgotPasswordController@sendResetLinkEmail\');\n $this->get(\'password/reset/{token}\', \'AuthResetPasswordController@showResetForm\');\n $this->post(\'password/reset\', \'AuthResetPasswordController@reset\');\n}</code></pre>', '### 用户登录\r\n```\r\n//账号密码登录\r\n$loginStatus = Auth::guard()->attempt(\r\n $request->only(\'email\', \'password\'), $request->has(\'remember\')\r\n);\r\n//直接登录\r\n$user = User::get(1);\r\nAuth::guard()->login($user,$remember);\r\n//注销登录\r\nAuth::guard()->logout();\r\n```\r\n\r\n### 密码加密\r\n```\r\n$password = \'admin\';\r\n$passwordHash=password_hash($password, PASSWORD_BCRYPT, [\'cost\' => 10]);\r\n//$2y$10$mrVfgSTlVfd/h.kPckUdzetSWlvd.7JERfXtg1N.FK4mrUyKk1bnm\r\n//密码加密后共60位,开头6位为$2y$10\r\n$passwordVerify=password_verify(\'admin\',$passwordHash);\r\n//true\r\n```\r\n\r\n### 登录流程\r\n```\r\n// 判断同时多次登录 (use IlluminateFoundationAuthThrottlesLogins)\r\n if ($this->hasTooManyLoginAttempts($request)) {\r\n $this->fireLockoutEvent($request);\r\n \r\n return $this->sendLockoutResponse($request);\r\n }\r\n\r\n// 尝试登陆\r\n if ($this->attemptLogin($request)) {\r\n return $this->sendLoginResponse($request);\r\n }\r\n \r\n// 增加尝试登录次数,响应登录失败\r\n $this->incrementLoginAttempts($request);\r\n return $this->sendFailedLoginResponse($request);\r\n```\r\n\r\n#### 尝试登录\r\n```\r\n// 根据config/auth.php配置信息创建Guard\r\n$guard = $this->guard();\r\n\r\n// 调用\'create\'.ucfirst($config[\'driver\']).\'Driver\'形式方法\r\n// 可在AuthManager使用过extend()扩展\r\n$driverMethod = \'create\'.ucfirst($config[\'driver\']).\'Driver\';\r\nif (method_exists($this, $driverMethod)) return $this->{$driverMethod}($name, $config);\r\n\r\n// 根据配置创建供应商EloquentUserProvider,DatabaseUserProvider\r\n// 可在AuthManager使用provider()扩展\r\n$provider = $this->createUserProvider($config[\'provider\']);\r\n\r\n// 创建凭证存储类SessionGuard,TokenGuard,RequestGuard\r\n$guard = new SessionGuard(name, UserProvider, SessionInterface);\r\n\r\n// 尝试登录\r\n$guard->attempt([$username,$password], $remember);\r\n// 触发尝试登录事件 EventsAttempting\r\n$this->fireAttemptEvent($credentials, $remember, $login);\r\n\r\n// EloquentUserProvider根据账号取回数据,判断密码是否正确\r\n$this->provider->retrieveByCredentials();\r\n$this->provider->validateCredentials();\r\n\r\n// 更新登录标识\r\n$this->updateSession($user->getAuthIdentifier());\r\n\r\n// 更新remember_token,存储id|remember_token到cookie\r\n$this->createRememberTokenIfDoesntExist($user);\r\n$this->queueRecallerCookie($user);\r\n\r\n// 触发登录事件 EventsLogin\r\n$this->fireLoginEvent($user, $remember);\r\n\r\n// 存储$user到Guard\r\n// 触发认证事件 EventsAuthenticated\r\n$this->setUser($user);\r\n\r\n```\r\n\r\n### 事件\r\n```\r\nprotected $listen = [\r\n // new EventsAttempting($credentials, $remember, $login)\r\n \'IlluminateAuthEventsAttempting\' => [\r\n \'AppListenersLogAuthenticationAttempt\',\r\n ],\r\n //new EventsAuthenticated($user)\r\n \'IlluminateAuthEventsAuthenticated\' => [\r\n \'AppListenersLogAuthenticated\',\r\n ],\r\n //EventsLogin($user, $remember)\r\n \'IlluminateAuthEventsLogin\' => [\r\n \'AppListenersLogSuccessfulLogin\',\r\n ],\r\n //new EventsLogout($user)\r\n \'IlluminateAuthEventsLogout\' => [\r\n \'AppListenersLogSuccessfulLogout\',\r\n ],\r\n\r\n \'IlluminateAuthEventsLockout\' => [\r\n \'AppListenersLogLockout\',\r\n ],\r\n];\r\n```\r\n\r\n### 路由\r\n | GET|HEAD | login | login | AppHttpControllersAuthLoginController@showLoginForm | web,guest |\r\n | POST | login | | AppHttpControllersAuthLoginController@login | web,guest |\r\n | POST | logout | logout | AppHttpControllersAuthLoginController@logout | web |\r\n | POST | password/email | | AppHttpControllersAuthForgotPasswordController@sendResetLinkEmail | web,guest |\r\n | GET|HEAD | password/reset | | AppHttpControllersAuthForgotPasswordController@showLinkRequestForm | web,guest |\r\n | POST | password/reset | | AppHttpControllersAuthResetPasswordController@reset | web,guest |\r\n | GET|HEAD | password/reset/{token} | | AppHttpControllersAuthResetPasswordController@showResetForm | web,guest |\r\n | GET|HEAD | register | register | AppHttpControllersAuthRegisterController@showRegistrationForm | web,guest |\r\n | POST | register | | AppHttpControllersAuthRegisterController@register | web,guest |\r\n\r\n### 注册路由\r\n```\r\n//IlluminateRoutingRouter\r\n\r\npublic function auth()\r\n{\r\n // Authentication Routes...\r\n $this->get(\'login\', \'AuthLoginController@showLoginForm\')->name(\'login\');\r\n $this->post(\'login\', \'AuthLoginController@login\');\r\n $this->post(\'logout\', \'AuthLoginController@logout\')->name(\'logout\');\r\n\r\n // Registration Routes...\r\n $this->get(\'register\', \'AuthRegisterController@showRegistrationForm\')->name(\'register\');\r\n $this->post(\'register\', \'AuthRegisterController@register\');\r\n\r\n // Password Reset Routes...\r\n $this->get(\'password/reset\', \'AuthForgotPasswordController@showLinkRequestForm\');\r\n $this->post(\'password/email\', \'AuthForgotPasswordController@sendResetLinkEmail\');\r\n $this->get(\'password/reset/{token}\', \'AuthResetPasswordController@showResetForm\');\r\n $this->post(\'password/reset\', \'AuthResetPasswordController@reset\');\r\n}\r\n```\r\n\r\n', '2017-06-25 13:35:07', '2017-06-25 13:35:41');
INSERT INTO `article` VALUES ('3', '2', 'Pimple 简单容器', 'Compoer 中使用较为便捷的简单容器Pimple', '<h1>Pimple/Container</h1>\n<h2>安装</h2>\n<p><code>composer require "pimple/pimple": "^3.0"</code></p>\n<h2>代码</h2>\n<h3>加载并实例化</h3>\n<pre><code class="language-php">require __DIR__ . \'/vendor/autoload.php\';\n$pc = new PimpleContainer();</code></pre>\n<h3>参数存储</h3>\n<pre><code class="language-php">$pc[\'app_id\']=\'pimple\';</code></pre>\n<h3>单例存储</h3>\n<pre><code class="language-php">$pc[\'app\']=function($c){\n $app=new stdClass();\n $app->app_id=$c[\'app_id\'];\n return $app;\n};\n$app_one=$pc[\'app\'];\n$app_two=$pc[\'app\'];\nvar_dump($app_one === $app_two);// true</code></pre>\n<h3>非单例存储</h3>\n<pre><code class="language-php">$pc[\'api\'] = $pc->factory(function ($c) {\n $api=new stdClass();\n $api->app_id=$c[\'app_id\'];\n return $api;\n});\n$api_one=$pc[\'api\'];\n$api_two=$pc[\'api\'];\nvar_dump($api_two === $api_two);// false</code></pre>\n<h3>存储匿名函数</h3>\n<pre><code class="language-php">$pc[\'random_func\']=$pc->protect(function () {\n return rand();\n});</code></pre>\n<h3>获取匿名函数</h3>\n<pre><code class="language-php">$random=$pc->raw(\'random_func\');\nvar_dump($random());</code></pre>\n<h3>服务提供者</h3>\n<pre><code class="language-php">class UcProvider implements PimpleServiceProviderInterface\n{\n public function register(PimpleContainer $c)\n {\n $uc_id=6;\n $c[\'uc_config\']=[\'uc_id\'=>$uc_id];\n $c[\'uc_class\']=function ($c) use ($uc_id){\n $uc=new stdClass();\n $uc->id=$uc_id;\n return $uc;\n };\n }\n}\n$pc->register(new UcProvider());\nvar_dump($pc[\'uc_config\']);\nvar_dump($pc[\'uc_class\']);</code></pre>\n<h2>文档</h2>\n<blockquote>\n<p>官网文档 : <code>http://pimple.sensiolabs.org/</code></p>\n</blockquote>', '# Pimple/Container\r\n\r\n## 安装\r\n`composer require \"pimple/pimple\": \"^3.0\"`\r\n\r\n## 代码\r\n### 加载并实例化\r\n``` php\r\nrequire __DIR__ . \'/vendor/autoload.php\';\r\n$pc = new PimpleContainer();\r\n```\r\n\r\n### 参数存储\r\n``` php\r\n$pc[\'app_id\']=\'pimple\';\r\n```\r\n\r\n### 单例存储\r\n``` php\r\n$pc[\'app\']=function($c){\r\n $app=new stdClass();\r\n $app->app_id=$c[\'app_id\'];\r\n return $app;\r\n};\r\n$app_one=$pc[\'app\'];\r\n$app_two=$pc[\'app\'];\r\nvar_dump($app_one === $app_two);// true\r\n```\r\n\r\n### 非单例存储\r\n``` php\r\n$pc[\'api\'] = $pc->factory(function ($c) {\r\n $api=new stdClass();\r\n $api->app_id=$c[\'app_id\'];\r\n return $api;\r\n});\r\n$api_one=$pc[\'api\'];\r\n$api_two=$pc[\'api\'];\r\nvar_dump($api_two === $api_two);// false\r\n```\r\n\r\n### 存储匿名函数\r\n``` php\r\n$pc[\'random_func\']=$pc->protect(function () {\r\n return rand();\r\n});\r\n```\r\n\r\n### 获取匿名函数\r\n``` php\r\n$random=$pc->raw(\'random_func\');\r\nvar_dump($random());\r\n```\r\n\r\n### 服务提供者\r\n``` php\r\nclass UcProvider implements PimpleServiceProviderInterface\r\n{\r\n public function register(PimpleContainer $c)\r\n {\r\n $uc_id=6;\r\n $c[\'uc_config\']=[\'uc_id\'=>$uc_id];\r\n $c[\'uc_class\']=function ($c) use ($uc_id){\r\n $uc=new stdClass();\r\n $uc->id=$uc_id;\r\n return $uc;\r\n };\r\n }\r\n}\r\n$pc->register(new UcProvider());\r\nvar_dump($pc[\'uc_config\']);\r\nvar_dump($pc[\'uc_class\']);\r\n```\r\n\r\n## 文档\r\n> 官网文档 : `http://pimple.sensiolabs.org/`\r\n\r\n', '2017-06-25 13:49:06', '2017-06-25 14:10:47');
INSERT INTO `article` VALUES ('4', '2', 'Stringy 字符串处理', '强大的字符串处理类 Stringy', '&lt;h1&gt;danielstjules/Stringy&lt;/h1&gt;\n&lt;p&gt;&lt;a href=&quot;https://github.com/danielstjules/Stringy&quot;&gt;https://github.com/danielstjules/Stringy&lt;/a&gt;&lt;/p&gt;\n&lt;h2&gt;实例&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;require_once __DIR__.\'/../vendor/autoload.php\';\n\nuse StringyStringy as Sy;\n\n$s=Sy::create(\'hello world !\');\n$s[6];\n//w\n$s-&amp;gt;length();\n//13\n$s-&amp;gt;getEncoding();\n//UTF-8\n$s-&amp;gt;titleize();\n//Hello World !\n$s-&amp;gt;reverse();\n//! dlrow olleh\n$s-&amp;gt;shuffle();\n//wo! olre hdll\n\nSy::create(\'createHandle\')-&amp;gt;dasherize();\n//create-handle\nSy::create(\'createHandle\')-&amp;gt;delimit(\'_\');\n//create_handle\n\nSy::create(\'/2016/2016080512563.jpg\')-&amp;gt;ensureLeft(\'http://upload.kukj.cn\');\n//http://upload.kukj.cn/2016/2016080512563.jpg\nSy::create(\'http://upload.kukj.cn/2016/2016080512563.jpg\')-&amp;gt;ensureLeft(\'http://upload.kukj.cn\');\n//http://upload.kukj.cn/2016/2016080512563.jpg\n\nSy::create(&quot;26&quot;)-&amp;gt;pad(\'10\',\'0\',\'left\');\n//0000000026\necho Sy::create(\'What are your plans today?\')-&amp;gt;safeTruncate(22, \'...\');\n//What are your plans...\n\nSy::create(\'{&quot;name&quot;:&quot;shanyu&quot;}\')-&amp;gt;isJson();\n//true\nSy::create(\'a:1:{s:4:&quot;name&quot;;s:6:&quot;shanyu&quot;;}\')-&amp;gt;isSerialized(); \n//true\n\nSy::create(\'&amp;lt;script&amp;gt;alert(&quot;hi&quot;);&amp;lt;/script&amp;gt;\')-&amp;gt;htmlEncode();\n//&amp;lt;script&amp;gt;alert(&quot;hi&quot;);&amp;lt;/script&amp;gt;\nSy::create(\'&amp;lt;script&amp;gt;alert(&quot;hi&quot;);&amp;lt;/script&amp;gt;\')-&amp;gt;htmlDecode();\n//&amp;lt;script&amp;gt;alert(&quot;hi&quot;);&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;用途&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;// Standard library\nstrtoupper(\'fòôbàř\'); // \'FòôBàř\'\nstrlen(\'fòôbàř\'); // 10\n\n// mbstring\nmb_strtoupper(\'fòôbàř\'); // \'FÒÔBÀŘ\'\nmb_strlen(\'fòôbàř\'); // \'6\'\n\n// Stringy\ns(\'fòôbàř\')-&amp;gt;toUpperCase(); // \'FÒÔBÀŘ\'\ns(\'fòôbàř\')-&amp;gt;length(); // \'6\'&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;资料&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;// 获得文档编码\necho mb_internal_encoding();\n// \'UTF-8\'&lt;/code&gt;&lt;/pre&gt;', '# danielstjules/Stringy\r\nhttps://github.com/danielstjules/Stringy\r\n\r\n## 实例\r\n```\r\nrequire_once __DIR__.\'/../vendor/autoload.php\';\r\n\r\nuse StringyStringy as Sy;\r\n\r\n$s=Sy::create(\'hello world !\');\r\n$s[6];\r\n//w\r\n$s->length();\r\n//13\r\n$s->getEncoding();\r\n//UTF-8\r\n$s->titleize();\r\n//Hello World !\r\n$s->reverse();\r\n//! dlrow olleh\r\n$s->shuffle();\r\n//wo! olre hdll\r\n\r\n\r\nSy::create(\'createHandle\')->dasherize();\r\n//create-handle\r\nSy::create(\'createHandle\')->delimit(\'_\');\r\n//create_handle\r\n\r\nSy::create(\'/2016/2016080512563.jpg\')->ensureLeft(\'http://upload.kukj.cn\');\r\n//http://upload.kukj.cn/2016/2016080512563.jpg\r\nSy::create(\'http://upload.kukj.cn/2016/2016080512563.jpg\')->ensureLeft(\'http://upload.kukj.cn\');\r\n//http://upload.kukj.cn/2016/2016080512563.jpg\r\n\r\nSy::create(\"26\")->pad(\'10\',\'0\',\'left\');\r\n//0000000026\r\necho Sy::create(\'What are your plans today?\')->safeTruncate(22, \'...\');\r\n//What are your plans...\r\n\r\nSy::create(\'{\"name\":\"shanyu\"}\')->isJson();\r\n//true\r\nSy::create(\'a:1:{s:4:\"name\";s:6:\"shanyu\";}\')->isSerialized(); \r\n//true\r\n\r\nSy::create(\'<script>alert(\"hi\");</script>\')->htmlEncode();\r\n//<script>alert(\"hi\");</script>\r\nSy::create(\'<script>alert(\"hi\");</script>\')->htmlDecode();\r\n//<script>alert(\"hi\");</script>\r\n```\r\n\r\n## 用途\r\n```\r\n// Standard library\r\nstrtoupper(\'fòôbàř\'); // \'FòôBàř\'\r\nstrlen(\'fòôbàř\'); // 10\r\n\r\n// mbstring\r\nmb_strtoupper(\'fòôbàř\'); // \'FÒÔBÀŘ\'\r\nmb_strlen(\'fòôbàř\'); // \'6\'\r\n\r\n// Stringy\r\ns(\'fòôbàř\')->toUpperCase(); // \'FÒÔBÀŘ\'\r\ns(\'fòôbàř\')->length(); // \'6\'\r\n```\r\n\r\n## 资料\r\n```\r\n// 获得文档编码\r\necho mb_internal_encoding();\r\n// \'UTF-8\'\r\n```', '2017-06-25 15:40:51', '2017-06-25 15:40:51');
INSERT INTO `article` VALUES ('5', '2', 'Laravel-Model 代码示例', 'Laravel Model 数据模型使用代码示例', '&lt;h2&gt;模型定义使用代码示例&lt;/h2&gt;\n&lt;h3&gt;DB&lt;/h3&gt;\n&lt;pre&gt;&lt;code&gt;// 增加\nDB::insert(\'insert into users (id, name) values (?, ?)\', [1, \'Dayle\']);\n\n//删除\n$deleted = DB::delete(\'delete from users\');\n\n//修改\n$affected = DB::update(\'update users set votes = 100 where name = ?\', [\'John\']);\n\n//查询\n$results = DB::select(\'select * from users where id = :id\', [\'id\' =&amp;gt; 1]);\n\n//事务\nDB::beginTransaction();\nDB::commit();\nDB::rollBack();&lt;/code&gt;&lt;/pre&gt;\n&lt;h3&gt;Query&lt;/h3&gt;\n&lt;pre&gt;&lt;code&gt;// 查询完整示例\nDB::table(\'users\')\n-&amp;gt;select(\'name\', \'email as user_email\')\n-&amp;gt;where(\'id\',51)\n-&amp;gt;orderBy(\'id\',\'desc\')\n-&amp;gt;skip(10)\n-&amp;gt;take(5)\n-&amp;gt;first();\n\n// 多行数据\n$goods = DB::table(\'goods\')-&amp;gt;where(\'id\',\'&amp;lt;\',10)-&amp;gt;get();\n// 一列字段\n$good_names = DB::table(\'goods\')-&amp;gt;where(\'id\',\'&amp;lt;\',10)-&amp;gt;pluck(\'name\',\'id\');\n\n// 单行数据\n$good = DB::table(\'goods\')-&amp;gt;select([\'id\',\'name\'])-&amp;gt;where(\'id\',2)-&amp;gt;first();\n// 一个字段\n$good_name = DB::table(\'goods\')-&amp;gt;where(\'id\',2)-&amp;gt;value(\'name\');\n\n// 添加数据\n$insert_status1 = DB::table(\'goods\')-&amp;gt;insert([\'name\'=&amp;gt;\'英国红薯\']);\n$insert_status2 = DB::table(\'goods\')-&amp;gt;insert([[\'name\'=&amp;gt;\'英国红薯\'],[\'name\'=&amp;gt;\'荷兰冰块\']]);\n$insert_id = DB::table(\'goods\')-&amp;gt;insertGetId([\'name\'=&amp;gt;\'英国土豆\']);\n\n// 修改数据\n$update_status = DB::table(\'goods\')-&amp;gt;where(\'id\',15)-&amp;gt;update([\'name\'=&amp;gt;\'英国红薯\']);\n\n// 删除数据\n$delete_status = DB::table(\'goods\')-&amp;gt;where(\'id\',15)-&amp;gt;delete();\n\n// 分页列表\n$list = DB::table(\'goods\')-&amp;gt;paginate(10);\n//$list = DB::table(\'goods\')-&amp;gt;simplePaginate(10);&lt;/code&gt;&lt;/pre&gt;\n&lt;h3&gt;Model&lt;/h3&gt;\n&lt;pre&gt;&lt;code&gt;&amp;lt;?php\nnamespace AppModels;\n\nuse IlluminateDatabaseEloquentModel;\nuse IlluminateDatabaseEloquentBuilder;\n\nclass Article extends Model\n{\n protected $table = \'articles\';\n\n // 是否自动维护时间戳\n public $timestamps = true;\n\n // 模型的日期字段保存格式,默认:Y-m-d H:i:s\n protected $dateFormat=\'Y/m/d H:i:s\',\n\n // 允许批量处理的字段\n protected $fillable = [\'sort\'];\n // 禁止批量处理的字段\n // protected $guarded = [\'status\'];\n\n // 属性类型转换(integer,real,float,double,string,boolean,object,array,collection,date,datetime,timestamp)\n protected $casts = [\n \'is_hot\' =&amp;gt; \'boolean\',\n \'is_publish\' =&amp;gt; \'boolean\',\n ];\n\n // 应被转换为日期的属性\n protected $dates = [\n \'created_at\',\n \'updated_at\',\n \'deleted_at\'\n ];\n\n // 虚拟属性 toJson(),toArray()\n protected $appends = [\'short_tag\'];\n public function getShortTagAttribute()\n {\n $tag = [];\n if($this-&amp;gt;attributes[\'is_hot\']){\n $tag[] = \'Hot\';\n }\n return $tag;\n }\n\n // 序列化时需要显示的属性\n protected $visible = [\'id\', \'title\', \'thumb\', \'author\'];\n // protected $hidden = [\'is_hot\',\'is_publish\'];\n\n protected static function boot()\n {\n parent::boot();\n\n // 全局作用域\n static::addGlobalScope(\'publish\', function(Builder $builder) {\n $builder-&amp;gt;where(\'is_publish\', 1);\n });\n\n // 绑定事件\n static::creating(function ($model) { // 添加之前\n echo \'开始创建\';\n return true;\n });\n static::created(function ($model) { // 添加之后\n echo \'结束创建\';\n return true;\n });\n }\n // 局部作用域\n public function scopeHot($query)\n {\n return $query-&amp;gt;where(\'is_hot\',1)-&amp;gt;orderBy(\'sort\', \'asc\')-&amp;gt;orderBy(\'id\', \'desc\');\n }\n public function scopeOfCid($query,$cid)\n {\n return $query-&amp;gt;where(\'cid\',$cid);\n }\n\n // 访问器\n public function getIsPublishAttribute($value)\n {\n return $value ? \'已发布\' : \'待发布\';\n }\n // 修改器\n public function setAuthorAttribute($value)\n {\n if(!empty($value) &amp;amp;&amp;amp; is_string($value)){\n $this-&amp;gt;attributes[\'author\'] = ucwords($value);\n }\n }\n}&lt;/code&gt;&lt;/pre&gt;\n&lt;h4&gt;Relation&lt;/h4&gt;\n&lt;pre&gt;&lt;code&gt;&amp;lt;?php\nnamespace AppModels;\nuse IlluminateDatabaseEloquentModel;\n\nclass Good extends Model\n{\n protected $table = \'goods\';\n public $timestamps = false;\n\n public function extend()\n {\n return $this-&amp;gt;hasOne(GoodExtend::class,\'good_id\',\'id\');\n }\n public function activitys()\n {\n return $this-&amp;gt;hasMany(GoodActivity::class,\'good_id\',\'id\');\n }\n public function tags()\n {\n return $this-&amp;gt;belongsToMany(Tag::class,\'good_tag\',\'good_id\',\'tag_id\');\n }\n}\nclass GoodActivity extends Model\n{\n protected $table = \'good_activity\';\n public $timestamps = false;\n\n public function good()\n {\n return $this-&amp;gt;belongsTo(Good::class,\'good_id\',\'id\');\n }\n}\nclass Country extends Model\n{\n protected $table = \'countrys\';\n public $timestamps = false;\n\n public function activitys()\n {\n return $this-&amp;gt;hasManyThrough(GoodActivity::class,Good::class,\'country_id\',\'good_id\',\'id\');\n }\n}&lt;/code&gt;&lt;/pre&gt;\n&lt;h4&gt;Relation Curd&lt;/h4&gt;\n&lt;pre&gt;&lt;code&gt;&amp;lt;?php\n$good = new Good();\n$good-&amp;gt;name = \'自家玉米\';\n$good-&amp;gt;save();\n\n// 一对一\n$extend = new GoodExtend();\n$extend-&amp;gt;remark = \'真的,真的是自家的.\';\n$good-&amp;gt;extend()-&amp;gt;save($extend);\n\n// 一对多\n$activity = [\'促销\',\'年终\'];\n$activitys=[];\nforeach($activity as $v){\n $act=new GoodActivity();\n $act-&amp;gt;title = $v;\n $activitys[]= $act;\n}\n$good-&amp;gt;activitys()-&amp;gt;saveMany($activitys);\n\n// 多对多\n$tag_ids=[1,2,3];\n$good-&amp;gt;tags()-&amp;gt;attach($tag_ids);// 添加关联\n// $good-&amp;gt;tags()-&amp;gt;detach(); // 解除关联\n\n//增加$fillable属性中字段\n$good = Good::create([\'name\'=&amp;gt;\'美国小麦\']);\n$good-&amp;gt;extend()-&amp;gt;create([\'remark\'=&amp;gt;\'美国进口的高大上\']);&lt;/code&gt;&lt;/pre&gt;', '## 模型定义使用代码示例\r\n### DB\r\n```\r\n// 增加\r\nDB::insert(\'insert into users (id, name) values (?, ?)\', [1, \'Dayle\']);\r\n\r\n//删除\r\n$deleted = DB::delete(\'delete from users\');\r\n\r\n//修改\r\n$affected = DB::update(\'update users set votes = 100 where name = ?\', [\'John\']);\r\n\r\n//查询\r\n$results = DB::select(\'select * from users where id = :id\', [\'id\' => 1]);\r\n\r\n//事务\r\nDB::beginTransaction();\r\nDB::commit();\r\nDB::rollBack();\r\n```\r\n### Query\r\n```\r\n// 查询完整示例\r\nDB::table(\'users\')\r\n->select(\'name\', \'email as user_email\')\r\n->where(\'id\',51)\r\n->orderBy(\'id\',\'desc\')\r\n->skip(10)\r\n->take(5)\r\n->first();\r\n\r\n// 多行数据\r\n$goods = DB::table(\'goods\')->where(\'id\',\'<\',10)->get();\r\n// 一列字段\r\n$good_names = DB::table(\'goods\')->where(\'id\',\'<\',10)->pluck(\'name\',\'id\');\r\n\r\n// 单行数据\r\n$good = DB::table(\'goods\')->select([\'id\',\'name\'])->where(\'id\',2)->first();\r\n// 一个字段\r\n$good_name = DB::table(\'goods\')->where(\'id\',2)->value(\'name\');\r\n\r\n// 添加数据\r\n$insert_status1 = DB::table(\'goods\')->insert([\'name\'=>\'英国红薯\']);\r\n$insert_status2 = DB::table(\'goods\')->insert([[\'name\'=>\'英国红薯\'],[\'name\'=>\'荷兰冰块\']]);\r\n$insert_id = DB::table(\'goods\')->insertGetId([\'name\'=>\'英国土豆\']);\r\n\r\n// 修改数据\r\n$update_status = DB::table(\'goods\')->where(\'id\',15)->update([\'name\'=>\'英国红薯\']);\r\n\r\n// 删除数据\r\n$delete_status = DB::table(\'goods\')->where(\'id\',15)->delete();\r\n\r\n// 分页列表\r\n$list = DB::table(\'goods\')->paginate(10);\r\n//$list = DB::table(\'goods\')->simplePaginate(10);\r\n```\r\n### Model\r\n```\r\n<?php\r\nnamespace AppModels;\r\n\r\nuse IlluminateDatabaseEloquentModel;\r\nuse IlluminateDatabaseEloquentBuilder;\r\n\r\nclass Article extends Model\r\n{\r\n protected $table = \'articles\';\r\n\r\n // 是否自动维护时间戳\r\n public $timestamps = true;\r\n \r\n // 模型的日期字段保存格式,默认:Y-m-d H:i:s\r\n protected $dateFormat=\'Y/m/d H:i:s\',\r\n \r\n // 允许批量处理的字段\r\n protected $fillable = [\'sort\'];\r\n // 禁止批量处理的字段\r\n // protected $guarded = [\'status\'];\r\n\r\n // 属性类型转换(integer,real,float,double,string,boolean,object,array,collection,date,datetime,timestamp)\r\n protected $casts = [\r\n \'is_hot\' => \'boolean\',\r\n \'is_publish\' => \'boolean\',\r\n ];\r\n \r\n // 应被转换为日期的属性\r\n protected $dates = [\r\n \'created_at\',\r\n \'updated_at\',\r\n \'deleted_at\'\r\n ];\r\n\r\n \r\n // 虚拟属性 toJson(),toArray()\r\n protected $appends = [\'short_tag\'];\r\n public function getShortTagAttribute()\r\n {\r\n $tag = [];\r\n if($this->attributes[\'is_hot\']){\r\n $tag[] = \'Hot\';\r\n }\r\n return $tag;\r\n }\r\n\r\n // 序列化时需要显示的属性\r\n protected $visible = [\'id\', \'title\', \'thumb\', \'author\'];\r\n // protected $hidden = [\'is_hot\',\'is_publish\'];\r\n\r\n\r\n protected static function boot()\r\n {\r\n parent::boot();\r\n\r\n // 全局作用域\r\n static::addGlobalScope(\'publish\', function(Builder $builder) {\r\n $builder->where(\'is_publish\', 1);\r\n });\r\n\r\n // 绑定事件\r\n static::creating(function ($model) { // 添加之前\r\n echo \'开始创建\';\r\n return true;\r\n });\r\n static::created(function ($model) { // 添加之后\r\n echo \'结束创建\';\r\n return true;\r\n });\r\n }\r\n // 局部作用域\r\n public function scopeHot($query)\r\n {\r\n return $query->where(\'is_hot\',1)->orderBy(\'sort\', \'asc\')->orderBy(\'id\', \'desc\');\r\n }\r\n public function scopeOfCid($query,$cid)\r\n {\r\n return $query->where(\'cid\',$cid);\r\n }\r\n \r\n // 访问器\r\n public function getIsPublishAttribute($value)\r\n {\r\n return $value ? \'已发布\' : \'待发布\';\r\n }\r\n // 修改器\r\n public function setAuthorAttribute($value)\r\n {\r\n if(!empty($value) && is_string($value)){\r\n $this->attributes[\'author\'] = ucwords($value);\r\n }\r\n }\r\n}\r\n```\r\n\r\n#### Relation\r\n```\r\n<?php\r\nnamespace AppModels;\r\nuse IlluminateDatabaseEloquentModel;\r\n\r\nclass Good extends Model\r\n{\r\n protected $table = \'goods\';\r\n public $timestamps = false;\r\n\r\n public function extend()\r\n {\r\n return $this->hasOne(GoodExtend::class,\'good_id\',\'id\');\r\n }\r\n public function activitys()\r\n {\r\n return $this->hasMany(GoodActivity::class,\'good_id\',\'id\');\r\n }\r\n public function tags()\r\n {\r\n return $this->belongsToMany(Tag::class,\'good_tag\',\'good_id\',\'tag_id\');\r\n }\r\n}\r\nclass GoodActivity extends Model\r\n{\r\n protected $table = \'good_activity\';\r\n public $timestamps = false;\r\n\r\n public function good()\r\n {\r\n return $this->belongsTo(Good::class,\'good_id\',\'id\');\r\n }\r\n}\r\nclass Country extends Model\r\n{\r\n protected $table = \'countrys\';\r\n public $timestamps = false;\r\n \r\n public function activitys()\r\n {\r\n return $this->hasManyThrough(GoodActivity::class,Good::class,\'country_id\',\'good_id\',\'id\');\r\n }\r\n}\r\n```\r\n\r\n#### Relation Curd\r\n```\r\n<?php\r\n$good = new Good();\r\n$good->name = \'自家玉米\';\r\n$good->save();\r\n\r\n// 一对一\r\n$extend = new GoodExtend();\r\n$extend->remark = \'真的,真的是自家的.\';\r\n$good->extend()->save($extend);\r\n\r\n// 一对多\r\n$activity = [\'促销\',\'年终\'];\r\n$activitys=[];\r\nforeach($activity as $v){\r\n $act=new GoodActivity();\r\n $act->title = $v;\r\n $activitys[]= $act;\r\n}\r\n$good->activitys()->saveMany($activitys);\r\n\r\n// 多对多\r\n$tag_ids=[1,2,3];\r\n$good->tags()->attach($tag_ids);// 添加关联\r\n// $good->tags()->detach(); // 解除关联\r\n\r\n//增加$fillable属性中字段\r\n$good = Good::create([\'name\'=>\'美国小麦\']);\r\n$good->extend()->create([\'remark\'=>\'美国进口的高大上\']);\r\n```', '2017-06-25 15:48:25', '2017-06-25 15:48:25');
INSERT INTO `article` VALUES ('6', '2', 'Authenticate 简单认证', '最简单的认证方式Authenticate', '&lt;h2&gt;简单判断&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt; if (!isset($_SERVER[\'PHP_AUTH_USER\'])) {\n header(\'WWW-Authenticate: Basic realm=&quot;My Realm&quot;\');\n header(\'HTTP/1.0 401 Unauthorized\');\n echo \'Text to send if user hits Cancel button\';\n exit;\n } else {\n echo &quot;&amp;lt;p&amp;gt;Hello {$_SERVER[\'PHP_AUTH_USER\']}.&amp;lt;/p&amp;gt;&quot;;\n echo &quot;&amp;lt;p&amp;gt;You entered {$_SERVER[\'PHP_AUTH_PW\']} as your password.&amp;lt;/p&amp;gt;&quot;;\n }&lt;/code&gt;&lt;/pre&gt;\n&lt;h3&gt;封装类&lt;/h3&gt;\n&lt;pre&gt;&lt;code&gt;class PhpAuth\n{\n protected $username;\n protected $password;\n\n public function __construct($username, $password)\n { \n $this-&amp;gt;username = (string) $username;\n $this-&amp;gt;password = (string) $password;\n }\n\n public function check()\n { \n $authUsername = isset($_SERVER[\'PHP_AUTH_USER\']) ? $_SERVER[\'PHP_AUTH_USER\'] : null;\n $authPassword = isset($_SERVER[\'PHP_AUTH_PW\']) ? $_SERVER[\'PHP_AUTH_PW\'] : null;\n\n if($this-&amp;gt;username !== $authUsername || $this-&amp;gt;password !== $authPassword ){\n return $this-&amp;gt;authenticate();\n }\n\n return true;\n }\n\n protected static function authenticate()\n {\n header(\'WWW-Authenticate: Basic realm=&quot;User Authenticate&quot;\');\n header(\'HTTP/1.0 401 Unauthorized\');\n return false;\n }\n}&lt;/code&gt;&lt;/pre&gt;', '## 简单判断\r\n```\r\n if (!isset($_SERVER[\'PHP_AUTH_USER\'])) {\r\n header(\'WWW-Authenticate: Basic realm=\"My Realm\"\');\r\n header(\'HTTP/1.0 401 Unauthorized\');\r\n echo \'Text to send if user hits Cancel button\';\r\n exit;\r\n } else {\r\n echo \"<p>Hello {$_SERVER[\'PHP_AUTH_USER\']}.</p>\";\r\n echo \"<p>You entered {$_SERVER[\'PHP_AUTH_PW\']} as your password.</p>\";\r\n }\r\n```\r\n### 封装类\r\n```\r\nclass PhpAuth\r\n{\r\n protected $username;\r\n protected $password;\r\n\r\n public function __construct($username, $password)\r\n { \r\n $this->username = (string) $username;\r\n $this->password = (string) $password;\r\n }\r\n\r\n public function check()\r\n { \r\n $authUsername = isset($_SERVER[\'PHP_AUTH_USER\']) ? $_SERVER[\'PHP_AUTH_USER\'] : null;\r\n $authPassword = isset($_SERVER[\'PHP_AUTH_PW\']) ? $_SERVER[\'PHP_AUTH_PW\'] : null;\r\n\r\n if($this->username !== $authUsername || $this->password !== $authPassword ){\r\n return $this->authenticate();\r\n }\r\n\r\n return true;\r\n }\r\n\r\n protected static function authenticate()\r\n {\r\n header(\'WWW-Authenticate: Basic realm=\"User Authenticate\"\');\r\n header(\'HTTP/1.0 401 Unauthorized\');\r\n return false;\r\n }\r\n}\r\n```', '2017-06-25 15:51:39', '2017-06-25 15:51:39');
INSERT INTO `article` VALUES ('7', '2', 'Laravel 执行分析', 'Laravel 应用执行分析', '&lt;h2&gt;流程概括&lt;/h2&gt;\n&lt;p&gt;/public/index.php\n(1) 自动加载 1-20\n(2) 初始化应用 21-33\n(3) 执行应用 34-206 &lt;/p&gt;\n&lt;p&gt;/bootstrap/autoload.php\n(1.1) 加载 /vendor/autoload.php\n(1.2) 判断或加载已合并的文件 /bootstrap/cache/compiled.php &lt;/p&gt;\n&lt;p&gt;/bootstrap/app.php\n(2.1) 实例化Application\n(2.2) 声明Http/Console/Debug接口的Single实例类 &lt;/p&gt;\n&lt;p&gt;/public/index.php\n(3.1) 实例化Http\n(3.2) 解析并处理请求\n(3.3) 输出响应结果\n(3.4) 触发后置中间件 &lt;/p&gt;\n&lt;h2&gt;执行应用(3.2)&lt;/h2&gt;\n&lt;h3&gt;初始化基础类&lt;/h3&gt;\n&lt;p&gt;开启表单中&lt;code&gt;_method=put&lt;/code&gt;覆盖&lt;code&gt;$_SERVER[REQUEST_METHOD]&lt;/code&gt;,并初始化基础类&lt;/p&gt;\n&lt;pre&gt;&lt;code&gt;// 基础类数组\nprotected $bootstrappers = [\n \'IlluminateFoundationBootstrapDetectEnvironment\',\n \'IlluminateFoundationBootstrapLoadConfiguration\',\n \'IlluminateFoundationBootstrapConfigureLogging\',\n \'IlluminateFoundationBootstrapHandleExceptions\',\n \'IlluminateFoundationBootstrapRegisterFacades\',\n \'IlluminateFoundationBootstrapRegisterProviders\',\n \'IlluminateFoundationBootstrapBootProviders\',\n];\n// 初始化逻辑\npublic function bootstrapWith(array $bootstrappers)\n{\n $this-&amp;gt;hasBeenBootstrapped = true;\n\n foreach ($bootstrappers as $bootstrapper) {\n $this[\'events\']-&amp;gt;fire(\'bootstrapping: \'.$bootstrapper, [$this]);\n\n $this-&amp;gt;make($bootstrapper)-&amp;gt;bootstrap($this);\n\n $this[\'events\']-&amp;gt;fire(\'bootstrapped: \'.$bootstrapper, [$this]);\n }\n}&lt;/code&gt;&lt;/pre&gt;\n&lt;ol&gt;\n&lt;li&gt;默认加载&lt;code&gt;.env&lt;/code&gt;到环境变量,&lt;code&gt;cli&lt;/code&gt;模式下&lt;code&gt;php index.php --env=local&lt;/code&gt;加载&lt;code&gt;.env.local&lt;/code&gt;&lt;/li&gt;\n&lt;li&gt;加载&lt;code&gt;/config&lt;/code&gt;所有配置文件&lt;/li&gt;\n&lt;li&gt;绑定实例&lt;code&gt;Monolog&lt;/code&gt;到&lt;code&gt;log&lt;/code&gt;,并根据&lt;code&gt;config/app.php&lt;/code&gt;下的log配置&lt;/li&gt;\n&lt;li&gt;注册错误处理机制,&lt;code&gt;set_error_handler();set_exception_handler();register_shutdown_function();&lt;/code&gt;&lt;/li&gt;\n&lt;li&gt;注册门面自动加载机制&lt;code&gt;Facades&lt;/code&gt;,根据&lt;code&gt;config(\'app.aliases\')&lt;/code&gt;执行&lt;code&gt;class_alias()&lt;/code&gt;&lt;/li&gt;\n&lt;li&gt;注册服务提供者,根据&lt;code&gt;config(\'app.providers\')&lt;/code&gt;生成&lt;code&gt;bootstrap/cache/services.php&lt;/code&gt;,注册服务提供者&lt;code&gt;register()&lt;/code&gt;,注册延迟服务提供者&lt;code&gt;$defer = true&lt;/code&gt;,绑定事件&lt;code&gt;when()&lt;/code&gt;&lt;/li&gt;\n&lt;li&gt;执行app中&lt;code&gt;$bootingCallbacks&lt;/code&gt;的回调数组,执行&lt;code&gt;$serviceProviders&lt;/code&gt;类的&lt;code&gt;boot()&lt;/code&gt;方法,执行app中&lt;code&gt;$bootedCallbacks&lt;/code&gt;的回调数组&lt;/li&gt;\n&lt;/ol&gt;\n&lt;h3&gt;执行全局中间件&lt;/h3&gt;\n&lt;p&gt;AppHttpKernel&lt;/p&gt;\n&lt;pre&gt;&lt;code&gt;protected $middleware = [\n IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,\n];&lt;/code&gt;&lt;/pre&gt;\n&lt;h3&gt;解析路由&lt;/h3&gt;\n&lt;ol&gt;\n&lt;li&gt;根据请求参数匹配路由&lt;code&gt;$route = $this-&amp;gt;findRoute($request);&lt;/code&gt;&lt;/li&gt;\n&lt;li&gt;触发路由匹配事件&lt;code&gt;IlluminateRoutingEventsRouteMatched&lt;/code&gt;&lt;/li&gt;\n&lt;li&gt;\n&lt;p&gt;执行分组中间件,路由中间件,控制器中间件&lt;/p&gt;\n&lt;pre&gt;&lt;code&gt;// 分组中间件\nprotected $middlewareGroups = [\n\'web\' =&amp;gt; [\n AppHttpMiddlewareEncryptCookies::class,\n IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,\n IlluminateSessionMiddlewareStartSession::class,\n IlluminateViewMiddlewareShareErrorsFromSession::class,\n AppHttpMiddlewareVerifyCsrfToken::class,\n IlluminateRoutingMiddlewareSubstituteBindings::class,\n],\n\n\'api\' =&amp;gt; [\n \'throttle:60,1\',\n \'bindings\',\n],\n];\n// 路由中间件\nprotected $routeMiddleware = [\n\'auth\' =&amp;gt; IlluminateAuthMiddlewareAuthenticate::class,\n\'auth.basic\' =&amp;gt; IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,\n\'bindings\' =&amp;gt; IlluminateRoutingMiddlewareSubstituteBindings::class,\n\'can\' =&amp;gt; IlluminateAuthMiddlewareAuthorize::class,\n\'guest\' =&amp;gt; AppHttpMiddlewareRedirectIfAuthenticated::class,\n\'throttle\' =&amp;gt; IlluminateRoutingMiddlewareThrottleRequests::class,\n];&lt;/code&gt;&lt;/pre&gt;\n&lt;/li&gt;\n&lt;li&gt;执行控制器或回调\n&lt;pre&gt;&lt;code&gt;// 控制器执行方式\n// (new IlluminateRoutingControllerDispatcher($container))-&amp;gt;dispatch(Route $route, $controller, $method)\n$parameters = $this-&amp;gt;resolveClassMethodDependencies(\n$route-&amp;gt;parametersWithoutNulls(), $controller, $method\n);\nif (method_exists($controller, \'callAction\')) {\nreturn $controller-&amp;gt;callAction($method, $parameters);\n}\nreturn call_user_func_array([$controller, $method], $parameters);&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;\n&lt;li&gt;返回封装为Response\n&lt;pre&gt;&lt;code&gt;return $this-&amp;gt;prepareResponse($request,$route-&amp;gt;run($request));&lt;/code&gt;&lt;/pre&gt;&lt;/li&gt;\n&lt;/ol&gt;', '## 流程概括\r\n/public/index.php \r\n(1) 自动加载 1-20 \r\n(2) 初始化应用 21-33 \r\n(3) 执行应用 34-206 \r\n\r\n/bootstrap/autoload.php \r\n(1.1) 加载 /vendor/autoload.php \r\n(1.2) 判断或加载已合并的文件 /bootstrap/cache/compiled.php \r\n\r\n/bootstrap/app.php \r\n(2.1) 实例化Application \r\n(2.2) 声明Http/Console/Debug接口的Single实例类 \r\n\r\n/public/index.php \r\n(3.1) 实例化Http \r\n(3.2) 解析并处理请求 \r\n(3.3) 输出响应结果 \r\n(3.4) 触发后置中间件 \r\n\r\n## 执行应用(3.2)\r\n### 初始化基础类\r\n开启表单中`_method=put`覆盖`$_SERVER[REQUEST_METHOD]`,并初始化基础类\r\n```\r\n// 基础类数组\r\nprotected $bootstrappers = [\r\n \'IlluminateFoundationBootstrapDetectEnvironment\',\r\n \'IlluminateFoundationBootstrapLoadConfiguration\',\r\n \'IlluminateFoundationBootstrapConfigureLogging\',\r\n \'IlluminateFoundationBootstrapHandleExceptions\',\r\n \'IlluminateFoundationBootstrapRegisterFacades\',\r\n \'IlluminateFoundationBootstrapRegisterProviders\',\r\n \'IlluminateFoundationBootstrapBootProviders\',\r\n];\r\n// 初始化逻辑\r\npublic function bootstrapWith(array $bootstrappers)\r\n{\r\n $this->hasBeenBootstrapped = true;\r\n\r\n foreach ($bootstrappers as $bootstrapper) {\r\n $this[\'events\']->fire(\'bootstrapping: \'.$bootstrapper, [$this]);\r\n\r\n $this->make($bootstrapper)->bootstrap($this);\r\n\r\n $this[\'events\']->fire(\'bootstrapped: \'.$bootstrapper, [$this]);\r\n }\r\n}\r\n```\r\n1. 默认加载`.env`到环境变量,`cli`模式下`php index.php --env=local`加载`.env.local`\r\n2. 加载`/config`所有配置文件\r\n3. 绑定实例`Monolog`到`log`,并根据`config/app.php`下的log配置\r\n4. 注册错误处理机制,` set_error_handler();set_exception_handler();register_shutdown_function();`\r\n5. 注册门面自动加载机制`Facades`,根据`config(\'app.aliases\')`执行`class_alias()`\r\n6. 注册服务提供者,根据`config(\'app.providers\')`生成`bootstrap/cache/services.php`,注册服务提供者`register()`,注册延迟服务提供者`$defer = true`,绑定事件`when()`\r\n7. 执行app中`$bootingCallbacks`的回调数组,执行`$serviceProviders`类的`boot()`方法,执行app中`$bootedCallbacks`的回调数组\r\n\r\n### 执行全局中间件\r\nAppHttpKernel\r\n```\r\nprotected $middleware = [\r\n IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,\r\n];\r\n```\r\n\r\n### 解析路由\r\n1. 根据请求参数匹配路由`$route = $this->findRoute($request);`\r\n2. 触发路由匹配事件`IlluminateRoutingEventsRouteMatched`\r\n3. 执行分组中间件,路由中间件,控制器中间件\r\n```\r\n// 分组中间件\r\nprotected $middlewareGroups = [\r\n \'web\' => [\r\n AppHttpMiddlewareEncryptCookies::class,\r\n IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,\r\n IlluminateSessionMiddlewareStartSession::class,\r\n IlluminateViewMiddlewareShareErrorsFromSession::class,\r\n AppHttpMiddlewareVerifyCsrfToken::class,\r\n IlluminateRoutingMiddlewareSubstituteBindings::class,\r\n ],\r\n\r\n \'api\' => [\r\n \'throttle:60,1\',\r\n \'bindings\',\r\n ],\r\n];\r\n// 路由中间件\r\nprotected $routeMiddleware = [\r\n \'auth\' => IlluminateAuthMiddlewareAuthenticate::class,\r\n \'auth.basic\' => IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,\r\n \'bindings\' => IlluminateRoutingMiddlewareSubstituteBindings::class,\r\n \'can\' => IlluminateAuthMiddlewareAuthorize::class,\r\n \'guest\' => AppHttpMiddlewareRedirectIfAuthenticated::class,\r\n \'throttle\' => IlluminateRoutingMiddlewareThrottleRequests::class,\r\n];\r\n```\r\n4. 执行控制器或回调\r\n```\r\n// 控制器执行方式\r\n// (new IlluminateRoutingControllerDispatcher($container))->dispatch(Route $route, $controller, $method)\r\n$parameters = $this->resolveClassMethodDependencies(\r\n $route->parametersWithoutNulls(), $controller, $method\r\n);\r\nif (method_exists($controller, \'callAction\')) {\r\n return $controller->callAction($method, $parameters);\r\n}\r\nreturn call_user_func_array([$controller, $method], $parameters);\r\n```\r\n5. 返回封装为Response\r\n```\r\nreturn $this->prepareResponse($request,$route->run($request));\r\n```\r\n\r\n', '2017-06-25 16:07:52', '2017-06-25 16:07:52');
INSERT INTO `article` VALUES ('8', '1', 'owl-carousel 焦点图', '强大的JS焦点图', '&lt;h2&gt;下载&lt;/h2&gt;\n&lt;blockquote&gt;\n&lt;p&gt;&lt;a href=&quot;https://github.com/OwlFonk/OwlCarousel/releases&quot;&gt;https://github.com/OwlFonk/OwlCarousel/releases&lt;/a&gt;&lt;/p&gt;\n&lt;/blockquote&gt;\n&lt;h2&gt;代码&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;&amp;lt;link href=&quot;/js/owl/owl.carousel.css&quot; rel=&quot;stylesheet&quot;&amp;gt;\n&amp;lt;link href=&quot;/js/owl/owl.theme.css&quot; rel=&quot;stylesheet&quot;&amp;gt;\n\n&amp;lt;div id=&quot;owlBanner&quot; class=&quot;owl-carousel owl-theme&quot;&amp;gt;\n @foreach($banners as $banner)\n &amp;lt;div class=&quot;item&quot;&amp;gt;\n &amp;lt;a href=&quot;{{ $banner-&amp;gt;url }}&quot;&amp;gt;\n &amp;lt;img class=&quot;lazyOwl&quot; data-src=&quot;{{ $banner-&amp;gt;image }}&quot; alt=&quot;{{ $banner-&amp;gt;title }}&quot; height=&quot;360&quot; width=&quot;100%&quot;&amp;gt;\n &amp;lt;/a&amp;gt;\n &amp;lt;/div&amp;gt;\n @endforeach\n&amp;lt;/div&amp;gt;\n\n&amp;lt;script src=&quot;/js/owl/owl.carousel.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;\n&amp;lt;script&amp;gt;\n$(&quot;#owlBanner&quot;).owlCarousel({\n navigation : false, // 显示左右箭头,默认false\n autoPlay : true, //自动播放,默认false\n slideSpeed : 5000, //轮播间隔时间\n singleItem : true, //单个图片\n lazyLoad : true, //延迟加载\n stopOnHover : true, //悬停停止播放,默认false\n});&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;参数&lt;/h2&gt;\n&lt;table&gt;\n&lt;thead&gt;\n&lt;tr&gt;\n&lt;th&gt;参数&lt;/th&gt;\n&lt;th&gt;类型&lt;/th&gt;\n&lt;th&gt;默认值&lt;/th&gt;\n&lt;th&gt;说明&lt;/th&gt;\n&lt;/tr&gt;\n&lt;/thead&gt;\n&lt;tbody&gt;\n&lt;tr&gt;\n&lt;td&gt;items&lt;/td&gt;\n&lt;td&gt;整数&lt;/td&gt;\n&lt;td&gt;5&lt;/td&gt;\n&lt;td&gt;幻灯片每页可见个数&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;itemsDesktop&lt;/td&gt;\n&lt;td&gt;数组&lt;/td&gt;\n&lt;td&gt;[1199,4]&lt;/td&gt;\n&lt;td&gt;设置浏览器宽度和幻灯片可见个数,格式为[X,Y],X 为浏览器宽度,Y 为可见个数,如[1199,4]就是如果浏览器宽度小于1199,每页显示 4 张,此参数主要用于响应式设计。也可以使用 false&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;itemsDesktopSmall&lt;/td&gt;\n&lt;td&gt;数组&lt;/td&gt;\n&lt;td&gt;[979,3]&lt;/td&gt;\n&lt;td&gt;同上&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;itemsTablet&lt;/td&gt;\n&lt;td&gt;数组&lt;/td&gt;\n&lt;td&gt;[768,2]&lt;/td&gt;\n&lt;td&gt;同上&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;itemsTabletSmall&lt;/td&gt;\n&lt;td&gt;数组&lt;/td&gt;\n&lt;td&gt;false&lt;/td&gt;\n&lt;td&gt;同上,默认为 false&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;itemsMobile&lt;/td&gt;\n&lt;td&gt;数组&lt;/td&gt;\n&lt;td&gt;[479,1]&lt;/td&gt;\n&lt;td&gt;同上&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;itemsCustom&lt;/td&gt;\n&lt;td&gt;数组&lt;/td&gt;\n&lt;td&gt;false&lt;/td&gt;\n&lt;td&gt;&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;singleItem&lt;/td&gt;\n&lt;td&gt;布尔值&lt;/td&gt;\n&lt;td&gt;false&lt;/td&gt;\n&lt;td&gt;是否只显示一张&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;itemsScaleUp&lt;/td&gt;\n&lt;td&gt;布尔值&lt;/td&gt;\n&lt;td&gt;false&lt;/td&gt;\n&lt;td&gt;&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;slideSpeed&lt;/td&gt;\n&lt;td&gt;整数&lt;/td&gt;\n&lt;td&gt;200&lt;/td&gt;\n&lt;td&gt;幻灯片切换速度,以毫秒为单位&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;paginationSpeed&lt;/td&gt;\n&lt;td&gt;整数&lt;/td&gt;\n&lt;td&gt;800&lt;/td&gt;\n&lt;td&gt;分页切换速度,以毫秒为单位&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;rewindSpeed&lt;/td&gt;\n&lt;td&gt;整数&lt;/td&gt;\n&lt;td&gt;1000&lt;/td&gt;\n&lt;td&gt;重回速度,以毫秒为单位&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;autoPlay&lt;/td&gt;\n&lt;td&gt;布尔值/整数&lt;/td&gt;\n&lt;td&gt;false&lt;/td&gt;\n&lt;td&gt;自动播放,可选布尔值或整数,若使用整数,如 3000,表示 3 秒切换一次;若设置为 true,默认 5 秒切换一次&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;stopOnHover&lt;/td&gt;\n&lt;td&gt;布尔值&lt;/td&gt;\n&lt;td&gt;false&lt;/td&gt;\n&lt;td&gt;鼠标悬停停止自动播放&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;navigation&lt;/td&gt;\n&lt;td&gt;布尔值&lt;/td&gt;\n&lt;td&gt;false&lt;/td&gt;\n&lt;td&gt;显示“上一个”、“下一个”&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;navigationText&lt;/td&gt;\n&lt;td&gt;数组&lt;/td&gt;\n&lt;td&gt;[“prev”,”next”]&lt;/td&gt;\n&lt;td&gt;设置“上一个”、“下一个”文字,默认是[“prev”,”next”]&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;rewindNav&lt;/td&gt;\n&lt;td&gt;布尔值&lt;/td&gt;\n&lt;td&gt;true&lt;/td&gt;\n&lt;td&gt;滑动到第一个&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;scrollPerPage&lt;/td&gt;\n&lt;td&gt;布尔值&lt;/td&gt;\n&lt;td&gt;false&lt;/td&gt;\n&lt;td&gt;每页滚动而不是每个项目滚动&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;pagination&lt;/td&gt;\n&lt;td&gt;布尔值&lt;/td&gt;\n&lt;td&gt;true&lt;/td&gt;\n&lt;td&gt;显示分页&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;paginationNumbers&lt;/td&gt;\n&lt;td&gt;布尔值&lt;/td&gt;\n&lt;td&gt;false&lt;/td&gt;\n&lt;td&gt;分页按钮显示数字&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;responsive&lt;/td&gt;\n&lt;td&gt;布尔值&lt;/td&gt;\n&lt;td&gt;true&lt;/td&gt;\n&lt;td&gt;&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;responsiveRefreshRate&lt;/td&gt;\n&lt;td&gt;整数&lt;/td&gt;\n&lt;td&gt;200&lt;/td&gt;\n&lt;td&gt;每 200 毫秒检测窗口宽度并做相应的调整,主要用于响应式&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;responsiveBaseWidth&lt;/td&gt;\n&lt;td&gt;jQuery 选择器&lt;/td&gt;\n&lt;td&gt;window&lt;/td&gt;\n&lt;td&gt;&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;baseClass&lt;/td&gt;\n&lt;td&gt;字符串&lt;/td&gt;\n&lt;td&gt;owl-carousel&lt;/td&gt;\n&lt;td&gt;添加 CSS,如果不需要,最好不要使用&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;theme&lt;/td&gt;\n&lt;td&gt;字符串&lt;/td&gt;\n&lt;td&gt;owl-theme&lt;/td&gt;\n&lt;td&gt;主题样式,可以自行添加以符合你的要求&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;lazyLoad&lt;/td&gt;\n&lt;td&gt;布尔值&lt;/td&gt;\n&lt;td&gt;false&lt;/td&gt;\n&lt;td&gt;延迟加载&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;lazyFollow&lt;/td&gt;\n&lt;td&gt;布尔值&lt;/td&gt;\n&lt;td&gt;true&lt;/td&gt;\n&lt;td&gt;当使用分页时,如果跨页浏览,将不加载跳过页面的图片,只加载所要显示页面的图片,如果设置为 false,则会加载跳过页面的图片。这是 lazyLoad 的子选项&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;lazyEffect&lt;/td&gt;\n&lt;td&gt;布尔值/字符串&lt;/td&gt;\n&lt;td&gt;fade&lt;/td&gt;\n&lt;td&gt;延迟加载图片的显示效果,默认以 400 毫秒淡入,若为 false 则不使用效果&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;autoHeight&lt;/td&gt;\n&lt;td&gt;布尔值&lt;/td&gt;\n&lt;td&gt;false&lt;/td&gt;\n&lt;td&gt;自动使用高度&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;jsonPath&lt;/td&gt;\n&lt;td&gt;字符串&lt;/td&gt;\n&lt;td&gt;false&lt;/td&gt;\n&lt;td&gt;JSON 文件路径&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;jsonSuccess&lt;/td&gt;\n&lt;td&gt;函数&lt;/td&gt;\n&lt;td&gt;false&lt;/td&gt;\n&lt;td&gt;处理自定义 JSON 格式的函数&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;dragBeforeAnimFinish&lt;/td&gt;\n&lt;td&gt;布尔值&lt;/td&gt;\n&lt;td&gt;true&lt;/td&gt;\n&lt;td&gt;忽略过度是否完成(只限拖动)&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;mouseDrag&lt;/td&gt;\n&lt;td&gt;布尔值&lt;/td&gt;\n&lt;td&gt;true&lt;/td&gt;\n&lt;td&gt;关闭/开启鼠标事件&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;touchDrag&lt;/td&gt;\n&lt;td&gt;布尔值&lt;/td&gt;\n&lt;td&gt;true&lt;/td&gt;\n&lt;td&gt;关闭/开启触摸事件&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;addClassActive&lt;/td&gt;\n&lt;td&gt;布尔值&lt;/td&gt;\n&lt;td&gt;false&lt;/td&gt;\n&lt;td&gt;给可见的项目加入 “active” 类&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;transitionStyle&lt;/td&gt;\n&lt;td&gt;字符串&lt;/td&gt;\n&lt;td&gt;false&lt;/td&gt;\n&lt;td&gt;添加 CSS3 过度效果&lt;/td&gt;\n&lt;/tr&gt;\n&lt;/tbody&gt;\n&lt;/table&gt;\n&lt;h2&gt;参考&lt;/h2&gt;\n&lt;blockquote&gt;\n&lt;p&gt;&lt;a href=&quot;http://www.dowebok.com/93.html&quot;&gt;http://www.dowebok.com/93.html&lt;/a&gt;&lt;/p&gt;\n&lt;/blockquote&gt;', '## 下载\r\n> https://github.com/OwlFonk/OwlCarousel/releases\r\n\r\n## 代码\r\n```\r\n<link href=\"/js/owl/owl.carousel.css\" rel=\"stylesheet\">\r\n<link href=\"/js/owl/owl.theme.css\" rel=\"stylesheet\">\r\n\r\n<div id=\"owlBanner\" class=\"owl-carousel owl-theme\">\r\n @foreach($banners as $banner)\r\n <div class=\"item\">\r\n <a href=\"{{ $banner->url }}\">\r\n <img class=\"lazyOwl\" data-src=\"{{ $banner->image }}\" alt=\"{{ $banner->title }}\" height=\"360\" width=\"100%\">\r\n </a>\r\n </div>\r\n @endforeach\r\n</div>\r\n\r\n<script src=\"/js/owl/owl.carousel.min.js\"></script>\r\n<script>\r\n$(\"#owlBanner\").owlCarousel({\r\n navigation : false, // 显示左右箭头,默认false\r\n autoPlay : true, //自动播放,默认false\r\n slideSpeed : 5000, //轮播间隔时间\r\n singleItem : true, //单个图片\r\n lazyLoad : true, //延迟加载\r\n stopOnHover : true, //悬停停止播放,默认false\r\n});\r\n```\r\n\r\n## 参数\r\n| 参数 | 类型 | 默认值 | 说明 |\r\n| --- | --- | --- | --- |\r\n| items | 整数 | 5 | 幻灯片每页可见个数 |\r\n| itemsDesktop | 数组 | [1199,4] | 设置浏览器宽度和幻灯片可见个数,格式为[X,Y],X 为浏览器宽度,Y 为可见个数,如[1199,4]就是如果浏览器宽度小于1199,每页显示 4 张,此参数主要用于响应式设计。也可以使用 false |\r\n| itemsDesktopSmall | 数组 | [979,3] | 同上 |\r\n| itemsTablet | 数组 | [768,2] | 同上 |\r\n| itemsTabletSmall | 数组 | false | 同上,默认为 false |\r\n| itemsMobile | 数组 | [479,1] | 同上 |\r\n| itemsCustom | 数组 | false | |\r\n| singleItem | 布尔值 | false | 是否只显示一张 |\r\n| itemsScaleUp | 布尔值 | false | |\r\n| slideSpeed | 整数 | 200 | 幻灯片切换速度,以毫秒为单位 |\r\n| paginationSpeed | 整数 | 800 | 分页切换速度,以毫秒为单位 |\r\n| rewindSpeed | 整数 | 1000 | 重回速度,以毫秒为单位 |\r\n| autoPlay | 布尔值/整数 | false | 自动播放,可选布尔值或整数,若使用整数,如 3000,表示 3 秒切换一次;若设置为 true,默认 5 秒切换一次 |\r\n| stopOnHover | 布尔值 | false | 鼠标悬停停止自动播放 |\r\n| navigation | 布尔值 | false | 显示“上一个”、“下一个” |\r\n| navigationText | 数组 | [“prev”,”next”] | 设置“上一个”、“下一个”文字,默认是[“prev”,”next”] |\r\n| rewindNav | 布尔值 | true | 滑动到第一个 |\r\n| scrollPerPage | 布尔值 | false | 每页滚动而不是每个项目滚动 |\r\n| pagination | 布尔值 | true | 显示分页 |\r\n| paginationNumbers | 布尔值 | false | 分页按钮显示数字 |\r\n| responsive | 布尔值 | true | |\r\n| responsiveRefreshRate | 整数 | 200 | 每 200 毫秒检测窗口宽度并做相应的调整,主要用于响应式 |\r\n| responsiveBaseWidth | jQuery 选择器 | window | |\r\n| baseClass | 字符串 | owl-carousel | 添加 CSS,如果不需要,最好不要使用 |\r\n| theme | 字符串 | owl-theme | 主题样式,可以自行添加以符合你的要求 |\r\n| lazyLoad | 布尔值 | false | 延迟加载 |\r\n| lazyFollow | 布尔值 | true | 当使用分页时,如果跨页浏览,将不加载跳过页面的图片,只加载所要显示页面的图片,如果设置为 false,则会加载跳过页面的图片。这是 lazyLoad 的子选项 |\r\n| lazyEffect | 布尔值/字符串 | fade | 延迟加载图片的显示效果,默认以 400 毫秒淡入,若为 false 则不使用效果 |\r\n| autoHeight | 布尔值 | false | 自动使用高度 |\r\n| jsonPath | 字符串 | false | JSON 文件路径 |\r\n| jsonSuccess | 函数 | false | 处理自定义 JSON 格式的函数 |\r\n| dragBeforeAnimFinish | 布尔值 | true | 忽略过度是否完成(只限拖动) |\r\n| mouseDrag | 布尔值 | true | 关闭/开启鼠标事件 |\r\n| touchDrag | 布尔值 | true | 关闭/开启触摸事件 |\r\n| addClassActive | 布尔值 | false | 给可见的项目加入 “active” 类 |\r\n| transitionStyle | 字符串 | false | 添加 CSS3 过度效果 |\r\n\r\n## 参考\r\n> http://www.dowebok.com/93.html', '2017-06-25 17:04:00', '2017-06-25 17:04:00');
INSERT INTO `article` VALUES ('9', '1', 'HTML 基础模板', 'HTML基础模板代码示例', '&lt;h2&gt;基本摸板&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;&amp;lt;!DOCTYPE html&amp;gt;\n&amp;lt;html lang=&quot;zh-CN&quot;&amp;gt;\n&amp;lt;head&amp;gt;\n &amp;lt;meta charset=&quot;utf-8&quot;&amp;gt;\n &amp;lt;meta name=&quot;renderer&quot; content=&quot;webkit&quot;&amp;gt;\n &amp;lt;meta http-equiv=&quot;X-UA-Compatible&quot; content=&quot;IE=edge,chrome=1&quot;&amp;gt;\n &amp;lt;meta name=&quot;viewport&quot; content=&quot;width=device-width, initial-scale=1&quot;&amp;gt;\n\n &amp;lt;title&amp;gt;TITLE&amp;lt;/title&amp;gt;\n &amp;lt;meta name=&quot;Keywords&quot; content=&quot;KEYWORDS&quot;&amp;gt;\n &amp;lt;meta name=&quot;description&quot; content=&quot;DESCRIPTION&quot;&amp;gt;\n &amp;lt;link rel=&quot;shortcut icon&quot; href=&quot;favicon.ico&quot;&amp;gt;\n\n &amp;lt;!--[if lt IE 9]&amp;gt;\n &amp;lt;script src=&quot;https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;\n &amp;lt;script src=&quot;https://oss.maxcdn.com/respond/1.4.2/respond.min.js&quot;&amp;gt;&amp;lt;/script&amp;gt;\n &amp;lt;![endif]--&amp;gt;\n&amp;lt;/head&amp;gt;\n&amp;lt;body&amp;gt;\n\n &amp;lt;form action=&quot;&quot; method=&quot;post&quot; enctype=&quot;multipart/form-data&quot;&amp;gt;\n &amp;lt;input name=&quot;avatar&quot; type=&quot;file&quot; accept=&quot;image/*&quot;&amp;gt;\n &amp;lt;input type=&quot;submit&quot;&amp;gt;\n &amp;lt;/form&amp;gt;\n\n&amp;lt;/body&amp;gt;\n&amp;lt;/html&amp;gt;&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;配置DNS预获取&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;&amp;lt;link rel=&quot;dns-prefetch&quot; href=&quot;//static.web-host.com&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;禁用favicon.ico,版本&amp;gt;IE8&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;&amp;lt;link rel=&quot;icon&quot; href=&quot;data:;base64,=&quot;&amp;gt;\n\n&amp;lt;link rel=&quot;icon&quot; href=&quot;data:image/ico;base64,aWNv&quot;&amp;gt;&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;禁用百度转码&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;&amp;lt;meta http-equiv=&quot;Cache-Control&quot; content=&quot;no-transform&quot; /&amp;gt;\n&amp;lt;meta http-equiv=&quot;Cache-Control&quot; content=&quot;no-siteapp&quot; /&amp;gt;&lt;/code&gt;&lt;/pre&gt;', '## 基本摸板\r\n```\r\n<!DOCTYPE html>\r\n<html lang=\"zh-CN\">\r\n<head>\r\n <meta charset=\"utf-8\">\r\n <meta name=\"renderer\" content=\"webkit\">\r\n <meta http-equiv=\"X-UA-Compatible\" content=\"IE=edge,chrome=1\">\r\n <meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\r\n \r\n <title>TITLE</title>\r\n <meta name=\"Keywords\" content=\"KEYWORDS\">\r\n <meta name=\"description\" content=\"DESCRIPTION\">\r\n <link rel=\"shortcut icon\" href=\"favicon.ico\">\r\n \r\n <!--[if lt IE 9]>\r\n <script src=\"https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js\"></script>\r\n <script src=\"https://oss.maxcdn.com/respond/1.4.2/respond.min.js\"></script>\r\n <![endif]-->\r\n</head>\r\n<body>\r\n\r\n <form action=\"\" method=\"post\" enctype=\"multipart/form-data\">\r\n <input name=\"avatar\" type=\"file\" accept=\"image/*\">\r\n <input type=\"submit\">\r\n </form>\r\n \r\n</body>\r\n</html>\r\n```\r\n\r\n## 配置DNS预获取\r\n```\r\n<link rel=\"dns-prefetch\" href=\"//static.web-host.com\">\r\n```\r\n\r\n## 禁用favicon.ico,版本>IE8\r\n```\r\n<link rel=\"icon\" href=\"data:;base64,=\">\r\n\r\n<link rel=\"icon\" href=\"data:image/ico;base64,aWNv\">\r\n```\r\n\r\n## 禁用百度转码\r\n```\r\n<meta http-equiv=\"Cache-Control\" content=\"no-transform\" />\r\n<meta http-equiv=\"Cache-Control\" content=\"no-siteapp\" />\r\n```', '2017-06-25 22:15:53', '2017-06-25 22:15:53');
INSERT INTO `article` VALUES ('10', '3', 'Apache .htaccess 使用示例', 'Apache .htaccess 使用示例', '&lt;h1&gt;开启&lt;/h1&gt;\n&lt;pre&gt;&lt;code&gt;RewriteEngine On&lt;/code&gt;&lt;/pre&gt;\n&lt;h1&gt;防盗链&lt;/h1&gt;\n&lt;pre&gt;&lt;code&gt;RewriteCond %{HTTP_REFERER} !^$\nRewriteCond %{HTTP_REFERER} !baidu.com [NC]\nRewriteCond %{HTTP_REFERER} !so.com [NC]\nRewriteCond %{HTTP_REFERER} !google.com [NC]\nRewriteCond %{HTTP_REFERER} !demo.com [NC]\nRewriteRule .(gif|jpg|png|js|css)$ http://comic.people.com.cn/NMediaFile/2014/0310/MAIN201403101334000435281471209.jpg [R,L]&lt;/code&gt;&lt;/pre&gt;\n&lt;p&gt;RewriteRule .(gif|jpg|png|js|css)$ - [F]\n这里&amp;quot;-&amp;quot;表示没有替换,F表示禁止对URL地址的存取,L表示停止处理接下来的规则\n&amp;quot;[NC]&amp;quot;指不区分大小写;&lt;/p&gt;\n&lt;h1&gt;永久301域名@跳转www&lt;/h1&gt;\n&lt;pre&gt;&lt;code&gt;RewriteCond %{HTTP_HOST} ^demo.com$ [NC]\nRewriteRule ^(.*)$ http://www.demo.com/$1 [R=301,L]&lt;/code&gt;&lt;/pre&gt;\n&lt;h1&gt;维护中307跳转&lt;/h1&gt;\n&lt;pre&gt;&lt;code&gt;RewriteCond %{REQUEST_URI} ^/blog(.*)?$\nRewriteRule ^(.*)$ /307_blog.php [R=307,L]&lt;/code&gt;&lt;/pre&gt;\n&lt;h1&gt;默认主页&lt;/h1&gt;\n&lt;pre&gt;&lt;code&gt;DirectoryIndex index.php&lt;/code&gt;&lt;/pre&gt;\n&lt;h1&gt;隐藏目录下所有文件&lt;/h1&gt;\n&lt;pre&gt;&lt;code&gt;Options -Indexes&lt;/code&gt;&lt;/pre&gt;\n&lt;h1&gt;显示目录下所有文件,但不包含文件类型的小图示&lt;/h1&gt;\n&lt;pre&gt;&lt;code&gt;IndexOptions -FancyIndexing&lt;/code&gt;&lt;/pre&gt;\n&lt;h1&gt;自定义出错页面&lt;/h1&gt;\n&lt;pre&gt;&lt;code&gt;ErrorDocument 404 /error.php\nErrorDocument 500 /error.php\nErrorDocument 400 /error.php\nErrorDocument 401 /error.php\nErrorDocument 403 /error.php\nErrorDocument 503 /error.php&lt;/code&gt;&lt;/pre&gt;\n&lt;h1&gt;伪静态&lt;/h1&gt;\n&lt;pre&gt;&lt;code&gt;RewriteRule ^product/([^/]+)/([^/]+)/([^/]+).html /product.php?cat=$1&amp;amp;brand=$2&amp;amp;prod=$3&lt;/code&gt;&lt;/pre&gt;\n&lt;p&gt;RewriteRule下:&lt;/p&gt;\n&lt;pre&gt;&lt;code&gt;[R] 强制重定向,[R=code] code默认为302\n[F] 禁用URL,返回HTTP 403 错误\n[L] 这是最后一条规则,之后内容无用&lt;/code&gt;&lt;/pre&gt;\n&lt;p&gt;RewriteCond下: &lt;/p&gt;\n&lt;pre&gt;&lt;code&gt;[NC] 不分字母大小写\n[OR] 用于连接下一条规则&lt;/code&gt;&lt;/pre&gt;\n&lt;pre&gt;&lt;code&gt;RewriteCond %{REQUEST_FILENAME} !-d\n# !-d 不是目录或不存在\nRewriteCond %{REQUEST_FILENAME} !-f\n# !-f 不是文件或不存在\nRewriteRule ^ index.php [L]\n# [L] 这是最后一个匹配项,不再往下匹配&lt;/code&gt;&lt;/pre&gt;\n&lt;h1&gt;强制重定向到www&lt;/h1&gt;\n&lt;pre&gt;&lt;code&gt;RewriteEngine On\nRewriteCond %{HTTP_HOST} ^cnphp.info [NC]\nRewriteRule ^(.*)$ http://www.cnphp.info/$1 [L,R=301]\n#强制重定向到不带www的顶级域名\nRewriteEngine On\nRewriteCond %{HTTP_HOST} !^cnphp.info$ [NC]\nRewriteRule ^(.*)$ http://cnphp.info/$1 [L,R=301]&lt;/code&gt;&lt;/pre&gt;\n&lt;h1&gt;综合&lt;/h1&gt;\n&lt;pre&gt;&lt;code&gt;# —— 位于行首时表示注释。\n[F] —— Forbidden(禁止): 命令服务器返回 403 Forbidden错误给用户浏览器\n[L] —— Last rule(最后一条规则): 告诉服务器在本条规则执行完后停止重写URL\n[N] —— Next(下一条规则): 告诉服务器继续重写,指导所有重写指令都执行过\n[G] —— Gone(丢失): 命令服务器返回410 GONE(no longer exists)错误消息\n[P] —— Proxy(代理): 告诉服务器通过mod_proxy模块处理用户请求\n[C] —— Chain(捆绑): 告诉服务器将当前的规则和前面的规则进行捆绑\n[R] —— Redirect(重定向): 命令服务器发出重定向消息,以便用户浏览器发出rewritten/modified(重写/修改)URL的请求\n[NC] —— No Case(不区分大小写): 对客户端请求的URL不区分大小写\n[PT] —— Pass Through(放行): 让mod_rewrite模块将重写的URL传回给Apache做进一步处理\n[OR] —— Or(逻辑或): 用逻辑“或”将两个表达式连接在一起,如果结果为“真”,则会应用后继的相关规则\n[NE] —— No Escape(禁用转义): 命令服务器在输出时禁用转义字符\n[NS] —— No Subrequest(禁用子请求): 如果存在内部子请求,则跳过当前命令\n[QSA] —— Append Query String(追加查询字符串): 命令服务器在URL末尾追加查询字符串\n[S=x] —— Skip(跳过): 如果满足某指定的条件,则跳过后面第x调规则\n[E=variable:value] —— Environmental Variable(环境变量): 命令服务器将值value赋给变量variable\n[T=MIME-type] —— Mime Type(MIME类型): 声明目标资源所属的MIME类型\n[] —— 匹配一个字符集合,例如[xyz]可以匹配x, y或者z\n[]+ —— 例如[xyz]+会以任何顺序、次数匹配x,y,z的出现\n[^] —— 字符^表示字符集的补集。[^xyz]将匹配没有x,y或者z的字符串\n[a-z] —— 连字符(-)表示匹配从字母a到字母z的所有字符串\na{n} —— 指定字母a出现的次数为n次,满足该条件时匹配。例如x{3}仅与xxx匹配\na{n,} —— 指定字母a出现的次数至少为n次,例如x{3,}可以与xxx或者xxxx等匹配\na{n,m} —— 指定a出现的次数至少为n到m次。\n() —— 用于将正则表达式分组,满足第一组正则表达式的字符串会被存储在变量$1中,以此类推。如果括号中的不是正则表达式,例如(perishable)?press 将能够匹配有或者没有perishable前缀的press\n^ —— 位于行首。注意:和中括号中的[^]意义不同。\n$ —— 位于行末\n? —— 例如 monzas? 会匹配 monza 或者 monzas,而 mon(za)? 会匹配 mon 或者 monza。又如 x? 会匹配“空字符” 或者 一个x\n! —— 逻辑非。例如“!string” 将会匹配除了“string”以外的所有字符串\n. —— 表示任意字符串\n- —— 命令Apache“不要”重写URL,例如“xxx.domain.com.* – [F]”\n+ —— 匹配至少一个任意字符,例如G+匹配以G开头、并且后面至少有一个字符的字符串\n* —— 匹配零个或多个字符,例如“.*”匹配任意字符串\n| —— 逻辑“或”,与[OR]不同的是,它只匹配字符串,例如(x|y)匹配x或者y\n —— 转义字符。可以转义左括号( 尖字符^ 美元符号$ 感叹号! 点. 星号* 管道符号| 右括号) 等\n. —— 转义为点字符(点字符在正则表达式中可以匹配任意字符)\n/* —— 零个或多个正斜杠\n.* —— 零个或多个任意字符(即,匹配任意字符串,包括空字符)\n^$ —— 匹配“空字符”、“空行”\n^.*$ —— 匹配任意字符串(仅限一行)\n[^/.] —— 匹配既非“正斜杠”也不是“点”的任意字符\n[^/.]+ —— 匹配第一个字符既非“正斜杠”也不是“点”,后继字符可以是“正斜杠”或者“点”的字符串\nhttp:// —— 匹配“http://”\n^domain.* —— 匹配以“domain”开始的字符串\n^domain.com$ —— 仅匹配“domain.com”\n-d —— 测试字符串是否是已存在的目录\n-f —— 测试字符串是否是已存在的文件\n-s —— 测试字符串所指文件是否有“非零”值&lt;/code&gt;&lt;/pre&gt;', '# 开启\r\n RewriteEngine On\r\n\r\n# 防盗链\r\n\r\n RewriteCond %{HTTP_REFERER} !^$\r\n RewriteCond %{HTTP_REFERER} !baidu.com [NC]\r\n RewriteCond %{HTTP_REFERER} !so.com [NC]\r\n RewriteCond %{HTTP_REFERER} !google.com [NC]\r\n RewriteCond %{HTTP_REFERER} !demo.com [NC]\r\n RewriteRule .(gif|jpg|png|js|css)$ http://comic.people.com.cn/NMediaFile/2014/0310/MAIN201403101334000435281471209.jpg [R,L]\r\n \r\nRewriteRule .(gif|jpg|png|js|css)$ - [F]\r\n这里\"-\"表示没有替换,F表示禁止对URL地址的存取,L表示停止处理接下来的规则\r\n\"[NC]\"指不区分大小写;\r\n\r\n# 永久301域名@跳转www\r\n RewriteCond %{HTTP_HOST} ^demo.com$ [NC]\r\n RewriteRule ^(.*)$ http://www.demo.com/$1 [R=301,L]\r\n\r\n# 维护中307跳转\r\n RewriteCond %{REQUEST_URI} ^/blog(.*)?$\r\n RewriteRule ^(.*)$ /307_blog.php [R=307,L]\r\n\r\n# 默认主页\r\n DirectoryIndex index.php\r\n\r\n# 隐藏目录下所有文件\r\n Options -Indexes\r\n \r\n# 显示目录下所有文件,但不包含文件类型的小图示\r\n IndexOptions -FancyIndexing\r\n\r\n# 自定义出错页面\r\n ErrorDocument 404 /error.php\r\n ErrorDocument 500 /error.php\r\n ErrorDocument 400 /error.php\r\n ErrorDocument 401 /error.php\r\n ErrorDocument 403 /error.php\r\n ErrorDocument 503 /error.php\r\n\r\n# 伪静态\r\n RewriteRule ^product/([^/]+)/([^/]+)/([^/]+).html /product.php?cat=$1&brand=$2&prod=$3\r\n\r\nRewriteRule下:\r\n```\r\n[R] 强制重定向,[R=code] code默认为302\r\n[F] 禁用URL,返回HTTP 403 错误\r\n[L] 这是最后一条规则,之后内容无用\r\n```\r\nRewriteCond下: \r\n```\r\n[NC] 不分字母大小写\r\n[OR] 用于连接下一条规则\r\n```\r\n\r\n\r\n````\r\nRewriteCond %{REQUEST_FILENAME} !-d\r\n# !-d 不是目录或不存在\r\nRewriteCond %{REQUEST_FILENAME} !-f\r\n# !-f 不是文件或不存在\r\nRewriteRule ^ index.php [L]\r\n# [L] 这是最后一个匹配项,不再往下匹配\r\n```\r\n\r\n\r\n#强制重定向到www\r\n```\r\nRewriteEngine On\r\nRewriteCond %{HTTP_HOST} ^cnphp.info [NC]\r\nRewriteRule ^(.*)$ http://www.cnphp.info/$1 [L,R=301]\r\n#强制重定向到不带www的顶级域名\r\nRewriteEngine On\r\nRewriteCond %{HTTP_HOST} !^cnphp.info$ [NC]\r\nRewriteRule ^(.*)$ http://cnphp.info/$1 [L,R=301]\r\n```\r\n\r\n# 综合\r\n```\r\n# —— 位于行首时表示注释。\r\n[F] —— Forbidden(禁止): 命令服务器返回 403 Forbidden错误给用户浏览器\r\n[L] —— Last rule(最后一条规则): 告诉服务器在本条规则执行完后停止重写URL\r\n[N] —— Next(下一条规则): 告诉服务器继续重写,指导所有重写指令都执行过\r\n[G] —— Gone(丢失): 命令服务器返回410 GONE(no longer exists)错误消息\r\n[P] —— Proxy(代理): 告诉服务器通过mod_proxy模块处理用户请求\r\n[C] —— Chain(捆绑): 告诉服务器将当前的规则和前面的规则进行捆绑\r\n[R] —— Redirect(重定向): 命令服务器发出重定向消息,以便用户浏览器发出rewritten/modified(重写/修改)URL的请求\r\n[NC] —— No Case(不区分大小写): 对客户端请求的URL不区分大小写\r\n[PT] —— Pass Through(放行): 让mod_rewrite模块将重写的URL传回给Apache做进一步处理\r\n[OR] —— Or(逻辑或): 用逻辑“或”将两个表达式连接在一起,如果结果为“真”,则会应用后继的相关规则\r\n[NE] —— No Escape(禁用转义): 命令服务器在输出时禁用转义字符\r\n[NS] —— No Subrequest(禁用子请求): 如果存在内部子请求,则跳过当前命令\r\n[QSA] —— Append Query String(追加查询字符串): 命令服务器在URL末尾追加查询字符串\r\n[S=x] —— Skip(跳过): 如果满足某指定的条件,则跳过后面第x调规则\r\n[E=variable:value] —— Environmental Variable(环境变量): 命令服务器将值value赋给变量variable\r\n[T=MIME-type] —— Mime Type(MIME类型): 声明目标资源所属的MIME类型\r\n[] —— 匹配一个字符集合,例如[xyz]可以匹配x, y或者z\r\n[]+ —— 例如[xyz]+会以任何顺序、次数匹配x,y,z的出现\r\n[^] —— 字符^表示字符集的补集。[^xyz]将匹配没有x,y或者z的字符串\r\n[a-z] —— 连字符(-)表示匹配从字母a到字母z的所有字符串\r\na{n} —— 指定字母a出现的次数为n次,满足该条件时匹配。例如x{3}仅与xxx匹配\r\na{n,} —— 指定字母a出现的次数至少为n次,例如x{3,}可以与xxx或者xxxx等匹配\r\na{n,m} —— 指定a出现的次数至少为n到m次。\r\n() —— 用于将正则表达式分组,满足第一组正则表达式的字符串会被存储在变量$1中,以此类推。如果括号中的不是正则表达式,例如(perishable)?press 将能够匹配有或者没有perishable前缀的press\r\n^ —— 位于行首。注意:和中括号中的[^]意义不同。\r\n$ —— 位于行末\r\n? —— 例如 monzas? 会匹配 monza 或者 monzas,而 mon(za)? 会匹配 mon 或者 monza。又如 x? 会匹配“空字符” 或者 一个x\r\n! —— 逻辑非。例如“!string” 将会匹配除了“string”以外的所有字符串\r\n. —— 表示任意字符串\r\n- —— 命令Apache“不要”重写URL,例如“xxx.domain.com.* – [F]”\r\n+ —— 匹配至少一个任意字符,例如G+匹配以G开头、并且后面至少有一个字符的字符串\r\n* —— 匹配零个或多个字符,例如“.*”匹配任意字符串\r\n| —— 逻辑“或”,与[OR]不同的是,它只匹配字符串,例如(x|y)匹配x或者y\r\n —— 转义字符。可以转义左括号( 尖字符^ 美元符号$ 感叹号! 点. 星号* 管道符号| 右括号) 等\r\n. —— 转义为点字符(点字符在正则表达式中可以匹配任意字符)\r\n/* —— 零个或多个正斜杠\r\n.* —— 零个或多个任意字符(即,匹配任意字符串,包括空字符)\r\n^$ —— 匹配“空字符”、“空行”\r\n^.*$ —— 匹配任意字符串(仅限一行)\r\n[^/.] —— 匹配既非“正斜杠”也不是“点”的任意字符\r\n[^/.]+ —— 匹配第一个字符既非“正斜杠”也不是“点”,后继字符可以是“正斜杠”或者“点”的字符串\r\nhttp:// —— 匹配“http://”\r\n^domain.* —— 匹配以“domain”开始的字符串\r\n^domain.com$ —— 仅匹配“domain.com”\r\n-d —— 测试字符串是否是已存在的目录\r\n-f —— 测试字符串是否是已存在的文件\r\n-s —— 测试字符串所指文件是否有“非零”值\r\n```', '2017-06-25 22:18:34', '2017-06-25 22:18:34');
INSERT INTO `article` VALUES ('11', '3', 'HTTP 头信息详解', 'HTTP 头信息中常见字段详解', '&lt;pre&gt;&lt;code&gt;表明服务器是否支持指定范围请求及哪种类型的分段请求\nAccept-Ranges:bytes\n响应体的长度\nContent-Length:209\n返回内容的MIME类型\nContent-Type:text/html\n\n使客户端到服务器端的连接持续有效\nConnection:Keep-Alive\nKeep-Alive:timeout=5, max=100\n\n根据文件的Inode,文件大小和最后修改时间 (mtime)生成的标记用于304响应,ps:不同机器上文件的Inode不同\nETag:&quot;e8-53ec0095b3a25-gzip&quot;\n\nGZIP压缩\nContent-Encoding:gzip\nVary:Accept-Encoding,User-Agent\n\n缓存时间\nCache-Control:max-age=86400\n过期时间\nExpires:Fri, 14 Oct 2016 14:55:18 GMT\n\n文件最后修改时间\nLast-Modified:Thu, 13 Oct 2016 14:36:35 GMT\n\n原始服务器消息发出的时间\nDate:Thu, 13 Oct 2016 14:55:18 GMT\n\nServer:Apache/2.4.17 (Win64) PHP/5.6.16&lt;/code&gt;&lt;/pre&gt;\n&lt;table&gt;\n&lt;thead&gt;\n&lt;tr&gt;\n&lt;th&gt;综合\nHeader&lt;/th&gt;\n&lt;th&gt;解释&lt;/th&gt;\n&lt;th&gt;示例&lt;/th&gt;\n&lt;/tr&gt;\n&lt;/thead&gt;\n&lt;tbody&gt;\n&lt;tr&gt;\n&lt;td&gt;Accept-Ranges&lt;/td&gt;\n&lt;td&gt;表明服务器是否支持指定范围请求及哪种类型的分段请求&lt;/td&gt;\n&lt;td&gt;Accept-Ranges: bytes&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Age&lt;/td&gt;\n&lt;td&gt;从原始服务器到代理缓存形成的估算时间(以秒计,非负)&lt;/td&gt;\n&lt;td&gt;Age: 12&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Allow&lt;/td&gt;\n&lt;td&gt;对某网络资源的有效的请求行为,不允许则返回405&lt;/td&gt;\n&lt;td&gt;Allow: GET, HEAD&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Cache-Control&lt;/td&gt;\n&lt;td&gt;告诉所有的缓存机制是否可以缓存及哪种类型&lt;/td&gt;\n&lt;td&gt;Cache-Control: no-cache&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Content-Encoding&lt;/td&gt;\n&lt;td&gt;web服务器支持的返回内容压缩编码类型。&lt;/td&gt;\n&lt;td&gt;Content-Encoding: gzip&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Content-Language&lt;/td&gt;\n&lt;td&gt;响应体的语言&lt;/td&gt;\n&lt;td&gt;Content-Language: en,zh&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Content-Length&lt;/td&gt;\n&lt;td&gt;响应体的长度&lt;/td&gt;\n&lt;td&gt;Content-Length: 348&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Content-Location&lt;/td&gt;\n&lt;td&gt;请求资源可替代的备用的另一地址&lt;/td&gt;\n&lt;td&gt;Content-Location: /index.htm&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Content-MD5 返回资源的MD5校验值&lt;/td&gt;\n&lt;td&gt;Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Content-Range&lt;/td&gt;\n&lt;td&gt;在整个返回体中本部分的字节位置&lt;/td&gt;\n&lt;td&gt;Content-Range: bytes 21010-47021/47022&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Content-Type&lt;/td&gt;\n&lt;td&gt;返回内容的MIME类型&lt;/td&gt;\n&lt;td&gt;Content-Type: text/html; charset=utf-8&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Date&lt;/td&gt;\n&lt;td&gt;原始服务器消息发出的时间&lt;/td&gt;\n&lt;td&gt;Date: Tue, 15 Nov 2010 08:12:31 GMT&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;ETag&lt;/td&gt;\n&lt;td&gt;请求变量的实体标签的当前值&lt;/td&gt;\n&lt;td&gt;ETag: “737060cd8c284d8af7ad3082f209582d”&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Expires&lt;/td&gt;\n&lt;td&gt;响应过期的日期和时间&lt;/td&gt;\n&lt;td&gt;Expires: Thu, 01 Dec 2010 16:00:00 GMT&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Last-Modified&lt;/td&gt;\n&lt;td&gt;请求资源的最后修改时间 Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Location&lt;/td&gt;\n&lt;td&gt;用来重定向接收方到非请求URL的位置来完成请求或标识新的资源&lt;/td&gt;\n&lt;td&gt;Location: &lt;a href=&quot;http://www.zcmhi.com/archives/94.html&quot;&gt;http://www.zcmhi.com/archives/94.html&lt;/a&gt;&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Pragma&lt;/td&gt;\n&lt;td&gt;包括实现特定的指令,它可应用到响应链上的任何接收方&lt;/td&gt;\n&lt;td&gt;Pragma: no-cache&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Proxy-Authenticate&lt;/td&gt;\n&lt;td&gt;它指出认证方案和可应用到代理的该URL上的参数&lt;/td&gt;\n&lt;td&gt;Proxy-Authenticate: Basic&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;refresh&lt;/td&gt;\n&lt;td&gt;应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持)&lt;/td&gt;\n&lt;td&gt;Refresh: 5; url=&lt;a href=&quot;http://www.zcmhi.com/archives/94.html&quot;&gt;http://www.zcmhi.com/archives/94.html&lt;/a&gt;&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Retry-After&lt;/td&gt;\n&lt;td&gt;如果实体暂时不可取,通知客户端在指定时间之后再次尝试&lt;/td&gt;\n&lt;td&gt;Retry-After: 120&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Server&lt;/td&gt;\n&lt;td&gt;web服务器软件名称&lt;/td&gt;\n&lt;td&gt;Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Set-Cookie&lt;/td&gt;\n&lt;td&gt;设置Http Cookie&lt;/td&gt;\n&lt;td&gt;Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Trailer&lt;/td&gt;\n&lt;td&gt;指出头域在分块传输编码的尾部存在&lt;/td&gt;\n&lt;td&gt;Trailer: Max-Forwards&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Transfer-Encoding&lt;/td&gt;\n&lt;td&gt;文件传输编码&lt;/td&gt;\n&lt;td&gt;Transfer-Encoding:chunked&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Vary&lt;/td&gt;\n&lt;td&gt;告诉下游代理是使用缓存响应还是从原始服务器请求&lt;/td&gt;\n&lt;td&gt;Vary: *&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Via&lt;/td&gt;\n&lt;td&gt;告知代理客户端响应是通过哪里发送的&lt;/td&gt;\n&lt;td&gt;Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;Warning&lt;/td&gt;\n&lt;td&gt;警告实体可能存在的问题&lt;/td&gt;\n&lt;td&gt;Warning: 199 Miscellaneous warning&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;WWW-Authenticate&lt;/td&gt;\n&lt;td&gt;表明客户端请求实体应该使用的授权方案&lt;/td&gt;\n&lt;td&gt;WWW-Authenticate: Basic&lt;/td&gt;\n&lt;/tr&gt;\n&lt;/tbody&gt;\n&lt;/table&gt;', '```\r\n表明服务器是否支持指定范围请求及哪种类型的分段请求\r\nAccept-Ranges:bytes\r\n响应体的长度\r\nContent-Length:209\r\n返回内容的MIME类型\r\nContent-Type:text/html\r\n\r\n使客户端到服务器端的连接持续有效\r\nConnection:Keep-Alive\r\nKeep-Alive:timeout=5, max=100\r\n\r\n根据文件的Inode,文件大小和最后修改时间 (mtime)生成的标记用于304响应,ps:不同机器上文件的Inode不同\r\nETag:\"e8-53ec0095b3a25-gzip\"\r\n\r\nGZIP压缩\r\nContent-Encoding:gzip\r\nVary:Accept-Encoding,User-Agent\r\n\r\n缓存时间\r\nCache-Control:max-age=86400\r\n过期时间\r\nExpires:Fri, 14 Oct 2016 14:55:18 GMT\r\n\r\n文件最后修改时间\r\nLast-Modified:Thu, 13 Oct 2016 14:36:35 GMT\r\n\r\n原始服务器消息发出的时间\r\nDate:Thu, 13 Oct 2016 14:55:18 GMT\r\n\r\nServer:Apache/2.4.17 (Win64) PHP/5.6.16\r\n```\r\n综合\r\nHeader | 解释 | 示例\r\n---|---|---\r\nAccept-Ranges | 表明服务器是否支持指定范围请求及哪种类型的分段请求 | Accept-Ranges: bytes\r\nAge | 从原始服务器到代理缓存形成的估算时间(以秒计,非负) | Age: 12\r\nAllow | 对某网络资源的有效的请求行为,不允许则返回405 | Allow: GET, HEAD\r\nCache-Control | 告诉所有的缓存机制是否可以缓存及哪种类型 | Cache-Control: no-cache\r\nContent-Encoding | web服务器支持的返回内容压缩编码类型。 | Content-Encoding: gzip\r\nContent-Language | 响应体的语言 | Content-Language: en,zh\r\nContent-Length | 响应体的长度 | Content-Length: 348\r\nContent-Location | 请求资源可替代的备用的另一地址 | Content-Location: /index.htm\r\nContent-MD5 返回资源的MD5校验值 | Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==\r\nContent-Range | 在整个返回体中本部分的字节位置 | Content-Range: bytes 21010-47021/47022\r\nContent-Type | 返回内容的MIME类型 | Content-Type: text/html; charset=utf-8\r\nDate | 原始服务器消息发出的时间 | Date: Tue, 15 Nov 2010 08:12:31 GMT\r\nETag | 请求变量的实体标签的当前值 | ETag: “737060cd8c284d8af7ad3082f209582d”\r\nExpires | 响应过期的日期和时间 | Expires: Thu, 01 Dec 2010 16:00:00 GMT\r\nLast-Modified | 请求资源的最后修改时间 Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT\r\nLocation | 用来重定向接收方到非请求URL的位置来完成请求或标识新的资源 | Location: http://www.zcmhi.com/archives/94.html\r\nPragma | 包括实现特定的指令,它可应用到响应链上的任何接收方 | Pragma: no-cache\r\nProxy-Authenticate | 它指出认证方案和可应用到代理的该URL上的参数 | Proxy-Authenticate: Basic\r\nrefresh | 应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持) | Refresh: 5; url=http://www.zcmhi.com/archives/94.html\r\nRetry-After | 如果实体暂时不可取,通知客户端在指定时间之后再次尝试 | Retry-After: 120\r\nServer | web服务器软件名称 | Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)\r\nSet-Cookie | 设置Http Cookie | Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1\r\nTrailer | 指出头域在分块传输编码的尾部存在 | Trailer: Max-Forwards\r\nTransfer-Encoding | 文件传输编码 | Transfer-Encoding:chunked\r\nVary | 告诉下游代理是使用缓存响应还是从原始服务器请求 | Vary: *\r\nVia | 告知代理客户端响应是通过哪里发送的 | Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)\r\nWarning | 警告实体可能存在的问题 | Warning: 199 Miscellaneous warning\r\nWWW-Authenticate | 表明客户端请求实体应该使用的授权方案 | WWW-Authenticate: Basic\r\n\r\n', '2017-06-25 22:20:16', '2017-06-25 22:20:16');
INSERT INTO `article` VALUES ('12', '4', 'Sublime 常用插件及配置参数详解', 'Sublime 常用插件及配置参数', '&lt;h2&gt;Settings user&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;{\n &quot;color_scheme&quot;: &quot;Packages/Nil-Theme/Sanakan.tmTheme&quot;,\n &quot;font_size&quot;: 14.0, //字号\n &quot;default_encoding&quot;: &quot;UTF-8&quot;, //默认编码\n &quot;show_encoding&quot;: true,//状态栏显示当前文件编码\n &quot;bold_folder_labels&quot;: true, // 左侧边栏文字加粗\n &quot;remember_open_files&quot;: true, // 记忆之前打开的文件\n &quot;tab_size&quot;: 4, // Tab键制表符宽度\n &quot;tab_completion&quot;: true,//设置为true时,按Tab会根据前后环境进行代码自动匹配填补\n &quot;expand_tabs_on_save&quot;: true,//保存时自动把tab转换成空格\n &quot;translate_tabs_to_spaces&quot;: true, // 设为true时,缩进和遇到Tab键时使用空格替代\n &quot;auto_indent&quot;: true, //自动缩进\n &quot;auto_complete&quot;: true, // 代码提示\n &quot;auto_complete_delay&quot;: 50, // 代码提示延迟显示\n &quot;auto_close_tags&quot;: true,//自动补全成对标签\n &quot;auto_match_enabled&quot;: true, // 自动匹配引号,括号等\n &quot;line_numbers&quot;: true, //显示行号\n &quot;gutter&quot;: true, //显示行号边栏\n &quot;word_wrap&quot;: true, //开启自动换行\n &quot;word_separators&quot;: &quot;\\&quot;\'\'“”./()‘&amp;lt;&amp;gt;:,.;~!@#$%^-&amp;amp;*|+=[]{}`~?&quot;,\n &quot;scroll_past_end&quot;: true, // 设置为false时,滚动到文本的最下方时,没有缓冲区\n &quot;highlight_line&quot;: true, //高亮当前行\n &quot;highlight_modified_tabs&quot;: true,//红色显示编辑文件的tab名称\n &quot;find_selected_text&quot;: true,//选中的文本按Ctrl + f时,自动复制到查找面板的文本框里\n &quot;trim_trailing_white_space_on_save&quot;: false, // 保存文件时是否删除每行结束后多余的空格\n &quot;update_check&quot;: false, //自动升级\n &quot;ignored_packages&quot;:\n [\n &quot;Vintage&quot;\n ],\n}&lt;/code&gt;&lt;/pre&gt;\n&lt;pre&gt;&lt;code&gt;&quot;theme&quot;: &quot;Soda Light 3.sublime-theme&quot;,\n&quot;font_face&quot;: &quot;Monaco&quot;,\n&quot;font_size&quot;: 15.0, //字号&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;Package Control&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;import urllib.request,os,hashlib; h = \'2915d1851351e5ee549c20394736b442\' + \'8bc59f460fa1548d1514676163dafc88\'; pf = \'Package Control.sublime-package\'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( \'http://packagecontrol.io/\' + pf.replace(\' \', \'%20\')).read(); dh = hashlib.sha256(by).hexdigest(); print(\'Error validating download (got %s instead of %s), please try manual install\' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), \'wb\' ).write(by)&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;编译系统PHP&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;{\n &quot;cmd&quot;: [&quot;E:/Service/PHP5/php.exe&quot;, &quot;$file&quot;],\n &quot;file_regex&quot;: &quot;php$&quot;,\n &quot;selector&quot;:&quot;source.php&quot;\n}&lt;/code&gt;&lt;/pre&gt;\n&lt;p&gt;命名为php.sublime-build,保存在&lt;code&gt;C:/Documents and Settings/[用户名]/Application Data/Sublime Text 2/Packages/User&lt;/code&gt;目录下.\n重启sublime text,就可以用Ctrl+B来编译.php文件了.&lt;/p&gt;\n&lt;h2&gt;编译系统&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;{&quot;cmd&quot;: [&quot;node&quot;, &quot;$file&quot;],&quot;selector&quot;: &quot;source.js&quot;}&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;sublimelinter&lt;/h2&gt;\n&lt;p&gt;先安装sublimelinter,再安装sublimelinter-php\n打开preferences-package settings-sublimeLinter-settings--user&lt;/p&gt;\n&lt;pre&gt;&lt;code&gt; {\n &quot;user&quot;: {\n &quot;linters&quot;: {\n },\n &quot;paths&quot;: {\n &quot;linux&quot;: [],\n &quot;osx&quot;: [],\n &quot;windows&quot;: [\n &quot;E:/Service/PHP5&quot;\n ]\n },\n }\n }&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;phpfmt&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;{\n &quot;enable_auto_align&quot;: true,\n &quot;indent_with_space&quot;: true,\n &quot;psr1_naming&quot;: true,\n &quot;psr2&quot;: true,\n &quot;version&quot;: 1\n}&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;注册码&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;—– BEGIN LICENSE —–\nMichael Barnes\nSingle User License\nEA7E-821385\n8A353C41 872A0D5C DF9B2950 AFF6F667\nC458EA6D 8EA3C286 98D1D650 131A97AB\nAA919AEC EF20E143 B361B1E7 4C8B7F04\nB085E65E 2F5F5360 8489D422 FB8FC1AA\n93F6323C FD7F7544 3F39C318 D95E6480\nFCCC7561 8A4A1741 68FA4223 ADCEDE07\n200C25BE DBBC4855 C4CFB774 C5EC138C\n0FEC1CEF D9DCECEC D3A5DAD1 01316C36\n—— END LICENSE ——&lt;/code&gt;&lt;/pre&gt;', '## Settings user\r\n```\r\n{\r\n \"color_scheme\": \"Packages/Nil-Theme/Sanakan.tmTheme\",\r\n \"font_size\": 14.0, //字号\r\n \"default_encoding\": \"UTF-8\", //默认编码\r\n \"show_encoding\": true,//状态栏显示当前文件编码\r\n \"bold_folder_labels\": true, // 左侧边栏文字加粗\r\n \"remember_open_files\": true, // 记忆之前打开的文件\r\n \"tab_size\": 4, // Tab键制表符宽度\r\n \"tab_completion\": true,//设置为true时,按Tab会根据前后环境进行代码自动匹配填补\r\n \"expand_tabs_on_save\": true,//保存时自动把tab转换成空格\r\n \"translate_tabs_to_spaces\": true, // 设为true时,缩进和遇到Tab键时使用空格替代\r\n \"auto_indent\": true, //自动缩进\r\n \"auto_complete\": true, // 代码提示\r\n \"auto_complete_delay\": 50, // 代码提示延迟显示\r\n \"auto_close_tags\": true,//自动补全成对标签\r\n \"auto_match_enabled\": true, // 自动匹配引号,括号等\r\n \"line_numbers\": true, //显示行号\r\n \"gutter\": true, //显示行号边栏\r\n \"word_wrap\": true, //开启自动换行\r\n \"word_separators\": \"\\\"\'\'“”./()‘<>:,.;~!@#$%^-&*|+=[]{}`~?\",\r\n \"scroll_past_end\": true, // 设置为false时,滚动到文本的最下方时,没有缓冲区\r\n \"highlight_line\": true, //高亮当前行\r\n \"highlight_modified_tabs\": true,//红色显示编辑文件的tab名称\r\n \"find_selected_text\": true,//选中的文本按Ctrl + f时,自动复制到查找面板的文本框里\r\n \"trim_trailing_white_space_on_save\": false, // 保存文件时是否删除每行结束后多余的空格\r\n \"update_check\": false, //自动升级\r\n \"ignored_packages\":\r\n [\r\n \"Vintage\"\r\n ],\r\n}\r\n```\r\n```\r\n\"theme\": \"Soda Light 3.sublime-theme\",\r\n\"font_face\": \"Monaco\",\r\n\"font_size\": 15.0, //字号\r\n```\r\n## Package Control\r\n```\r\nimport urllib.request,os,hashlib; h = \'2915d1851351e5ee549c20394736b442\' + \'8bc59f460fa1548d1514676163dafc88\'; pf = \'Package Control.sublime-package\'; ipp = sublime.installed_packages_path(); urllib.request.install_opener( urllib.request.build_opener( urllib.request.ProxyHandler()) ); by = urllib.request.urlopen( \'http://packagecontrol.io/\' + pf.replace(\' \', \'%20\')).read(); dh = hashlib.sha256(by).hexdigest(); print(\'Error validating download (got %s instead of %s), please try manual install\' % (dh, h)) if dh != h else open(os.path.join( ipp, pf), \'wb\' ).write(by)\r\n```\r\n\r\n## 编译系统PHP\r\n\r\n {\r\n \"cmd\": [\"E:/Service/PHP5/php.exe\", \"$file\"],\r\n \"file_regex\": \"php$\",\r\n \"selector\":\"source.php\"\r\n }\r\n\r\n命名为php.sublime-build,保存在`C:/Documents and Settings/[用户名]/Application Data/Sublime Text 2/Packages/User`目录下.\r\n重启sublime text,就可以用Ctrl+B来编译.php文件了.\r\n\r\n## 编译系统\r\n {\"cmd\": [\"node\", \"$file\"],\"selector\": \"source.js\"}\r\n\r\n## sublimelinter\r\n先安装sublimelinter,再安装sublimelinter-php\r\n打开preferences-package settings-sublimeLinter-settings--user\r\n```\r\n {\r\n \"user\": {\r\n \"linters\": {\r\n },\r\n \"paths\": {\r\n \"linux\": [],\r\n \"osx\": [],\r\n \"windows\": [\r\n \"E:/Service/PHP5\"\r\n ]\r\n },\r\n }\r\n }\r\n```\r\n## phpfmt\r\n```\r\n{\r\n \"enable_auto_align\": true,\r\n \"indent_with_space\": true,\r\n \"psr1_naming\": true,\r\n \"psr2\": true,\r\n \"version\": 1\r\n}\r\n```\r\n\r\n## 注册码\r\n```\r\n—– BEGIN LICENSE —–\r\nMichael Barnes\r\nSingle User License\r\nEA7E-821385\r\n8A353C41 872A0D5C DF9B2950 AFF6F667\r\nC458EA6D 8EA3C286 98D1D650 131A97AB\r\nAA919AEC EF20E143 B361B1E7 4C8B7F04\r\nB085E65E 2F5F5360 8489D422 FB8FC1AA\r\n93F6323C FD7F7544 3F39C318 D95E6480\r\nFCCC7561 8A4A1741 68FA4223 ADCEDE07\r\n200C25BE DBBC4855 C4CFB774 C5EC138C\r\n0FEC1CEF D9DCECEC D3A5DAD1 01316C36\r\n—— END LICENSE ——\r\n```', '2017-06-25 22:26:39', '2017-06-25 22:26:39');
INSERT INTO `article` VALUES ('13', '3', 'Ubuntu Curl 使用示例', 'Ubuntu Curl使用示例', '&lt;h2&gt;curl&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;curl -d &quot;age=16&quot; 127.0.0.1/param.php?name=jim -o param.log\n// -d &quot;age=16&quot; POST数据age=16\n// -o param.log 保存数据到param.log&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;curl cookie&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;curl -D cookie.txt 127.0.0.1/param.php?name=jim\n// -D cookie.txt 保存cookie到cookie.txt\n/*\nHTTP/1.1 200 OK\nDate: Wed, 26 Oct 2016 16:34:57 GMT\nServer: Apache/2.4.7 (Ubuntu)\nX-Powered-By: PHP/5.5.9-1ubuntu4.20\nSet-Cookie: token=2016-10-27+00%3A34%3A57; expires=Wed, 26-Oct-2016 17:34:57 GMT; Max-Age=3600; path=/\nContent-Length: 48\nContent-Type: text/html\n*/\n\ncurl -b cookie.txt 127.0.0.1/param.php?name=jim\n// -b cookie.txt 使用cookie.txt作为cookie&lt;/code&gt;&lt;/pre&gt;\n&lt;h1&gt;参考&lt;/h1&gt;\n&lt;blockquote&gt;\n&lt;p&gt;&lt;a href=&quot;http://www.cnblogs.com/gbyukg/p/3326825.html&quot;&gt;http://www.cnblogs.com/gbyukg/p/3326825.html&lt;/a&gt;&lt;/p&gt;\n&lt;/blockquote&gt;', '## curl\r\n```\r\ncurl -d \"age=16\" 127.0.0.1/param.php?name=jim -o param.log\r\n// -d \"age=16\" POST数据age=16\r\n// -o param.log 保存数据到param.log\r\n```\r\n## curl cookie\r\n```\r\ncurl -D cookie.txt 127.0.0.1/param.php?name=jim\r\n// -D cookie.txt 保存cookie到cookie.txt\r\n/*\r\nHTTP/1.1 200 OK\r\nDate: Wed, 26 Oct 2016 16:34:57 GMT\r\nServer: Apache/2.4.7 (Ubuntu)\r\nX-Powered-By: PHP/5.5.9-1ubuntu4.20\r\nSet-Cookie: token=2016-10-27+00%3A34%3A57; expires=Wed, 26-Oct-2016 17:34:57 GMT; Max-Age=3600; path=/\r\nContent-Length: 48\r\nContent-Type: text/html\r\n*/\r\n\r\ncurl -b cookie.txt 127.0.0.1/param.php?name=jim\r\n// -b cookie.txt 使用cookie.txt作为cookie\r\n```\r\n\r\n# 参考\r\n> http://www.cnblogs.com/gbyukg/p/3326825.html', '2017-06-25 22:31:56', '2017-06-25 22:31:56');
INSERT INTO `article` VALUES ('14', '3', 'Nginx Log 日志配置参数详解', 'Nginx Log 日志配置参数详解', '&lt;h2&gt;log 日志&lt;/h2&gt;\n&lt;h3&gt;示例&lt;/h3&gt;\n&lt;pre&gt;&lt;code&gt;127.0.0.1 - - [23/Mar/2017:17:05:26 +0800] \n&quot;GET / HTTP/1.1&quot; 200 53 &quot;-&quot; \n&quot;Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36&quot;&lt;/code&gt;&lt;/pre&gt;\n&lt;h3&gt;配置&lt;/h3&gt;\n&lt;pre&gt;&lt;code&gt;http {\n ...\n log_format main \'$remote_addr - $remote_user [$time_local] &quot;$request&quot; \'\n \'$status $body_bytes_sent &quot;$http_referer&quot; \'\n \'&quot;$http_user_agent&quot; &quot;$http_x_forwarded_for&quot;\';\n open_log_file_cache max=1000 inactive=10s valid=60s min_uses=1;\n server {\n ...\n access_log e:/project/test.net/access.log main;\n ...\n }\n ... \n}&lt;/code&gt;&lt;/pre&gt;\n&lt;h3&gt;参数说明&lt;/h3&gt;\n&lt;h4&gt;log_format&lt;/h4&gt;\n&lt;table&gt;\n&lt;thead&gt;\n&lt;tr&gt;\n&lt;th&gt;参数&lt;/th&gt;\n&lt;th&gt;示例&lt;/th&gt;\n&lt;th&gt;说明&lt;/th&gt;\n&lt;/tr&gt;\n&lt;/thead&gt;\n&lt;tbody&gt;\n&lt;tr&gt;\n&lt;td&gt;$remote_addr&lt;/td&gt;\n&lt;td&gt;127.0.0.1&lt;/td&gt;\n&lt;td&gt;客户端地址&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;$time_local&lt;/td&gt;\n&lt;td&gt;18/Jul/2012:17:00:01 +0800&lt;/td&gt;\n&lt;td&gt;访问时间和时区&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;$http_referer&lt;/td&gt;\n&lt;td&gt;&lt;a href=&quot;http://test.net/index2.php&quot;&gt;http://test.net/index2.php&lt;/a&gt;&lt;/td&gt;\n&lt;td&gt;URL跳转来源&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;$request&lt;/td&gt;\n&lt;td&gt;GET / HTTP/1.1&lt;/td&gt;\n&lt;td&gt;请求的URL和HTTP协议&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;$request_length&lt;/td&gt;\n&lt;td&gt;438&lt;/td&gt;\n&lt;td&gt;请求内容长度&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;$request_time&lt;/td&gt;\n&lt;td&gt;0.007&lt;/td&gt;\n&lt;td&gt;请求总时间&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;$status&lt;/td&gt;\n&lt;td&gt;200&lt;/td&gt;\n&lt;td&gt;HTTP请求状态&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;$bytes_sent&lt;/td&gt;\n&lt;td&gt;53&lt;/td&gt;\n&lt;td&gt;响应内容长度&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;$http_user_agent&lt;/td&gt;\n&lt;td&gt;Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36&lt;/td&gt;\n&lt;td&gt;客户端标识&lt;/td&gt;\n&lt;/tr&gt;\n&lt;/tbody&gt;\n&lt;/table&gt;\n&lt;h4&gt;open_log_file_cache&lt;/h4&gt;\n&lt;table&gt;\n&lt;thead&gt;\n&lt;tr&gt;\n&lt;th&gt;参数&lt;/th&gt;\n&lt;th&gt;说明&lt;/th&gt;\n&lt;/tr&gt;\n&lt;/thead&gt;\n&lt;tbody&gt;\n&lt;tr&gt;\n&lt;td&gt;max&lt;/td&gt;\n&lt;td&gt;设置缓存中的最大文件描述符数量,如果缓存被占满,采用LRU算法将描述符关闭。&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;inactive&lt;/td&gt;\n&lt;td&gt;设置存活时间,默认是10s&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;min_uses&lt;/td&gt;\n&lt;td&gt;设置在inactive时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是1次&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;valid&lt;/td&gt;\n&lt;td&gt;设置检查频率,默认60s&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;off&lt;/td&gt;\n&lt;td&gt;禁用缓存&lt;/td&gt;\n&lt;/tr&gt;\n&lt;/tbody&gt;\n&lt;/table&gt;', '## log 日志\r\n\r\n### 示例\r\n 127.0.0.1 - - [23/Mar/2017:17:05:26 +0800] \r\n \"GET / HTTP/1.1\" 200 53 \"-\" \r\n \"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36\"\r\n \r\n### 配置\r\n http {\r\n ...\r\n log_format main \'$remote_addr - $remote_user [$time_local] \"$request\" \'\r\n \'$status $body_bytes_sent \"$http_referer\" \'\r\n \'\"$http_user_agent\" \"$http_x_forwarded_for\"\';\r\n open_log_file_cache max=1000 inactive=10s valid=60s min_uses=1;\r\n server {\r\n ...\r\n access_log e:/project/test.net/access.log main;\r\n ...\r\n }\r\n ... \r\n }\r\n### 参数说明\r\n#### log_format\r\n参数|示例|说明\r\n---|---|---\r\n$remote_addr | 127.0.0.1| 客户端地址\r\n$time_local | 18/Jul/2012:17:00:01 +0800 | 访问时间和时区\r\n$http_referer | http://test.net/index2.php | URL跳转来源\r\n$request | GET / HTTP/1.1 | 请求的URL和HTTP协议\r\n$request_length | 438 | 请求内容长度\r\n$request_time | 0.007 | 请求总时间\r\n$status | 200 | HTTP请求状态\r\n$bytes_sent | 53 | 响应内容长度\r\n$http_user_agent | Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36 | 客户端标识\r\n\r\n#### open_log_file_cache\r\n参数|说明\r\n---|---\r\nmax | 设置缓存中的最大文件描述符数量,如果缓存被占满,采用LRU算法将描述符关闭。\r\ninactive | 设置存活时间,默认是10s\r\nmin_uses | 设置在inactive时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是1次\r\nvalid | 设置检查频率,默认60s\r\noff | 禁用缓存', '2017-06-25 23:25:23', '2017-06-25 23:25:23');
INSERT INTO `article` VALUES ('15', '2', 'Laravel Breadcrumbs 面包屑导航 代码示例', 'Laravel Breadcrumbs 面包屑导航 代码示例', '&lt;h2&gt;安装&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;composer require davejamesmiller/laravel-breadcrumbs&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;配置&lt;code&gt;config/app.php&lt;/code&gt;&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;\'providers\' =&amp;gt; [\n // ...\n DaveJamesMillerBreadcrumbsServiceProvider::class,\n],\n\'aliases\' =&amp;gt; [\n // ...\n \'Breadcrumbs\' =&amp;gt; DaveJamesMillerBreadcrumbsFacade::class,\n],&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;初始化&lt;code&gt;route/breadcrumbs.php&lt;/code&gt;&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;Breadcrumbs::register(\'home\', function($breadcrumbs)\n{\n $breadcrumbs-&amp;gt;push(\'首页\', route(\'home\'));\n});\n\nBreadcrumbs::register(\'article\', function($breadcrumbs)\n{\n $breadcrumbs-&amp;gt;parent(\'home\');\n $breadcrumbs-&amp;gt;push(\'文章\', route(\'article\'));\n});\n\nBreadcrumbs::register(\'article.detail\', function($breadcrumbs, $article)\n{\n $breadcrumbs-&amp;gt;parent(\'article\');\n $breadcrumbs-&amp;gt;push($article-&amp;gt;title, route(\'article.detail\', $article-&amp;gt;id));\n});&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;输出&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;{!! Breadcrumbs::render(\'article\') !!}\n// 获得数组\nBreadcrumbs::generateArray(\'article\')&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;官方文档:&lt;/h2&gt;\n&lt;blockquote&gt;\n&lt;p&gt;&lt;a href=&quot;https://laravel-breadcrumbs.readthedocs.io/en/latest/&quot;&gt;https://laravel-breadcrumbs.readthedocs.io/en/latest/&lt;/a&gt;&lt;/p&gt;\n&lt;/blockquote&gt;', '## 安装\r\n composer require davejamesmiller/laravel-breadcrumbs\r\n \r\n## 配置`config/app.php`\r\n \'providers\' => [\r\n // ...\r\n DaveJamesMillerBreadcrumbsServiceProvider::class,\r\n ],\r\n \'aliases\' => [\r\n // ...\r\n \'Breadcrumbs\' => DaveJamesMillerBreadcrumbsFacade::class,\r\n ],\r\n \r\n## 初始化`route/breadcrumbs.php`\r\n Breadcrumbs::register(\'home\', function($breadcrumbs)\r\n {\r\n $breadcrumbs->push(\'首页\', route(\'home\'));\r\n });\r\n \r\n Breadcrumbs::register(\'article\', function($breadcrumbs)\r\n {\r\n $breadcrumbs->parent(\'home\');\r\n $breadcrumbs->push(\'文章\', route(\'article\'));\r\n });\r\n \r\n Breadcrumbs::register(\'article.detail\', function($breadcrumbs, $article)\r\n {\r\n $breadcrumbs->parent(\'article\');\r\n $breadcrumbs->push($article->title, route(\'article.detail\', $article->id));\r\n });\r\n \r\n## 输出\r\n {!! Breadcrumbs::render(\'article\') !!}\r\n // 获得数组\r\n Breadcrumbs::generateArray(\'article\')\r\n \r\n## 官方文档:\r\n> https://laravel-breadcrumbs.readthedocs.io/en/latest/', '2017-06-25 23:36:02', '2017-06-25 23:36:02');
INSERT INTO `article` VALUES ('16', '1', 'Laravel Validator 使用笔记', 'Validator使用代码实例,包括扩展验证方法/定义验证详解/获取错误信息', '&lt;h2&gt;扩展&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;// 扩展验证方法\nValidator::extend(\'valid_code\',function ($attribute, $value, $parameters, $validator){\n return strlen($value) == 5;\n},\'编号不符合 :valid_year 年的要求\');\n\n// extendImplicit与extend的区别: 即使该字段规则中没有required也执行该验证\nValidator::extendImplicit(\'valid_code\',function ($attribute, $value, $parameters, $validator){\n return strlen($value) == 5;\n},\'编号不符合 :valid_year 年的要求\');\n\n// 替换该验证规则中的占位符\nValidator::replacer(\'valid_code\', function($message, $attribute, $rule, $parameters) {\n return str_replace(\':valid_year\',\'2017\',$message);\n});\n\n$validator = Validator::make($input,[\n \'code\'=&amp;gt;\'required|valid_code\',\n]);\n// code.valid_code 若错误返回信息&quot;编号不符合 2017 年的要求&quot;&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;定义验证详解&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;$validatorStatus = $validator-&amp;gt;passes(); //(bool)执行验证并返回是否验证成功\n$validatorErrors = $validator-&amp;gt;errors()-&amp;gt;all();//(array)返回获得的错误信息数组\nif(!$validatorStatus){\n return redirect(\'login\')\n -&amp;gt;withErrors($validatorErrors)\n -&amp;gt;withInput();\n}&lt;/code&gt;&lt;/pre&gt;\n&lt;h2&gt;验证与获取结果&lt;/h2&gt;\n&lt;pre&gt;&lt;code&gt;$validator = Validator::make($input,[\n \'code\'=&amp;gt;\'required|captcha\',\n],[\n \'code.captcha\'=&amp;gt;\'The :attribute is invalid .\'\n],[\n \'code\'=&amp;gt;\'code of captcha\'\n]);\n// The code of captcha is invalid .&lt;/code&gt;&lt;/pre&gt;\n&lt;p&gt;&lt;code&gt;Validator::make($rules,$messages,$customAttributes)&lt;/code&gt; &lt;/p&gt;\n&lt;ul&gt;\n&lt;li&gt;rules: 定义验证规则 &lt;/li&gt;\n&lt;li&gt;messages: 定义错误信息 &lt;/li&gt;\n&lt;li&gt;customAttributes: 定义字段别名用于替换错误信息中的&lt;code&gt;:attribute&lt;/code&gt;. &lt;/li&gt;\n&lt;/ul&gt;\n&lt;p&gt;若验证失败返回错误信息为&lt;code&gt;The code of captcha is invalid .&lt;/code&gt;&lt;br /&gt;\n不定义customAttributes错误信息为&lt;code&gt;The code is invalid .&lt;/code&gt; &lt;/p&gt;', '## 扩展\r\n```\r\n// 扩展验证方法\r\nValidator::extend(\'valid_code\',function ($attribute, $value, $parameters, $validator){\r\n return strlen($value) == 5;\r\n},\'编号不符合 :valid_year 年的要求\');\r\n\r\n// extendImplicit与extend的区别: 即使该字段规则中没有required也执行该验证\r\nValidator::extendImplicit(\'valid_code\',function ($attribute, $value, $parameters, $validator){\r\n return strlen($value) == 5;\r\n},\'编号不符合 :valid_year 年的要求\');\r\n\r\n// 替换该验证规则中的占位符\r\nValidator::replacer(\'valid_code\', function($message, $attribute, $rule, $parameters) {\r\n return str_replace(\':valid_year\',\'2017\',$message);\r\n});\r\n\r\n$validator = Validator::make($input,[\r\n \'code\'=>\'required|valid_code\',\r\n]);\r\n// code.valid_code 若错误返回信息\"编号不符合 2017 年的要求\"\r\n```\r\n\r\n## 定义验证详解\r\n```\r\n$validatorStatus = $validator->passes(); //(bool)执行验证并返回是否验证成功\r\n$validatorErrors = $validator->errors()->all();//(array)返回获得的错误信息数组\r\nif(!$validatorStatus){\r\n return redirect(\'login\')\r\n ->withErrors($validatorErrors)\r\n ->withInput();\r\n}\r\n```\r\n\r\n## 验证与获取结果\r\n```\r\n$validator = Validator::make($input,[\r\n \'code\'=>\'required|captcha\',\r\n],[\r\n \'code.captcha\'=>\'The :attribute is invalid .\'\r\n],[\r\n \'code\'=>\'code of captcha\'\r\n]);\r\n// The code of captcha is invalid .\r\n```\r\n`Validator::make($rules,$messages,$customAttributes)` \r\n* rules: 定义验证规则 \r\n* messages: 定义错误信息 \r\n* customAttributes: 定义字段别名用于替换错误信息中的`:attribute`. \r\n\r\n若验证失败返回错误信息为`The code of captcha is invalid .` \r\n不定义customAttributes错误信息为`The code is invalid .` \r\n', '2017-06-29 00:35:17', '2017-06-29 00:35:17');
INSERT INTO `article` VALUES ('17', '2', 'QQ登陆授权接口解析', 'QQ登陆授权接口全部接口的详细参数和说明', '&lt;h2&gt;请求授权&lt;/h2&gt;\n&lt;p&gt;请求:\n&lt;code&gt;https://graph.qq.com/oauth/show&lt;/code&gt;&lt;/p&gt;\n&lt;table&gt;\n&lt;thead&gt;\n&lt;tr&gt;\n&lt;th&gt;参数:\n参数&lt;/th&gt;\n&lt;th&gt;说明&lt;/th&gt;\n&lt;th&gt;示例&lt;/th&gt;\n&lt;/tr&gt;\n&lt;/thead&gt;\n&lt;tbody&gt;\n&lt;tr&gt;\n&lt;td&gt;which&lt;/td&gt;\n&lt;td&gt;默认&lt;/td&gt;\n&lt;td&gt;Login&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;response_type&lt;/td&gt;\n&lt;td&gt;默认&lt;/td&gt;\n&lt;td&gt;code&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;display&lt;/td&gt;\n&lt;td&gt;pc或mobile&lt;/td&gt;\n&lt;td&gt;pc&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;client_id&lt;/td&gt;\n&lt;td&gt;APP ID&lt;/td&gt;\n&lt;td&gt;10*****39&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;state&lt;/td&gt;\n&lt;td&gt;&lt;code&gt;md5(uniqid(rand(), TRUE))&lt;/code&gt; 防止csrf&lt;/td&gt;\n&lt;td&gt;8f7895bf4ad032d6e2e52426987bda97&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;scope&lt;/td&gt;\n&lt;td&gt;&lt;code&gt;urlencode&lt;/code&gt; 授权范围&lt;/td&gt;\n&lt;td&gt;get_user_info,get_simple_userinfo&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;redirect_uri&lt;/td&gt;\n&lt;td&gt;&lt;code&gt;urlencode&lt;/code&gt; 跳转地址&lt;/td&gt;\n&lt;td&gt;网站回调域,需提前配置&lt;/td&gt;\n&lt;/tr&gt;\n&lt;/tbody&gt;\n&lt;/table&gt;\n&lt;p&gt;示例:\n&lt;code&gt;https://graph.qq.com/oauth/show?which=Login&amp;amp;display=pc&amp;amp;response_type=code&amp;amp;client_id=10*****39&amp;amp;redirect_uri=http%3A%2F%2Fdemo.xcxxkj.site%2Fqq%2Fexample%2Foauth%2Fcallback.php&amp;amp;state=8f7895bf4ad032d6e2e52426987bda97&amp;amp;scope=get_user_info%2Cget_simple_userinfo&lt;/code&gt;&lt;/p&gt;\n&lt;p&gt;回跳:\n&lt;code&gt;http://www.kukj.cn/demo/qq/example/oauth/callback.php?code=3E3216BECE904A02ADA9CC93B9C7CDBB&amp;amp;state=9f72c202b5b9ca8eaa4f10afa61113f2&lt;/code&gt; &lt;/p&gt;\n&lt;hr /&gt;\n&lt;h2&gt;Access_Token&lt;/h2&gt;\n&lt;p&gt;请求:\nPC网站:&lt;code&gt;https://graph.qq.com/oauth2.0/token&lt;/code&gt;\nWAP网站:&lt;code&gt;https://graph.z.qq.com/moc2/token&lt;/code&gt; &lt;/p&gt;\n&lt;table&gt;\n&lt;thead&gt;\n&lt;tr&gt;\n&lt;th&gt;参数:\n参数&lt;/th&gt;\n&lt;th&gt;说明&lt;/th&gt;\n&lt;th&gt;示例&lt;/th&gt;\n&lt;/tr&gt;\n&lt;/thead&gt;\n&lt;tbody&gt;\n&lt;tr&gt;\n&lt;td&gt;grant_type&lt;/td&gt;\n&lt;td&gt;默认&lt;/td&gt;\n&lt;td&gt;authorization_code&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;client_id&lt;/td&gt;\n&lt;td&gt;APP ID&lt;/td&gt;\n&lt;td&gt;10*****39&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;client_secret&lt;/td&gt;\n&lt;td&gt;APP Key&lt;/td&gt;\n&lt;td&gt;7f2e1a89&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;****&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;faeb4a74&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;code&lt;/td&gt;\n&lt;td&gt;授权返回&lt;/td&gt;\n&lt;td&gt;3E3216BECE904A02ADA9CC93B9C7CDBB&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;state&lt;/td&gt;\n&lt;td&gt;请求授权时带的&lt;/td&gt;\n&lt;td&gt;9f72c202b5b9ca8eaa4f10afa61113f2&lt;/td&gt;\n&lt;/tr&gt;\n&lt;/tbody&gt;\n&lt;/table&gt;\n&lt;p&gt;示例:\n&lt;code&gt;https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&amp;amp;client_id=10*****39&amp;amp;client_secret=7f2e1a89****************faeb4a74&amp;amp;code=3E3216BECE904A02ADA9CC93B9C7CDBB&amp;amp;state=9f72c202b5b9ca8eaa4f10afa61113f2&lt;/code&gt;&lt;/p&gt;\n&lt;p&gt;返回: &lt;/p&gt;\n&lt;pre&gt;&lt;code&gt;access_token=87BE06D456*************C0EC87084&amp;amp;expires_in=7776000&amp;amp;refresh_token=BC2DE1161086B21864FF704B8358AC47&lt;/code&gt;&lt;/pre&gt;\n&lt;p&gt;错误: &lt;/p&gt;\n&lt;pre&gt;&lt;code&gt;callback( {&quot;error&quot;:100010,&quot;error_description&quot;:&quot;redirect uri is illegal&quot;} );&lt;/code&gt;&lt;/pre&gt;\n&lt;hr /&gt;\n&lt;h2&gt;Openid&lt;/h2&gt;\n&lt;p&gt;示例:\n&lt;code&gt;https://graph.qq.com/oauth2.0/me?access_token=87BE06D456*************C0EC87084&lt;/code&gt; &lt;/p&gt;\n&lt;p&gt;正确&lt;/p&gt;\n&lt;pre&gt;&lt;code&gt;callback( {&quot;client_id&quot;:&quot;10*****39&quot;,&quot;openid&quot;:&quot;562CE8D66427**************5FBA6D&quot;} );&lt;/code&gt;&lt;/pre&gt;\n&lt;p&gt;错误&lt;/p&gt;\n&lt;pre&gt;&lt;code&gt;callback( {&quot;error&quot;:100016,&quot;error_description&quot;:&quot;access token check failed&quot;} );&lt;/code&gt;&lt;/pre&gt;\n&lt;hr /&gt;\n&lt;h2&gt;获取用户资料&lt;/h2&gt;\n&lt;p&gt;地址:\n&lt;code&gt;https://graph.qq.com/user/get_user_info&lt;/code&gt;&lt;/p&gt;\n&lt;table&gt;\n&lt;thead&gt;\n&lt;tr&gt;\n&lt;th&gt;参数:\n参数&lt;/th&gt;\n&lt;th&gt;说明&lt;/th&gt;\n&lt;th&gt;示例&lt;/th&gt;\n&lt;/tr&gt;\n&lt;/thead&gt;\n&lt;tbody&gt;\n&lt;tr&gt;\n&lt;td&gt;access_token&lt;/td&gt;\n&lt;td&gt;授权请求获得,3个月有效期&lt;/td&gt;\n&lt;td&gt;87BE06D456*&lt;strong&gt;&lt;strong&gt;****&lt;/strong&gt;&lt;/strong&gt;C0EC87084&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;openid&lt;/td&gt;\n&lt;td&gt;唯一标识得&lt;/td&gt;\n&lt;td&gt;562CE8D66427&lt;strong&gt;&lt;strong&gt;&lt;strong&gt;**&lt;/strong&gt;&lt;/strong&gt;&lt;/strong&gt;5FBA6D&lt;/td&gt;\n&lt;/tr&gt;\n&lt;tr&gt;\n&lt;td&gt;oauth_consumer_key&lt;/td&gt;\n&lt;td&gt;APP ID&lt;/td&gt;\n&lt;td&gt;10*****39&lt;/td&gt;\n&lt;/tr&gt;\n&lt;/tbody&gt;\n&lt;/table&gt;\n&lt;p&gt;示例:\n&lt;code&gt;https://graph.qq.com/user/get_user_info?oauth_consumer_key=10*****39&amp;amp;access_token=87BE06D456*************C0EC87084&amp;amp;openid=562CE8D66427**************5FBA6D&lt;/code&gt;&lt;/p&gt;\n&lt;p&gt;返回: &lt;/p&gt;\n&lt;pre&gt;&lt;code&gt;{\n &quot;ret&quot;: 0,\n &quot;msg&quot;: &quot;&quot;,\n &quot;is_lost&quot;:0,\n &quot;nickname&quot;: &quot;悠悠山雨&quot;,\n &quot;gender&quot;: &quot;男&quot;,\n &quot;province&quot;: &quot;上海&quot;,\n &quot;city&quot;: &quot;徐汇区&quot;,\n &quot;year&quot;: &quot;1980&quot;,\n &quot;figureurl&quot;: &quot;http://qzapp.qlogo.cn/qzapp/10*****39/562CE8D66427**************5FBA6D/30&quot;,\n &quot;figureurl_1&quot;: &quot;http://qzapp.qlogo.cn/qzapp/10*****39/562CE8D66427**************5FBA6D/50&quot;,\n &quot;figureurl_2&quot;: &quot;http://qzapp.qlogo.cn/qzapp/10*****39/562CE8D66427**************5FBA6D/100&quot;,\n &quot;figureurl_qq_1&quot;: &quot;http://q.qlogo.cn/qqapp/10*****39/562CE8D66427**************5FBA6D/40&quot;,\n &quot;figureurl_qq_2&quot;: &quot;http://q.qlogo.cn/qqapp/10*****39/562CE8D66427**************5FBA6D/100&quot;,\n &quot;is_yellow_vip&quot;: &quot;0&quot;,\n &quot;vip&quot;: &quot;0&quot;,\n &quot;yellow_vip_level&quot;: &quot;0&quot;,\n &quot;level&quot;: &quot;0&quot;,\n &quot;is_yellow_year_vip&quot;: &quot;0&quot;\n}&lt;/code&gt;&lt;/pre&gt;\n&lt;p&gt;错误: &lt;/p&gt;\n&lt;pre&gt;&lt;code&gt;{&quot;ret&quot;:100008,&quot;msg&quot;:&quot;client request\'s app is not existed&quot;}&lt;/code&gt;&lt;/pre&gt;\n&lt;hr /&gt;\n&lt;h2&gt;文档&lt;/h2&gt;\n&lt;p&gt;错误码解释: &lt;/p&gt;\n&lt;blockquote&gt;\n&lt;p&gt;&lt;a href=&quot;http://wiki.connect.qq.com/%E5%85%AC%E5%85%B1%E8%BF%94%E5%9B%9E%E7%A0%81%E8%AF%B4%E6%98%8E#100000-100031.EF.BC.9APC.E7.BD.91.E7.AB.99.E6.8E.A5.E5.85.A5.E6.97.B6.E7.9A.84.E5.85.AC.E5.85.B1.E8.BF.94.E5.9B.9E.E7.A0.81&quot;&gt;http://wiki.connect.qq.com/%E5%85%AC%E5%85%B1%E8%BF%94%E5%9B%9E%E7%A0%81%E8%AF%B4%E6%98%8E#100000-100031.EF.BC.9APC.E7.BD.91.E7.AB.99.E6.8E.A5.E5.85.A5.E6.97.B6.E7.9A.84.E5.85.AC.E5.85.B1.E8.BF.94.E5.9B.9E.E7.A0.81&lt;/a&gt;&lt;/p&gt;\n&lt;/blockquote&gt;\n&lt;p&gt;图标素材&lt;/p&gt;\n&lt;blockquote&gt;\n&lt;p&gt;&lt;a href=&quot;http://wiki.connect.qq.com/%E8%A7%86%E8%A7%89%E7%B4%A0%E6%9D%90%E4%B8%8B%E8%BD%BD&quot;&gt;http://wiki.connect.qq.com/%E8%A7%86%E8%A7%89%E7%B4%A0%E6%9D%90%E4%B8%8B%E8%BD%BD&lt;/a&gt;&lt;/p&gt;\n&lt;/blockquote&gt;\n&lt;p&gt;QQ互联&lt;/p&gt;\n&lt;blockquote&gt;\n&lt;p&gt;&lt;a href=&quot;https://connect.qq.com&quot;&gt;https://connect.qq.com&lt;/a&gt;&lt;/p&gt;\n&lt;/blockquote&gt;\n&lt;p&gt;SDK&lt;/p&gt;\n&lt;blockquote&gt;\n&lt;p&gt;&lt;a href=&quot;http://wiki.connect.qq.com/sdk%E4%B8%8B%E8%BD%BD&quot;&gt;http://wiki.connect.qq.com/sdk%E4%B8%8B%E8%BD%BD&lt;/a&gt;&lt;/p&gt;\n&lt;/blockquote&gt;\n&lt;p&gt;API调试&lt;/p&gt;\n&lt;blockquote&gt;\n&lt;p&gt;&lt;a href=&quot;http://connect.qq.com/sdk/webtools/index.html#get_user_info&quot;&gt;http://connect.qq.com/sdk/webtools/index.html#get_user_info&lt;/a&gt;&lt;/p&gt;\n&lt;/blockquote&gt;\n&lt;p&gt;流程&lt;/p&gt;\n&lt;blockquote&gt;\n&lt;p&gt;&lt;a href=&quot;http://wiki.connect.qq.com/%E5%BC%80%E5%8F%91%E6%94%BB%E7%95%A5_server-side#Step2.EF.BC.9A.E8.8E.B7.E5.8F.96AuthorizationCode&quot;&gt;http://wiki.connect.qq.com/%E5%BC%80%E5%8F%91%E6%94%BB%E7%95%A5_server-side#Step2.EF.BC.9A.E8.8E.B7.E5.8F.96AuthorizationCode&lt;/a&gt;&lt;/p&gt;\n&lt;/blockquote&gt;', '## 请求授权\r\n请求: \r\n`https://graph.qq.com/oauth/show`\r\n\r\n参数:\r\n参数 | 说明| 示例\r\n---|---|---\r\nwhich |默认| Login\r\nresponse_type |默认 | code\r\ndisplay |pc或mobile |pc\r\nclient_id|APP ID |10*****39\r\nstate|`md5(uniqid(rand(), TRUE))` 防止csrf |8f7895bf4ad032d6e2e52426987bda97\r\nscope|`urlencode` 授权范围 |get_user_info,get_simple_userinfo\r\nredirect_uri|`urlencode` 跳转地址 |网站回调域,需提前配置\r\n\r\n示例: \r\n`https://graph.qq.com/oauth/show?which=Login&display=pc&response_type=code&client_id=10*****39&redirect_uri=http%3A%2F%2Fdemo.xcxxkj.site%2Fqq%2Fexample%2Foauth%2Fcallback.php&state=8f7895bf4ad032d6e2e52426987bda97&scope=get_user_info%2Cget_simple_userinfo`\r\n\r\n回跳: \r\n`http://www.kukj.cn/demo/qq/example/oauth/callback.php?code=3E3216BECE904A02ADA9CC93B9C7CDBB&state=9f72c202b5b9ca8eaa4f10afa61113f2` \r\n\r\n---\r\n\r\n## Access_Token\r\n请求: \r\nPC网站:`https://graph.qq.com/oauth2.0/token` \r\nWAP网站:`https://graph.z.qq.com/moc2/token` \r\n\r\n参数:\r\n参数 | 说明| 示例\r\n---|---|---\r\ngrant_type |默认| authorization_code\r\nclient_id | APP ID |10*****39\r\nclient_secret | APP Key |7f2e1a89****************faeb4a74\r\ncode | 授权返回 | 3E3216BECE904A02ADA9CC93B9C7CDBB\r\nstate | 请求授权时带的 | 9f72c202b5b9ca8eaa4f10afa61113f2\r\n\r\n示例: \r\n`https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&client_id=10*****39&client_secret=7f2e1a89****************faeb4a74&code=3E3216BECE904A02ADA9CC93B9C7CDBB&state=9f72c202b5b9ca8eaa4f10afa61113f2`\r\n\r\n返回: \r\n\r\n```\r\naccess_token=87BE06D456*************C0EC87084&expires_in=7776000&refresh_token=BC2DE1161086B21864FF704B8358AC47\r\n```\r\n错误: \r\n```\r\ncallback( {\"error\":100010,\"error_description\":\"redirect uri is illegal\"} );\r\n```\r\n\r\n---\r\n\r\n## Openid\r\n示例: \r\n`https://graph.qq.com/oauth2.0/me?access_token=87BE06D456*************C0EC87084` \r\n\r\n正确\r\n```\r\ncallback( {\"client_id\":\"10*****39\",\"openid\":\"562CE8D66427**************5FBA6D\"} );\r\n```\r\n错误\r\n```\r\ncallback( {\"error\":100016,\"error_description\":\"access token check failed\"} );\r\n```\r\n\r\n---\r\n## 获取用户资料\r\n地址: \r\n`https://graph.qq.com/user/get_user_info`\r\n\r\n参数: \r\n参数 | 说明| 示例\r\n---|---|---\r\naccess_token |授权请求获得,3个月有效期| 87BE06D456*************C0EC87084\r\nopenid |唯一标识得 | 562CE8D66427**************5FBA6D\r\noauth_consumer_key | APP ID |10*****39\r\n\r\n示例: \r\n`https://graph.qq.com/user/get_user_info?oauth_consumer_key=10*****39&access_token=87BE06D456*************C0EC87084&openid=562CE8D66427**************5FBA6D`\r\n\r\n返回: \r\n```\r\n{\r\n \"ret\": 0,\r\n \"msg\": \"\",\r\n \"is_lost\":0,\r\n \"nickname\": \"悠悠山雨\",\r\n \"gender\": \"\",\r\n \"province\": \"上海\",\r\n \"city\": \"徐汇区\",\r\n \"year\": \"1980\",\r\n \"figureurl\": \"http://qzapp.qlogo.cn/qzapp/10*****39/562CE8D66427**************5FBA6D/30\",\r\n \"figureurl_1\": \"http://qzapp.qlogo.cn/qzapp/10*****39/562CE8D66427**************5FBA6D/50\",\r\n \"figureurl_2\": \"http://qzapp.qlogo.cn/qzapp/10*****39/562CE8D66427**************5FBA6D/100\",\r\n \"figureurl_qq_1\": \"http://q.qlogo.cn/qqapp/10*****39/562CE8D66427**************5FBA6D/40\",\r\n \"figureurl_qq_2\": \"http://q.qlogo.cn/qqapp/10*****39/562CE8D66427**************5FBA6D/100\",\r\n \"is_yellow_vip\": \"0\",\r\n \"vip\": \"0\",\r\n \"yellow_vip_level\": \"0\",\r\n \"level\": \"0\",\r\n \"is_yellow_year_vip\": \"0\"\r\n}\r\n```\r\n错误: \r\n```\r\n{\"ret\":100008,\"msg\":\"client request\'s app is not existed\"}\r\n```\r\n\r\n---\r\n\r\n## 文档\r\n\r\n错误码解释: \r\n> http://wiki.connect.qq.com/%E5%85%AC%E5%85%B1%E8%BF%94%E5%9B%9E%E7%A0%81%E8%AF%B4%E6%98%8E#100000-100031.EF.BC.9APC.E7.BD.91.E7.AB.99.E6.8E.A5.E5.85.A5.E6.97.B6.E7.9A.84.E5.85.AC.E5.85.B1.E8.BF.94.E5.9B.9E.E7.A0.81\r\n\r\n图标素材\r\n> http://wiki.connect.qq.com/%E8%A7%86%E8%A7%89%E7%B4%A0%E6%9D%90%E4%B8%8B%E8%BD%BD\r\n\r\nQQ互联\r\n> https://connect.qq.com\r\n\r\nSDK\r\n> http://wiki.connect.qq.com/sdk%E4%B8%8B%E8%BD%BD\r\n\r\nAPI调试\r\n> http://connect.qq.com/sdk/webtools/index.html#get_user_info\r\n\r\n流程\r\n> http://wiki.connect.qq.com/%E5%BC%80%E5%8F%91%E6%94%BB%E7%95%A5_server-side#Step2.EF.BC.9A.E8.8E.B7.E5.8F.96AuthorizationCode\r\n\r\n\r\n', '2017-09-30 09:57:39', '2017-09-30 09:57:39');
INSERT INTO `article` VALUES ('18', '2', '抓取远程图片流程三种方式(file,curl,stream)', '抓取远程图片流程,判断URL地址是否正确,判断文件后缀是否符合,判断目录是否可写,判断文件是否已存在', '&lt;h3&gt;抓取远程图片流程&lt;/h3&gt;\n&lt;ul&gt;\n&lt;li&gt;判断URL地址是否正确&lt;/li&gt;\n&lt;li&gt;判断文件后缀是否符合&lt;/li&gt;\n&lt;li&gt;判断目录是否可写&lt;/li&gt;\n&lt;li&gt;判断文件是否已存在&lt;/li&gt;\n&lt;/ul&gt;\n&lt;h3&gt;远程图片&lt;/h3&gt;\n&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$url = \'https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2206535334,3323223263&amp;amp;fm=27&amp;amp;gp=0.jpg\';\n$store = __DIR__.\'/uploads/\'.basename($url);\n\n// 判断链接是否有效\n$headers = get_headers($url,1);\nif (!(stristr($headers[0], &quot;200&quot;) &amp;amp;&amp;amp; stristr($headers[0], &quot;OK&quot;))){\n exit(&quot;链接失效: {$url}&quot;);\n}&lt;/code&gt;&lt;/pre&gt;\n&lt;h4&gt;file_get_content方式&lt;/h4&gt;\n&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;file_put_contents($store, file_get_contents($url));&lt;/code&gt;&lt;/pre&gt;\n&lt;h4&gt;curl方式&lt;/h4&gt;\n&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;$fp = fopen($store, \'wb\');\n$ch = curl_init();\ncurl_setopt($ch,CURLOPT_URL,$url);\ncurl_setopt($ch,CURLOPT_FILE,$fp);\ncurl_setopt($ch,CURLOPT_HEADER,false);\ncurl_exec($ch);\ncurl_close($ch);\nfclose($fp);&lt;/code&gt;&lt;/pre&gt;\n&lt;h4&gt;stream方式&lt;/h4&gt;\n&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;ob_start();\n$context = stream_context_create(\n array(\'http\' =&amp;gt; array(\n \'follow_location\' =&amp;gt; false\n ))\n);\nreadfile($url, false, $context);\n$img = ob_get_contents();\nob_end_clean();\nfile_put_contents($store, $img);&lt;/code&gt;&lt;/pre&gt;\n&lt;h3&gt;工具函数&lt;/h3&gt;\n&lt;pre&gt;&lt;code class=&quot;language-php&quot;&gt;function getfileTypeByMimeType($type)\n{\n $mimeType = [\n \'.xml\' =&amp;gt; \'application/xml,text/xml,application/x-xml\',\n \'.json\' =&amp;gt; \'application/json,text/x-json,application/jsonrequest,text/json\',\n \'.js\' =&amp;gt; \'text/javascript,application/javascript,application/x-javascript\',\n \'.css\' =&amp;gt; \'text/css\',\n \'.rss\' =&amp;gt; \'application/rss+xml\',\n \'.yaml\' =&amp;gt; \'application/x-yaml,text/yaml\',\n \'.atom\' =&amp;gt; \'application/atom+xml\',\n \'.pdf\' =&amp;gt; \'application/pdf\',\n \'.txt\' =&amp;gt; \'text/plain\',\n \'.png\' =&amp;gt; \'image/png\',\n \'.jpg\' =&amp;gt; \'image/jpg,image/jpeg,image/pjpeg\',\n \'.gif\' =&amp;gt; \'image/gif\',\n \'.csv\' =&amp;gt; \'text/csv\',\n \'.html\' =&amp;gt; \'text/html,application/xhtml+xml,*/*\',\n \'.webp\' =&amp;gt; \'image/webp\',\n ];\n foreach ($mimeType as $key =&amp;gt; $val) {\n $_types = explode(\',\', $val);\n if(in_array($type, $_types)) return $key;\n }\n return false;\n}&lt;/code&gt;&lt;/pre&gt;', '### 抓取远程图片流程\r\n* 判断URL地址是否正确\r\n* 判断文件后缀是否符合\r\n* 判断目录是否可写\r\n* 判断文件是否已存在\r\n\r\n\r\n### 远程图片\r\n```php\r\n$url = \'https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2206535334,3323223263&fm=27&gp=0.jpg\';\r\n$store = __DIR__.\'/uploads/\'.basename($url);\r\n\r\n// 判断链接是否有效\r\n$headers = get_headers($url,1);\r\nif (!(stristr($headers[0], \"200\") && stristr($headers[0], \"OK\"))){\r\n exit(\"链接失效: {$url}\");\r\n}\r\n```\r\n\r\n#### file_get_content方式\r\n```php\r\nfile_put_contents($store, file_get_contents($url));\r\n```\r\n\r\n#### curl方式\r\n```php\r\n$fp = fopen($store, \'wb\');\r\n$ch = curl_init();\r\ncurl_setopt($ch,CURLOPT_URL,$url);\r\ncurl_setopt($ch,CURLOPT_FILE,$fp);\r\ncurl_setopt($ch,CURLOPT_HEADER,false);\r\ncurl_exec($ch);\r\ncurl_close($ch);\r\nfclose($fp);\r\n```\r\n\r\n#### stream方式\r\n```php\r\nob_start();\r\n$context = stream_context_create(\r\n array(\'http\' => array(\r\n \'follow_location\' => false\r\n ))\r\n);\r\nreadfile($url, false, $context);\r\n$img = ob_get_contents();\r\nob_end_clean();\r\nfile_put_contents($store, $img);\r\n```\r\n\r\n### 工具函数\r\n```php\r\nfunction getfileTypeByMimeType($type)\r\n{\r\n $mimeType = [\r\n \'.xml\' => \'application/xml,text/xml,application/x-xml\',\r\n \'.json\' => \'application/json,text/x-json,application/jsonrequest,text/json\',\r\n \'.js\' => \'text/javascript,application/javascript,application/x-javascript\',\r\n \'.css\' => \'text/css\',\r\n \'.rss\' => \'application/rss+xml\',\r\n \'.yaml\' => \'application/x-yaml,text/yaml\',\r\n \'.atom\' => \'application/atom+xml\',\r\n \'.pdf\' => \'application/pdf\',\r\n \'.txt\' => \'text/plain\',\r\n \'.png\' => \'image/png\',\r\n \'.jpg\' => \'image/jpg,image/jpeg,image/pjpeg\',\r\n \'.gif\' => \'image/gif\',\r\n \'.csv\' => \'text/csv\',\r\n \'.html\' => \'text/html,application/xhtml+xml,*/*\',\r\n \'.webp\' => \'image/webp\',\r\n ];\r\n foreach ($mimeType as $key => $val) {\r\n $_types = explode(\',\', $val);\r\n if(in_array($type, $_types)) return $key;\r\n }\r\n return false;\r\n}\r\n```\r\n\r\n', '2017-10-17 16:58:59', '2017-10-17 16:58:59');
-- ----------------------------
-- Table structure for `article_category`
-- ----------------------------
DROP TABLE IF EXISTS `article_category`;
CREATE TABLE `article_category` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`pid` int(11) NOT NULL DEFAULT 0,
`title` varchar(255) NOT NULL DEFAULT '',
`name` varchar(255) DEFAULT '',
`is_menu` tinyint(4) DEFAULT 0,
`pids` varchar(50) DEFAULT '',
`sort` tinyint(4) DEFAULT 100,
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=12 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of article_category
-- ----------------------------
INSERT INTO `article_category` VALUES ('1', '0', '前端脚本', 'javascript', '0', '', '100');
INSERT INTO `article_category` VALUES ('2', '0', '后端数据', 'framework', '0', '', '100');
INSERT INTO `article_category` VALUES ('3', '0', '服务环境', 'environment', '0', '', '100');
INSERT INTO `article_category` VALUES ('4', '0', '开发工具', 'develop', '0', '', '100');
INSERT INTO `article_category` VALUES ('5', '0', '生活感知', 'life', '0', '', '100');
-- ----------------------------
-- Table structure for `article_tag`
-- ----------------------------
DROP TABLE IF EXISTS `article_tag`;
CREATE TABLE `article_tag` (
`article_id` int(11) NOT NULL DEFAULT 0,
`tag_id` int(11) NOT NULL DEFAULT 0,
UNIQUE KEY `idx_unique` (`tag_id`,`article_id`) USING BTREE
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of article_tag
-- ----------------------------
INSERT INTO `article_tag` VALUES ('8', '1');
INSERT INTO `article_tag` VALUES ('9', '1');
INSERT INTO `article_tag` VALUES ('1', '2');
INSERT INTO `article_tag` VALUES ('2', '2');
INSERT INTO `article_tag` VALUES ('3', '2');
INSERT INTO `article_tag` VALUES ('4', '2');
INSERT INTO `article_tag` VALUES ('5', '2');
INSERT INTO `article_tag` VALUES ('6', '2');
INSERT INTO `article_tag` VALUES ('7', '2');
INSERT INTO `article_tag` VALUES ('16', '2');
INSERT INTO `article_tag` VALUES ('17', '2');
INSERT INTO `article_tag` VALUES ('18', '2');
INSERT INTO `article_tag` VALUES ('8', '3');
INSERT INTO `article_tag` VALUES ('13', '4');
INSERT INTO `article_tag` VALUES ('1', '5');
INSERT INTO `article_tag` VALUES ('2', '6');
INSERT INTO `article_tag` VALUES ('5', '6');
INSERT INTO `article_tag` VALUES ('7', '6');
INSERT INTO `article_tag` VALUES ('15', '6');
INSERT INTO `article_tag` VALUES ('16', '6');
INSERT INTO `article_tag` VALUES ('3', '7');
INSERT INTO `article_tag` VALUES ('4', '7');
INSERT INTO `article_tag` VALUES ('14', '8');
INSERT INTO `article_tag` VALUES ('10', '9');
INSERT INTO `article_tag` VALUES ('11', '9');
-- ----------------------------
-- Table structure for `article_view`
-- ----------------------------
DROP TABLE IF EXISTS `article_view`;
CREATE TABLE `article_view` (
`article_id` int(10) unsigned NOT NULL,
`view` int(10) unsigned NOT NULL,
UNIQUE KEY `idx_id` (`article_id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of article_view
-- ----------------------------
INSERT INTO `article_view` VALUES ('1', '131');
INSERT INTO `article_view` VALUES ('2', '92');
INSERT INTO `article_view` VALUES ('3', '105');
INSERT INTO `article_view` VALUES ('4', '73');
INSERT INTO `article_view` VALUES ('5', '79');
INSERT INTO `article_view` VALUES ('6', '79');
INSERT INTO `article_view` VALUES ('7', '119');
INSERT INTO `article_view` VALUES ('8', '128');
INSERT INTO `article_view` VALUES ('9', '71');
INSERT INTO `article_view` VALUES ('10', '62');
INSERT INTO `article_view` VALUES ('11', '392');
INSERT INTO `article_view` VALUES ('12', '476');
INSERT INTO `article_view` VALUES ('13', '118');
INSERT INTO `article_view` VALUES ('14', '600');
INSERT INTO `article_view` VALUES ('15', '186');
INSERT INTO `article_view` VALUES ('16', '217');
INSERT INTO `article_view` VALUES ('17', '102');
INSERT INTO `article_view` VALUES ('18', '112');
-- ----------------------------
-- Table structure for `tag`
-- ----------------------------
DROP TABLE IF EXISTS `tag`;
CREATE TABLE `tag` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`title` varchar(255) NOT NULL DEFAULT '',
PRIMARY KEY (`id`)
) ENGINE=MyISAM AUTO_INCREMENT=10 DEFAULT CHARSET=utf8;
-- ----------------------------
-- Records of tag
-- ----------------------------
INSERT INTO `tag` VALUES ('1', 'HTML');
INSERT INTO `tag` VALUES ('2', 'PHP');
INSERT INTO `tag` VALUES ('3', 'Javascript');
INSERT INTO `tag` VALUES ('4', 'Ubuntu');
INSERT INTO `tag` VALUES ('5', 'Mysql');
INSERT INTO `tag` VALUES ('6', 'Laravel');
INSERT INTO `tag` VALUES ('7', 'Composer');
INSERT INTO `tag` VALUES ('8', 'Nginx');
INSERT INTO `tag` VALUES ('9', 'Apache');
PHP
1
https://gitee.com/shanyu/comblog.git
git@gitee.com:shanyu/comblog.git
shanyu
comblog
ComBlog
master

搜索帮助