Слияние кода завершено, страница обновится автоматически
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\'=&gt;\'mysql:host=127.0.0.1;dbname=com;port=3306;charset=utf8\',\n \'user\'=&gt;\'root\',\n \'pass\'=&gt;\'root\',\n \'param\'=&gt;[\n //文档:http://php.net/manual/en/pdo.setattribute.php\n PDO::ATTR_CASE =&gt; PDO::CASE_NATURAL,//字段名称大小写\n PDO::ATTR_ERRMODE =&gt; PDO::ERRMODE_EXCEPTION,//抛出异常\n PDO::ATTR_ORACLE_NULLS =&gt; PDO::NULL_NATURAL,//在获取数据时将空字符串转换成 SQL 中的 NULL\n PDO::ATTR_STRINGIFY_FETCHES =&gt; false,//将数值转换为字符串\n PDO::ATTR_EMULATE_PREPARES =&gt; false,//进行参数转义\n PDO::ATTR_PERSISTENT =&gt; false,//开启长连接\n PDO::MYSQL_ATTR_INIT_COMMAND=&gt; \'SET NAMES UTF8\',//设置编码\n PDO::ATTR_DEFAULT_FETCH_MODE=&gt; 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-&gt;query($sql); //PDOStatement\n$result=$pdos-&gt;fetch(); //一维数组数据\n\n$pdos=$pdo-&gt;query($sql);\n$result=$pdos-&gt;fetchColumn(0);//字符串数据(获取第一个字段值)\n\n$pdos=$pdo-&gt;query($sql);\n$result=$pdos-&gt;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-&gt;exec($sql); //1\n$id=$pdo-&gt;lastInsertId(); //2454(id)</code></pre>\n<h3>事务</h3>\n<pre><code>$pdo-&gt;beginTransaction();\ntry{\n $in_transaction=$pdo-&gt;inTransaction();//true\n $sql=\'insert ecs_goods (goods_name,goods_sn) values ("test_goods","t_05")\';\n $count=$pdo-&gt;exec($sql);\n $sql=\'insert ecs_goods_activity (act_name,act_desc) values ("test_goods_act","test_desc")\';\n $count=$pdo-&gt;exec($sql);\n $pdo-&gt;commit();\n}catch(PDOException $e){\n $e-&gt;getMessage();//SQLSTATE[42S02]: Base table or view not found: 1146 Table \'com.ecs_goods_activit\' doesn\'t exist\n $pdo-&gt;rollBack();\n}</code></pre>\n<h3>参数绑定</h3>\n<pre><code>$sql = \'SELECT * FROM ecs_goods WHERE goods_id=?\';\n$pdos = $pdo-&gt;prepare($sql);\n$pdos-&gt;bindValue(1,2454);//绑定变量或值\n$status = $pdos-&gt;execute();//true\n$pdos-&gt;queryString;//SELECT * FROM ecs_goods WHERE goods_id=?\n\n$sql = \'SELECT * FROM ecs_goods WHERE goods_id=:id \';\n$pdos = $pdo-&gt;prepare($sql);\n$id = 2454;\n$pdos-&gt;bindParam(\':id\',$id);//只能绑定变量\n$status = $pdos-&gt;execute();//true\n$count = $pdos-&gt;rowCount();//1\n\n$sql=\'select goods_id,goods_name from ecs_goods order by goods_id asc limit 1\';\n$pdos = $pdo-&gt;prepare($sql);\n$status = $pdos-&gt;execute();\n$pdos-&gt;bindColumn(1,$goods_id);\n$pdos-&gt;bindColumn(2,$goods_name);\n$pdos-&gt;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()-&gt;attempt(\n $request-&gt;only(\'email\', \'password\'), $request-&gt;has(\'remember\')\n);\n//直接登录\n$user = User::get(1);\nAuth::guard()-&gt;login($user,$remember);\n//注销登录\nAuth::guard()-&gt;logout();</code></pre>\n<h3>密码加密</h3>\n<pre><code>$password = \'admin\';\n$passwordHash=password_hash($password, PASSWORD_BCRYPT, [\'cost\' =&gt; 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-&gt;hasTooManyLoginAttempts($request)) {\n $this-&gt;fireLockoutEvent($request);\n\n return $this-&gt;sendLockoutResponse($request);\n }\n\n// 尝试登陆\n if ($this-&gt;attemptLogin($request)) {\n return $this-&gt;sendLoginResponse($request);\n }\n\n// 增加尝试登录次数,响应登录失败\n $this-&gt;incrementLoginAttempts($request);\n return $this-&gt;sendFailedLoginResponse($request);</code></pre>\n<h4>尝试登录</h4>\n<pre><code>// 根据config/auth.php配置信息创建Guard\n$guard = $this-&gt;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-&gt;{$driverMethod}($name, $config);\n\n// 根据配置创建供应商EloquentUserProvider,DatabaseUserProvider\n// 可在AuthManager使用provider()扩展\n$provider = $this-&gt;createUserProvider($config[\'provider\']);\n\n// 创建凭证存储类SessionGuard,TokenGuard,RequestGuard\n$guard = new SessionGuard(name, UserProvider, SessionInterface);\n\n// 尝试登录\n$guard-&gt;attempt([$username,$password], $remember);\n// 触发尝试登录事件 EventsAttempting\n$this-&gt;fireAttemptEvent($credentials, $remember, $login);\n\n// EloquentUserProvider根据账号取回数据,判断密码是否正确\n$this-&gt;provider-&gt;retrieveByCredentials();\n$this-&gt;provider-&gt;validateCredentials();\n\n// 更新登录标识\n$this-&gt;updateSession($user-&gt;getAuthIdentifier());\n\n// 更新remember_token,存储id|remember_token到cookie\n$this-&gt;createRememberTokenIfDoesntExist($user);\n$this-&gt;queueRecallerCookie($user);\n\n// 触发登录事件 EventsLogin\n$this-&gt;fireLoginEvent($user, $remember);\n\n// 存储$user到Guard\n// 触发认证事件 EventsAuthenticated\n$this-&gt;setUser($user);\n</code></pre>\n<h3>事件</h3>\n<pre><code>protected $listen = [\n // new EventsAttempting($credentials, $remember, $login)\n \'IlluminateAuthEventsAttempting\' =&gt; [\n \'AppListenersLogAuthenticationAttempt\',\n ],\n //new EventsAuthenticated($user)\n \'IlluminateAuthEventsAuthenticated\' =&gt; [\n \'AppListenersLogAuthenticated\',\n ],\n //EventsLogin($user, $remember)\n \'IlluminateAuthEventsLogin\' =&gt; [\n \'AppListenersLogSuccessfulLogin\',\n ],\n //new EventsLogout($user)\n \'IlluminateAuthEventsLogout\' =&gt; [\n \'AppListenersLogSuccessfulLogout\',\n ],\n\n \'IlluminateAuthEventsLockout\' =&gt; [\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-&gt;get(\'login\', \'AuthLoginController@showLoginForm\')-&gt;name(\'login\');\n $this-&gt;post(\'login\', \'AuthLoginController@login\');\n $this-&gt;post(\'logout\', \'AuthLoginController@logout\')-&gt;name(\'logout\');\n\n // Registration Routes...\n $this-&gt;get(\'register\', \'AuthRegisterController@showRegistrationForm\')-&gt;name(\'register\');\n $this-&gt;post(\'register\', \'AuthRegisterController@register\');\n\n // Password Reset Routes...\n $this-&gt;get(\'password/reset\', \'AuthForgotPasswordController@showLinkRequestForm\');\n $this-&gt;post(\'password/email\', \'AuthForgotPasswordController@sendResetLinkEmail\');\n $this-&gt;get(\'password/reset/{token}\', \'AuthResetPasswordController@showResetForm\');\n $this-&gt;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-&gt;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-&gt;factory(function ($c) {\n $api=new stdClass();\n $api-&gt;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-&gt;protect(function () {\n return rand();\n});</code></pre>\n<h3>获取匿名函数</h3>\n<pre><code class="language-php">$random=$pc-&gt;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\'=&gt;$uc_id];\n $c[\'uc_class\']=function ($c) use ($uc_id){\n $uc=new stdClass();\n $uc-&gt;id=$uc_id;\n return $uc;\n };\n }\n}\n$pc-&gt;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', '<h1>danielstjules/Stringy</h1>\n<p><a href="https://github.com/danielstjules/Stringy">https://github.com/danielstjules/Stringy</a></p>\n<h2>实例</h2>\n<pre><code>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-&gt;length();\n//13\n$s-&gt;getEncoding();\n//UTF-8\n$s-&gt;titleize();\n//Hello World !\n$s-&gt;reverse();\n//! dlrow olleh\n$s-&gt;shuffle();\n//wo! olre hdll\n\nSy::create(\'createHandle\')-&gt;dasherize();\n//create-handle\nSy::create(\'createHandle\')-&gt;delimit(\'_\');\n//create_handle\n\nSy::create(\'/2016/2016080512563.jpg\')-&gt;ensureLeft(\'http://upload.kukj.cn\');\n//http://upload.kukj.cn/2016/2016080512563.jpg\nSy::create(\'http://upload.kukj.cn/2016/2016080512563.jpg\')-&gt;ensureLeft(\'http://upload.kukj.cn\');\n//http://upload.kukj.cn/2016/2016080512563.jpg\n\nSy::create("26")-&gt;pad(\'10\',\'0\',\'left\');\n//0000000026\necho Sy::create(\'What are your plans today?\')-&gt;safeTruncate(22, \'...\');\n//What are your plans...\n\nSy::create(\'{"name":"shanyu"}\')-&gt;isJson();\n//true\nSy::create(\'a:1:{s:4:"name";s:6:"shanyu";}\')-&gt;isSerialized(); \n//true\n\nSy::create(\'&lt;script&gt;alert("hi");&lt;/script&gt;\')-&gt;htmlEncode();\n//&lt;script&gt;alert("hi");&lt;/script&gt;\nSy::create(\'&lt;script&gt;alert("hi");&lt;/script&gt;\')-&gt;htmlDecode();\n//&lt;script&gt;alert("hi");&lt;/script&gt;</code></pre>\n<h2>用途</h2>\n<pre><code>// 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àř\')-&gt;toUpperCase(); // \'FÒÔBÀŘ\'\ns(\'fòôbàř\')-&gt;length(); // \'6\'</code></pre>\n<h2>资料</h2>\n<pre><code>// 获得文档编码\necho mb_internal_encoding();\n// \'UTF-8\'</code></pre>', '# 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 数据模型使用代码示例', '<h2>模型定义使用代码示例</h2>\n<h3>DB</h3>\n<pre><code>// 增加\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\' =&gt; 1]);\n\n//事务\nDB::beginTransaction();\nDB::commit();\nDB::rollBack();</code></pre>\n<h3>Query</h3>\n<pre><code>// 查询完整示例\nDB::table(\'users\')\n-&gt;select(\'name\', \'email as user_email\')\n-&gt;where(\'id\',51)\n-&gt;orderBy(\'id\',\'desc\')\n-&gt;skip(10)\n-&gt;take(5)\n-&gt;first();\n\n// 多行数据\n$goods = DB::table(\'goods\')-&gt;where(\'id\',\'&lt;\',10)-&gt;get();\n// 一列字段\n$good_names = DB::table(\'goods\')-&gt;where(\'id\',\'&lt;\',10)-&gt;pluck(\'name\',\'id\');\n\n// 单行数据\n$good = DB::table(\'goods\')-&gt;select([\'id\',\'name\'])-&gt;where(\'id\',2)-&gt;first();\n// 一个字段\n$good_name = DB::table(\'goods\')-&gt;where(\'id\',2)-&gt;value(\'name\');\n\n// 添加数据\n$insert_status1 = DB::table(\'goods\')-&gt;insert([\'name\'=&gt;\'英国红薯\']);\n$insert_status2 = DB::table(\'goods\')-&gt;insert([[\'name\'=&gt;\'英国红薯\'],[\'name\'=&gt;\'荷兰冰块\']]);\n$insert_id = DB::table(\'goods\')-&gt;insertGetId([\'name\'=&gt;\'英国土豆\']);\n\n// 修改数据\n$update_status = DB::table(\'goods\')-&gt;where(\'id\',15)-&gt;update([\'name\'=&gt;\'英国红薯\']);\n\n// 删除数据\n$delete_status = DB::table(\'goods\')-&gt;where(\'id\',15)-&gt;delete();\n\n// 分页列表\n$list = DB::table(\'goods\')-&gt;paginate(10);\n//$list = DB::table(\'goods\')-&gt;simplePaginate(10);</code></pre>\n<h3>Model</h3>\n<pre><code>&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\' =&gt; \'boolean\',\n \'is_publish\' =&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-&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-&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-&gt;where(\'is_hot\',1)-&gt;orderBy(\'sort\', \'asc\')-&gt;orderBy(\'id\', \'desc\');\n }\n public function scopeOfCid($query,$cid)\n {\n return $query-&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; is_string($value)){\n $this-&gt;attributes[\'author\'] = ucwords($value);\n }\n }\n}</code></pre>\n<h4>Relation</h4>\n<pre><code>&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-&gt;hasOne(GoodExtend::class,\'good_id\',\'id\');\n }\n public function activitys()\n {\n return $this-&gt;hasMany(GoodActivity::class,\'good_id\',\'id\');\n }\n public function tags()\n {\n return $this-&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-&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-&gt;hasManyThrough(GoodActivity::class,Good::class,\'country_id\',\'good_id\',\'id\');\n }\n}</code></pre>\n<h4>Relation Curd</h4>\n<pre><code>&lt;?php\n$good = new Good();\n$good-&gt;name = \'自家玉米\';\n$good-&gt;save();\n\n// 一对一\n$extend = new GoodExtend();\n$extend-&gt;remark = \'真的,真的是自家的.\';\n$good-&gt;extend()-&gt;save($extend);\n\n// 一对多\n$activity = [\'促销\',\'年终\'];\n$activitys=[];\nforeach($activity as $v){\n $act=new GoodActivity();\n $act-&gt;title = $v;\n $activitys[]= $act;\n}\n$good-&gt;activitys()-&gt;saveMany($activitys);\n\n// 多对多\n$tag_ids=[1,2,3];\n$good-&gt;tags()-&gt;attach($tag_ids);// 添加关联\n// $good-&gt;tags()-&gt;detach(); // 解除关联\n\n//增加$fillable属性中字段\n$good = Good::create([\'name\'=&gt;\'美国小麦\']);\n$good-&gt;extend()-&gt;create([\'remark\'=&gt;\'美国进口的高大上\']);</code></pre>', '## 模型定义使用代码示例\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', '<h2>简单判断</h2>\n<pre><code> if (!isset($_SERVER[\'PHP_AUTH_USER\'])) {\n header(\'WWW-Authenticate: Basic realm="My Realm"\');\n header(\'HTTP/1.0 401 Unauthorized\');\n echo \'Text to send if user hits Cancel button\';\n exit;\n } else {\n echo "&lt;p&gt;Hello {$_SERVER[\'PHP_AUTH_USER\']}.&lt;/p&gt;";\n echo "&lt;p&gt;You entered {$_SERVER[\'PHP_AUTH_PW\']} as your password.&lt;/p&gt;";\n }</code></pre>\n<h3>封装类</h3>\n<pre><code>class PhpAuth\n{\n protected $username;\n protected $password;\n\n public function __construct($username, $password)\n { \n $this-&gt;username = (string) $username;\n $this-&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-&gt;username !== $authUsername || $this-&gt;password !== $authPassword ){\n return $this-&gt;authenticate();\n }\n\n return true;\n }\n\n protected static function authenticate()\n {\n header(\'WWW-Authenticate: Basic realm="User Authenticate"\');\n header(\'HTTP/1.0 401 Unauthorized\');\n return false;\n }\n}</code></pre>', '## 简单判断\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 应用执行分析', '<h2>流程概括</h2>\n<p>/public/index.php\n(1) 自动加载 1-20\n(2) 初始化应用 21-33\n(3) 执行应用 34-206 </p>\n<p>/bootstrap/autoload.php\n(1.1) 加载 /vendor/autoload.php\n(1.2) 判断或加载已合并的文件 /bootstrap/cache/compiled.php </p>\n<p>/bootstrap/app.php\n(2.1) 实例化Application\n(2.2) 声明Http/Console/Debug接口的Single实例类 </p>\n<p>/public/index.php\n(3.1) 实例化Http\n(3.2) 解析并处理请求\n(3.3) 输出响应结果\n(3.4) 触发后置中间件 </p>\n<h2>执行应用(3.2)</h2>\n<h3>初始化基础类</h3>\n<p>开启表单中<code>_method=put</code>覆盖<code>$_SERVER[REQUEST_METHOD]</code>,并初始化基础类</p>\n<pre><code>// 基础类数组\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-&gt;hasBeenBootstrapped = true;\n\n foreach ($bootstrappers as $bootstrapper) {\n $this[\'events\']-&gt;fire(\'bootstrapping: \'.$bootstrapper, [$this]);\n\n $this-&gt;make($bootstrapper)-&gt;bootstrap($this);\n\n $this[\'events\']-&gt;fire(\'bootstrapped: \'.$bootstrapper, [$this]);\n }\n}</code></pre>\n<ol>\n<li>默认加载<code>.env</code>到环境变量,<code>cli</code>模式下<code>php index.php --env=local</code>加载<code>.env.local</code></li>\n<li>加载<code>/config</code>所有配置文件</li>\n<li>绑定实例<code>Monolog</code>到<code>log</code>,并根据<code>config/app.php</code>下的log配置</li>\n<li>注册错误处理机制,<code>set_error_handler();set_exception_handler();register_shutdown_function();</code></li>\n<li>注册门面自动加载机制<code>Facades</code>,根据<code>config(\'app.aliases\')</code>执行<code>class_alias()</code></li>\n<li>注册服务提供者,根据<code>config(\'app.providers\')</code>生成<code>bootstrap/cache/services.php</code>,注册服务提供者<code>register()</code>,注册延迟服务提供者<code>$defer = true</code>,绑定事件<code>when()</code></li>\n<li>执行app中<code>$bootingCallbacks</code>的回调数组,执行<code>$serviceProviders</code>类的<code>boot()</code>方法,执行app中<code>$bootedCallbacks</code>的回调数组</li>\n</ol>\n<h3>执行全局中间件</h3>\n<p>AppHttpKernel</p>\n<pre><code>protected $middleware = [\n IlluminateFoundationHttpMiddlewareCheckForMaintenanceMode::class,\n];</code></pre>\n<h3>解析路由</h3>\n<ol>\n<li>根据请求参数匹配路由<code>$route = $this-&gt;findRoute($request);</code></li>\n<li>触发路由匹配事件<code>IlluminateRoutingEventsRouteMatched</code></li>\n<li>\n<p>执行分组中间件,路由中间件,控制器中间件</p>\n<pre><code>// 分组中间件\nprotected $middlewareGroups = [\n\'web\' =&gt; [\n AppHttpMiddlewareEncryptCookies::class,\n IlluminateCookieMiddlewareAddQueuedCookiesToResponse::class,\n IlluminateSessionMiddlewareStartSession::class,\n IlluminateViewMiddlewareShareErrorsFromSession::class,\n AppHttpMiddlewareVerifyCsrfToken::class,\n IlluminateRoutingMiddlewareSubstituteBindings::class,\n],\n\n\'api\' =&gt; [\n \'throttle:60,1\',\n \'bindings\',\n],\n];\n// 路由中间件\nprotected $routeMiddleware = [\n\'auth\' =&gt; IlluminateAuthMiddlewareAuthenticate::class,\n\'auth.basic\' =&gt; IlluminateAuthMiddlewareAuthenticateWithBasicAuth::class,\n\'bindings\' =&gt; IlluminateRoutingMiddlewareSubstituteBindings::class,\n\'can\' =&gt; IlluminateAuthMiddlewareAuthorize::class,\n\'guest\' =&gt; AppHttpMiddlewareRedirectIfAuthenticated::class,\n\'throttle\' =&gt; IlluminateRoutingMiddlewareThrottleRequests::class,\n];</code></pre>\n</li>\n<li>执行控制器或回调\n<pre><code>// 控制器执行方式\n// (new IlluminateRoutingControllerDispatcher($container))-&gt;dispatch(Route $route, $controller, $method)\n$parameters = $this-&gt;resolveClassMethodDependencies(\n$route-&gt;parametersWithoutNulls(), $controller, $method\n);\nif (method_exists($controller, \'callAction\')) {\nreturn $controller-&gt;callAction($method, $parameters);\n}\nreturn call_user_func_array([$controller, $method], $parameters);</code></pre></li>\n<li>返回封装为Response\n<pre><code>return $this-&gt;prepareResponse($request,$route-&gt;run($request));</code></pre></li>\n</ol>', '## 流程概括\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焦点图', '<h2>下载</h2>\n<blockquote>\n<p><a href="https://github.com/OwlFonk/OwlCarousel/releases">https://github.com/OwlFonk/OwlCarousel/releases</a></p>\n</blockquote>\n<h2>代码</h2>\n<pre><code>&lt;link href="/js/owl/owl.carousel.css" rel="stylesheet"&gt;\n&lt;link href="/js/owl/owl.theme.css" rel="stylesheet"&gt;\n\n&lt;div id="owlBanner" class="owl-carousel owl-theme"&gt;\n @foreach($banners as $banner)\n &lt;div class="item"&gt;\n &lt;a href="{{ $banner-&gt;url }}"&gt;\n &lt;img class="lazyOwl" data-src="{{ $banner-&gt;image }}" alt="{{ $banner-&gt;title }}" height="360" width="100%"&gt;\n &lt;/a&gt;\n &lt;/div&gt;\n @endforeach\n&lt;/div&gt;\n\n&lt;script src="/js/owl/owl.carousel.min.js"&gt;&lt;/script&gt;\n&lt;script&gt;\n$("#owlBanner").owlCarousel({\n navigation : false, // 显示左右箭头,默认false\n autoPlay : true, //自动播放,默认false\n slideSpeed : 5000, //轮播间隔时间\n singleItem : true, //单个图片\n lazyLoad : true, //延迟加载\n stopOnHover : true, //悬停停止播放,默认false\n});</code></pre>\n<h2>参数</h2>\n<table>\n<thead>\n<tr>\n<th>参数</th>\n<th>类型</th>\n<th>默认值</th>\n<th>说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>items</td>\n<td>整数</td>\n<td>5</td>\n<td>幻灯片每页可见个数</td>\n</tr>\n<tr>\n<td>itemsDesktop</td>\n<td>数组</td>\n<td>[1199,4]</td>\n<td>设置浏览器宽度和幻灯片可见个数,格式为[X,Y],X 为浏览器宽度,Y 为可见个数,如[1199,4]就是如果浏览器宽度小于1199,每页显示 4 张,此参数主要用于响应式设计。也可以使用 false</td>\n</tr>\n<tr>\n<td>itemsDesktopSmall</td>\n<td>数组</td>\n<td>[979,3]</td>\n<td>同上</td>\n</tr>\n<tr>\n<td>itemsTablet</td>\n<td>数组</td>\n<td>[768,2]</td>\n<td>同上</td>\n</tr>\n<tr>\n<td>itemsTabletSmall</td>\n<td>数组</td>\n<td>false</td>\n<td>同上,默认为 false</td>\n</tr>\n<tr>\n<td>itemsMobile</td>\n<td>数组</td>\n<td>[479,1]</td>\n<td>同上</td>\n</tr>\n<tr>\n<td>itemsCustom</td>\n<td>数组</td>\n<td>false</td>\n<td></td>\n</tr>\n<tr>\n<td>singleItem</td>\n<td>布尔值</td>\n<td>false</td>\n<td>是否只显示一张</td>\n</tr>\n<tr>\n<td>itemsScaleUp</td>\n<td>布尔值</td>\n<td>false</td>\n<td></td>\n</tr>\n<tr>\n<td>slideSpeed</td>\n<td>整数</td>\n<td>200</td>\n<td>幻灯片切换速度,以毫秒为单位</td>\n</tr>\n<tr>\n<td>paginationSpeed</td>\n<td>整数</td>\n<td>800</td>\n<td>分页切换速度,以毫秒为单位</td>\n</tr>\n<tr>\n<td>rewindSpeed</td>\n<td>整数</td>\n<td>1000</td>\n<td>重回速度,以毫秒为单位</td>\n</tr>\n<tr>\n<td>autoPlay</td>\n<td>布尔值/整数</td>\n<td>false</td>\n<td>自动播放,可选布尔值或整数,若使用整数,如 3000,表示 3 秒切换一次;若设置为 true,默认 5 秒切换一次</td>\n</tr>\n<tr>\n<td>stopOnHover</td>\n<td>布尔值</td>\n<td>false</td>\n<td>鼠标悬停停止自动播放</td>\n</tr>\n<tr>\n<td>navigation</td>\n<td>布尔值</td>\n<td>false</td>\n<td>显示“上一个”、“下一个”</td>\n</tr>\n<tr>\n<td>navigationText</td>\n<td>数组</td>\n<td>[“prev”,”next”]</td>\n<td>设置“上一个”、“下一个”文字,默认是[“prev”,”next”]</td>\n</tr>\n<tr>\n<td>rewindNav</td>\n<td>布尔值</td>\n<td>true</td>\n<td>滑动到第一个</td>\n</tr>\n<tr>\n<td>scrollPerPage</td>\n<td>布尔值</td>\n<td>false</td>\n<td>每页滚动而不是每个项目滚动</td>\n</tr>\n<tr>\n<td>pagination</td>\n<td>布尔值</td>\n<td>true</td>\n<td>显示分页</td>\n</tr>\n<tr>\n<td>paginationNumbers</td>\n<td>布尔值</td>\n<td>false</td>\n<td>分页按钮显示数字</td>\n</tr>\n<tr>\n<td>responsive</td>\n<td>布尔值</td>\n<td>true</td>\n<td></td>\n</tr>\n<tr>\n<td>responsiveRefreshRate</td>\n<td>整数</td>\n<td>200</td>\n<td>每 200 毫秒检测窗口宽度并做相应的调整,主要用于响应式</td>\n</tr>\n<tr>\n<td>responsiveBaseWidth</td>\n<td>jQuery 选择器</td>\n<td>window</td>\n<td></td>\n</tr>\n<tr>\n<td>baseClass</td>\n<td>字符串</td>\n<td>owl-carousel</td>\n<td>添加 CSS,如果不需要,最好不要使用</td>\n</tr>\n<tr>\n<td>theme</td>\n<td>字符串</td>\n<td>owl-theme</td>\n<td>主题样式,可以自行添加以符合你的要求</td>\n</tr>\n<tr>\n<td>lazyLoad</td>\n<td>布尔值</td>\n<td>false</td>\n<td>延迟加载</td>\n</tr>\n<tr>\n<td>lazyFollow</td>\n<td>布尔值</td>\n<td>true</td>\n<td>当使用分页时,如果跨页浏览,将不加载跳过页面的图片,只加载所要显示页面的图片,如果设置为 false,则会加载跳过页面的图片。这是 lazyLoad 的子选项</td>\n</tr>\n<tr>\n<td>lazyEffect</td>\n<td>布尔值/字符串</td>\n<td>fade</td>\n<td>延迟加载图片的显示效果,默认以 400 毫秒淡入,若为 false 则不使用效果</td>\n</tr>\n<tr>\n<td>autoHeight</td>\n<td>布尔值</td>\n<td>false</td>\n<td>自动使用高度</td>\n</tr>\n<tr>\n<td>jsonPath</td>\n<td>字符串</td>\n<td>false</td>\n<td>JSON 文件路径</td>\n</tr>\n<tr>\n<td>jsonSuccess</td>\n<td>函数</td>\n<td>false</td>\n<td>处理自定义 JSON 格式的函数</td>\n</tr>\n<tr>\n<td>dragBeforeAnimFinish</td>\n<td>布尔值</td>\n<td>true</td>\n<td>忽略过度是否完成(只限拖动)</td>\n</tr>\n<tr>\n<td>mouseDrag</td>\n<td>布尔值</td>\n<td>true</td>\n<td>关闭/开启鼠标事件</td>\n</tr>\n<tr>\n<td>touchDrag</td>\n<td>布尔值</td>\n<td>true</td>\n<td>关闭/开启触摸事件</td>\n</tr>\n<tr>\n<td>addClassActive</td>\n<td>布尔值</td>\n<td>false</td>\n<td>给可见的项目加入 “active” 类</td>\n</tr>\n<tr>\n<td>transitionStyle</td>\n<td>字符串</td>\n<td>false</td>\n<td>添加 CSS3 过度效果</td>\n</tr>\n</tbody>\n</table>\n<h2>参考</h2>\n<blockquote>\n<p><a href="http://www.dowebok.com/93.html">http://www.dowebok.com/93.html</a></p>\n</blockquote>', '## 下载\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基础模板代码示例', '<h2>基本摸板</h2>\n<pre><code>&lt;!DOCTYPE html&gt;\n&lt;html lang="zh-CN"&gt;\n&lt;head&gt;\n &lt;meta charset="utf-8"&gt;\n &lt;meta name="renderer" content="webkit"&gt;\n &lt;meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1"&gt;\n &lt;meta name="viewport" content="width=device-width, initial-scale=1"&gt;\n\n &lt;title&gt;TITLE&lt;/title&gt;\n &lt;meta name="Keywords" content="KEYWORDS"&gt;\n &lt;meta name="description" content="DESCRIPTION"&gt;\n &lt;link rel="shortcut icon" href="favicon.ico"&gt;\n\n &lt;!--[if lt IE 9]&gt;\n &lt;script src="https://oss.maxcdn.com/html5shiv/3.7.3/html5shiv.min.js"&gt;&lt;/script&gt;\n &lt;script src="https://oss.maxcdn.com/respond/1.4.2/respond.min.js"&gt;&lt;/script&gt;\n &lt;![endif]--&gt;\n&lt;/head&gt;\n&lt;body&gt;\n\n &lt;form action="" method="post" enctype="multipart/form-data"&gt;\n &lt;input name="avatar" type="file" accept="image/*"&gt;\n &lt;input type="submit"&gt;\n &lt;/form&gt;\n\n&lt;/body&gt;\n&lt;/html&gt;</code></pre>\n<h2>配置DNS预获取</h2>\n<pre><code>&lt;link rel="dns-prefetch" href="//static.web-host.com"&gt;</code></pre>\n<h2>禁用favicon.ico,版本&gt;IE8</h2>\n<pre><code>&lt;link rel="icon" href="data:;base64,="&gt;\n或\n&lt;link rel="icon" href="data:image/ico;base64,aWNv"&gt;</code></pre>\n<h2>禁用百度转码</h2>\n<pre><code>&lt;meta http-equiv="Cache-Control" content="no-transform" /&gt;\n&lt;meta http-equiv="Cache-Control" content="no-siteapp" /&gt;</code></pre>', '## 基本摸板\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 使用示例', '<h1>开启</h1>\n<pre><code>RewriteEngine On</code></pre>\n<h1>防盗链</h1>\n<pre><code>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]</code></pre>\n<p>RewriteRule .(gif|jpg|png|js|css)$ - [F]\n这里&quot;-&quot;表示没有替换,F表示禁止对URL地址的存取,L表示停止处理接下来的规则\n&quot;[NC]&quot;指不区分大小写;</p>\n<h1>永久301域名@跳转www</h1>\n<pre><code>RewriteCond %{HTTP_HOST} ^demo.com$ [NC]\nRewriteRule ^(.*)$ http://www.demo.com/$1 [R=301,L]</code></pre>\n<h1>维护中307跳转</h1>\n<pre><code>RewriteCond %{REQUEST_URI} ^/blog(.*)?$\nRewriteRule ^(.*)$ /307_blog.php [R=307,L]</code></pre>\n<h1>默认主页</h1>\n<pre><code>DirectoryIndex index.php</code></pre>\n<h1>隐藏目录下所有文件</h1>\n<pre><code>Options -Indexes</code></pre>\n<h1>显示目录下所有文件,但不包含文件类型的小图示</h1>\n<pre><code>IndexOptions -FancyIndexing</code></pre>\n<h1>自定义出错页面</h1>\n<pre><code>ErrorDocument 404 /error.php\nErrorDocument 500 /error.php\nErrorDocument 400 /error.php\nErrorDocument 401 /error.php\nErrorDocument 403 /error.php\nErrorDocument 503 /error.php</code></pre>\n<h1>伪静态</h1>\n<pre><code>RewriteRule ^product/([^/]+)/([^/]+)/([^/]+).html /product.php?cat=$1&amp;brand=$2&amp;prod=$3</code></pre>\n<p>RewriteRule下:</p>\n<pre><code>[R] 强制重定向,[R=code] code默认为302\n[F] 禁用URL,返回HTTP 403 错误\n[L] 这是最后一条规则,之后内容无用</code></pre>\n<p>RewriteCond下: </p>\n<pre><code>[NC] 不分字母大小写\n[OR] 用于连接下一条规则</code></pre>\n<pre><code>RewriteCond %{REQUEST_FILENAME} !-d\n# !-d 不是目录或不存在\nRewriteCond %{REQUEST_FILENAME} !-f\n# !-f 不是文件或不存在\nRewriteRule ^ index.php [L]\n# [L] 这是最后一个匹配项,不再往下匹配</code></pre>\n<h1>强制重定向到www</h1>\n<pre><code>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]</code></pre>\n<h1>综合</h1>\n<pre><code># —— 位于行首时表示注释。\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 —— 测试字符串所指文件是否有“非零”值</code></pre>', '# 开启\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 头信息中常见字段详解', '<pre><code>表明服务器是否支持指定范围请求及哪种类型的分段请求\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:"e8-53ec0095b3a25-gzip"\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</code></pre>\n<table>\n<thead>\n<tr>\n<th>综合\nHeader</th>\n<th>解释</th>\n<th>示例</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>Accept-Ranges</td>\n<td>表明服务器是否支持指定范围请求及哪种类型的分段请求</td>\n<td>Accept-Ranges: bytes</td>\n</tr>\n<tr>\n<td>Age</td>\n<td>从原始服务器到代理缓存形成的估算时间(以秒计,非负)</td>\n<td>Age: 12</td>\n</tr>\n<tr>\n<td>Allow</td>\n<td>对某网络资源的有效的请求行为,不允许则返回405</td>\n<td>Allow: GET, HEAD</td>\n</tr>\n<tr>\n<td>Cache-Control</td>\n<td>告诉所有的缓存机制是否可以缓存及哪种类型</td>\n<td>Cache-Control: no-cache</td>\n</tr>\n<tr>\n<td>Content-Encoding</td>\n<td>web服务器支持的返回内容压缩编码类型。</td>\n<td>Content-Encoding: gzip</td>\n</tr>\n<tr>\n<td>Content-Language</td>\n<td>响应体的语言</td>\n<td>Content-Language: en,zh</td>\n</tr>\n<tr>\n<td>Content-Length</td>\n<td>响应体的长度</td>\n<td>Content-Length: 348</td>\n</tr>\n<tr>\n<td>Content-Location</td>\n<td>请求资源可替代的备用的另一地址</td>\n<td>Content-Location: /index.htm</td>\n</tr>\n<tr>\n<td>Content-MD5 返回资源的MD5校验值</td>\n<td>Content-MD5: Q2hlY2sgSW50ZWdyaXR5IQ==</td>\n</tr>\n<tr>\n<td>Content-Range</td>\n<td>在整个返回体中本部分的字节位置</td>\n<td>Content-Range: bytes 21010-47021/47022</td>\n</tr>\n<tr>\n<td>Content-Type</td>\n<td>返回内容的MIME类型</td>\n<td>Content-Type: text/html; charset=utf-8</td>\n</tr>\n<tr>\n<td>Date</td>\n<td>原始服务器消息发出的时间</td>\n<td>Date: Tue, 15 Nov 2010 08:12:31 GMT</td>\n</tr>\n<tr>\n<td>ETag</td>\n<td>请求变量的实体标签的当前值</td>\n<td>ETag: “737060cd8c284d8af7ad3082f209582d”</td>\n</tr>\n<tr>\n<td>Expires</td>\n<td>响应过期的日期和时间</td>\n<td>Expires: Thu, 01 Dec 2010 16:00:00 GMT</td>\n</tr>\n<tr>\n<td>Last-Modified</td>\n<td>请求资源的最后修改时间 Last-Modified: Tue, 15 Nov 2010 12:45:26 GMT</td>\n</tr>\n<tr>\n<td>Location</td>\n<td>用来重定向接收方到非请求URL的位置来完成请求或标识新的资源</td>\n<td>Location: <a href="http://www.zcmhi.com/archives/94.html">http://www.zcmhi.com/archives/94.html</a></td>\n</tr>\n<tr>\n<td>Pragma</td>\n<td>包括实现特定的指令,它可应用到响应链上的任何接收方</td>\n<td>Pragma: no-cache</td>\n</tr>\n<tr>\n<td>Proxy-Authenticate</td>\n<td>它指出认证方案和可应用到代理的该URL上的参数</td>\n<td>Proxy-Authenticate: Basic</td>\n</tr>\n<tr>\n<td>refresh</td>\n<td>应用于重定向或一个新的资源被创造,在5秒之后重定向(由网景提出,被大部分浏览器支持)</td>\n<td>Refresh: 5; url=<a href="http://www.zcmhi.com/archives/94.html">http://www.zcmhi.com/archives/94.html</a></td>\n</tr>\n<tr>\n<td>Retry-After</td>\n<td>如果实体暂时不可取,通知客户端在指定时间之后再次尝试</td>\n<td>Retry-After: 120</td>\n</tr>\n<tr>\n<td>Server</td>\n<td>web服务器软件名称</td>\n<td>Server: Apache/1.3.27 (Unix) (Red-Hat/Linux)</td>\n</tr>\n<tr>\n<td>Set-Cookie</td>\n<td>设置Http Cookie</td>\n<td>Set-Cookie: UserID=JohnDoe; Max-Age=3600; Version=1</td>\n</tr>\n<tr>\n<td>Trailer</td>\n<td>指出头域在分块传输编码的尾部存在</td>\n<td>Trailer: Max-Forwards</td>\n</tr>\n<tr>\n<td>Transfer-Encoding</td>\n<td>文件传输编码</td>\n<td>Transfer-Encoding:chunked</td>\n</tr>\n<tr>\n<td>Vary</td>\n<td>告诉下游代理是使用缓存响应还是从原始服务器请求</td>\n<td>Vary: *</td>\n</tr>\n<tr>\n<td>Via</td>\n<td>告知代理客户端响应是通过哪里发送的</td>\n<td>Via: 1.0 fred, 1.1 nowhere.com (Apache/1.1)</td>\n</tr>\n<tr>\n<td>Warning</td>\n<td>警告实体可能存在的问题</td>\n<td>Warning: 199 Miscellaneous warning</td>\n</tr>\n<tr>\n<td>WWW-Authenticate</td>\n<td>表明客户端请求实体应该使用的授权方案</td>\n<td>WWW-Authenticate: Basic</td>\n</tr>\n</tbody>\n</table>', '```\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 常用插件及配置参数', '<h2>Settings user</h2>\n<pre><code>{\n "color_scheme": "Packages/Nil-Theme/Sanakan.tmTheme",\n "font_size": 14.0, //字号\n "default_encoding": "UTF-8", //默认编码\n "show_encoding": true,//状态栏显示当前文件编码\n "bold_folder_labels": true, // 左侧边栏文字加粗\n "remember_open_files": true, // 记忆之前打开的文件\n "tab_size": 4, // Tab键制表符宽度\n "tab_completion": true,//设置为true时,按Tab会根据前后环境进行代码自动匹配填补\n "expand_tabs_on_save": true,//保存时自动把tab转换成空格\n "translate_tabs_to_spaces": true, // 设为true时,缩进和遇到Tab键时使用空格替代\n "auto_indent": true, //自动缩进\n "auto_complete": true, // 代码提示\n "auto_complete_delay": 50, // 代码提示延迟显示\n "auto_close_tags": true,//自动补全成对标签\n "auto_match_enabled": true, // 自动匹配引号,括号等\n "line_numbers": true, //显示行号\n "gutter": true, //显示行号边栏\n "word_wrap": true, //开启自动换行\n "word_separators": "\\"\'\'“”./()‘&lt;&gt;:,.;~!@#$%^-&amp;*|+=[]{}`~?",\n "scroll_past_end": true, // 设置为false时,滚动到文本的最下方时,没有缓冲区\n "highlight_line": true, //高亮当前行\n "highlight_modified_tabs": true,//红色显示编辑文件的tab名称\n "find_selected_text": true,//选中的文本按Ctrl + f时,自动复制到查找面板的文本框里\n "trim_trailing_white_space_on_save": false, // 保存文件时是否删除每行结束后多余的空格\n "update_check": false, //自动升级\n "ignored_packages":\n [\n "Vintage"\n ],\n}</code></pre>\n<pre><code>"theme": "Soda Light 3.sublime-theme",\n"font_face": "Monaco",\n"font_size": 15.0, //字号</code></pre>\n<h2>Package Control</h2>\n<pre><code>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)</code></pre>\n<h2>编译系统PHP</h2>\n<pre><code>{\n "cmd": ["E:/Service/PHP5/php.exe", "$file"],\n "file_regex": "php$",\n "selector":"source.php"\n}</code></pre>\n<p>命名为php.sublime-build,保存在<code>C:/Documents and Settings/[用户名]/Application Data/Sublime Text 2/Packages/User</code>目录下.\n重启sublime text,就可以用Ctrl+B来编译.php文件了.</p>\n<h2>编译系统</h2>\n<pre><code>{"cmd": ["node", "$file"],"selector": "source.js"}</code></pre>\n<h2>sublimelinter</h2>\n<p>先安装sublimelinter,再安装sublimelinter-php\n打开preferences-package settings-sublimeLinter-settings--user</p>\n<pre><code> {\n "user": {\n "linters": {\n },\n "paths": {\n "linux": [],\n "osx": [],\n "windows": [\n "E:/Service/PHP5"\n ]\n },\n }\n }</code></pre>\n<h2>phpfmt</h2>\n<pre><code>{\n "enable_auto_align": true,\n "indent_with_space": true,\n "psr1_naming": true,\n "psr2": true,\n "version": 1\n}</code></pre>\n<h2>注册码</h2>\n<pre><code>—– 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 ——</code></pre>', '## 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使用示例', '<h2>curl</h2>\n<pre><code>curl -d "age=16" 127.0.0.1/param.php?name=jim -o param.log\n// -d "age=16" POST数据age=16\n// -o param.log 保存数据到param.log</code></pre>\n<h2>curl cookie</h2>\n<pre><code>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</code></pre>\n<h1>参考</h1>\n<blockquote>\n<p><a href="http://www.cnblogs.com/gbyukg/p/3326825.html">http://www.cnblogs.com/gbyukg/p/3326825.html</a></p>\n</blockquote>', '## 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 日志配置参数详解', '<h2>log 日志</h2>\n<h3>示例</h3>\n<pre><code>127.0.0.1 - - [23/Mar/2017:17:05:26 +0800] \n"GET / HTTP/1.1" 200 53 "-" \n"Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36"</code></pre>\n<h3>配置</h3>\n<pre><code>http {\n ...\n log_format main \'$remote_addr - $remote_user [$time_local] "$request" \'\n \'$status $body_bytes_sent "$http_referer" \'\n \'"$http_user_agent" "$http_x_forwarded_for"\';\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}</code></pre>\n<h3>参数说明</h3>\n<h4>log_format</h4>\n<table>\n<thead>\n<tr>\n<th>参数</th>\n<th>示例</th>\n<th>说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>$remote_addr</td>\n<td>127.0.0.1</td>\n<td>客户端地址</td>\n</tr>\n<tr>\n<td>$time_local</td>\n<td>18/Jul/2012:17:00:01 +0800</td>\n<td>访问时间和时区</td>\n</tr>\n<tr>\n<td>$http_referer</td>\n<td><a href="http://test.net/index2.php">http://test.net/index2.php</a></td>\n<td>URL跳转来源</td>\n</tr>\n<tr>\n<td>$request</td>\n<td>GET / HTTP/1.1</td>\n<td>请求的URL和HTTP协议</td>\n</tr>\n<tr>\n<td>$request_length</td>\n<td>438</td>\n<td>请求内容长度</td>\n</tr>\n<tr>\n<td>$request_time</td>\n<td>0.007</td>\n<td>请求总时间</td>\n</tr>\n<tr>\n<td>$status</td>\n<td>200</td>\n<td>HTTP请求状态</td>\n</tr>\n<tr>\n<td>$bytes_sent</td>\n<td>53</td>\n<td>响应内容长度</td>\n</tr>\n<tr>\n<td>$http_user_agent</td>\n<td>Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/45.0.2454.101 Safari/537.36</td>\n<td>客户端标识</td>\n</tr>\n</tbody>\n</table>\n<h4>open_log_file_cache</h4>\n<table>\n<thead>\n<tr>\n<th>参数</th>\n<th>说明</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>max</td>\n<td>设置缓存中的最大文件描述符数量,如果缓存被占满,采用LRU算法将描述符关闭。</td>\n</tr>\n<tr>\n<td>inactive</td>\n<td>设置存活时间,默认是10s</td>\n</tr>\n<tr>\n<td>min_uses</td>\n<td>设置在inactive时间段内,日志文件最少使用多少次后,该日志文件描述符记入缓存中,默认是1次</td>\n</tr>\n<tr>\n<td>valid</td>\n<td>设置检查频率,默认60s</td>\n</tr>\n<tr>\n<td>off</td>\n<td>禁用缓存</td>\n</tr>\n</tbody>\n</table>', '## 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 面包屑导航 代码示例', '<h2>安装</h2>\n<pre><code>composer require davejamesmiller/laravel-breadcrumbs</code></pre>\n<h2>配置<code>config/app.php</code></h2>\n<pre><code>\'providers\' =&gt; [\n // ...\n DaveJamesMillerBreadcrumbsServiceProvider::class,\n],\n\'aliases\' =&gt; [\n // ...\n \'Breadcrumbs\' =&gt; DaveJamesMillerBreadcrumbsFacade::class,\n],</code></pre>\n<h2>初始化<code>route/breadcrumbs.php</code></h2>\n<pre><code>Breadcrumbs::register(\'home\', function($breadcrumbs)\n{\n $breadcrumbs-&gt;push(\'首页\', route(\'home\'));\n});\n\nBreadcrumbs::register(\'article\', function($breadcrumbs)\n{\n $breadcrumbs-&gt;parent(\'home\');\n $breadcrumbs-&gt;push(\'文章\', route(\'article\'));\n});\n\nBreadcrumbs::register(\'article.detail\', function($breadcrumbs, $article)\n{\n $breadcrumbs-&gt;parent(\'article\');\n $breadcrumbs-&gt;push($article-&gt;title, route(\'article.detail\', $article-&gt;id));\n});</code></pre>\n<h2>输出</h2>\n<pre><code>{!! Breadcrumbs::render(\'article\') !!}\n// 获得数组\nBreadcrumbs::generateArray(\'article\')</code></pre>\n<h2>官方文档:</h2>\n<blockquote>\n<p><a href="https://laravel-breadcrumbs.readthedocs.io/en/latest/">https://laravel-breadcrumbs.readthedocs.io/en/latest/</a></p>\n</blockquote>', '## 安装\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使用代码实例,包括扩展验证方法/定义验证详解/获取错误信息', '<h2>扩展</h2>\n<pre><code>// 扩展验证方法\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\'=&gt;\'required|valid_code\',\n]);\n// code.valid_code 若错误返回信息"编号不符合 2017 年的要求"</code></pre>\n<h2>定义验证详解</h2>\n<pre><code>$validatorStatus = $validator-&gt;passes(); //(bool)执行验证并返回是否验证成功\n$validatorErrors = $validator-&gt;errors()-&gt;all();//(array)返回获得的错误信息数组\nif(!$validatorStatus){\n return redirect(\'login\')\n -&gt;withErrors($validatorErrors)\n -&gt;withInput();\n}</code></pre>\n<h2>验证与获取结果</h2>\n<pre><code>$validator = Validator::make($input,[\n \'code\'=&gt;\'required|captcha\',\n],[\n \'code.captcha\'=&gt;\'The :attribute is invalid .\'\n],[\n \'code\'=&gt;\'code of captcha\'\n]);\n// The code of captcha is invalid .</code></pre>\n<p><code>Validator::make($rules,$messages,$customAttributes)</code> </p>\n<ul>\n<li>rules: 定义验证规则 </li>\n<li>messages: 定义错误信息 </li>\n<li>customAttributes: 定义字段别名用于替换错误信息中的<code>:attribute</code>. </li>\n</ul>\n<p>若验证失败返回错误信息为<code>The code of captcha is invalid .</code><br />\n不定义customAttributes错误信息为<code>The code is invalid .</code> </p>', '## 扩展\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登陆授权接口全部接口的详细参数和说明', '<h2>请求授权</h2>\n<p>请求:\n<code>https://graph.qq.com/oauth/show</code></p>\n<table>\n<thead>\n<tr>\n<th>参数:\n参数</th>\n<th>说明</th>\n<th>示例</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>which</td>\n<td>默认</td>\n<td>Login</td>\n</tr>\n<tr>\n<td>response_type</td>\n<td>默认</td>\n<td>code</td>\n</tr>\n<tr>\n<td>display</td>\n<td>pc或mobile</td>\n<td>pc</td>\n</tr>\n<tr>\n<td>client_id</td>\n<td>APP ID</td>\n<td>10*****39</td>\n</tr>\n<tr>\n<td>state</td>\n<td><code>md5(uniqid(rand(), TRUE))</code> 防止csrf</td>\n<td>8f7895bf4ad032d6e2e52426987bda97</td>\n</tr>\n<tr>\n<td>scope</td>\n<td><code>urlencode</code> 授权范围</td>\n<td>get_user_info,get_simple_userinfo</td>\n</tr>\n<tr>\n<td>redirect_uri</td>\n<td><code>urlencode</code> 跳转地址</td>\n<td>网站回调域,需提前配置</td>\n</tr>\n</tbody>\n</table>\n<p>示例:\n<code>https://graph.qq.com/oauth/show?which=Login&amp;display=pc&amp;response_type=code&amp;client_id=10*****39&amp;redirect_uri=http%3A%2F%2Fdemo.xcxxkj.site%2Fqq%2Fexample%2Foauth%2Fcallback.php&amp;state=8f7895bf4ad032d6e2e52426987bda97&amp;scope=get_user_info%2Cget_simple_userinfo</code></p>\n<p>回跳:\n<code>http://www.kukj.cn/demo/qq/example/oauth/callback.php?code=3E3216BECE904A02ADA9CC93B9C7CDBB&amp;state=9f72c202b5b9ca8eaa4f10afa61113f2</code> </p>\n<hr />\n<h2>Access_Token</h2>\n<p>请求:\nPC网站:<code>https://graph.qq.com/oauth2.0/token</code>\nWAP网站:<code>https://graph.z.qq.com/moc2/token</code> </p>\n<table>\n<thead>\n<tr>\n<th>参数:\n参数</th>\n<th>说明</th>\n<th>示例</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>grant_type</td>\n<td>默认</td>\n<td>authorization_code</td>\n</tr>\n<tr>\n<td>client_id</td>\n<td>APP ID</td>\n<td>10*****39</td>\n</tr>\n<tr>\n<td>client_secret</td>\n<td>APP Key</td>\n<td>7f2e1a89<strong><strong><strong>****</strong></strong></strong>faeb4a74</td>\n</tr>\n<tr>\n<td>code</td>\n<td>授权返回</td>\n<td>3E3216BECE904A02ADA9CC93B9C7CDBB</td>\n</tr>\n<tr>\n<td>state</td>\n<td>请求授权时带的</td>\n<td>9f72c202b5b9ca8eaa4f10afa61113f2</td>\n</tr>\n</tbody>\n</table>\n<p>示例:\n<code>https://graph.qq.com/oauth2.0/token?grant_type=authorization_code&amp;client_id=10*****39&amp;client_secret=7f2e1a89****************faeb4a74&amp;code=3E3216BECE904A02ADA9CC93B9C7CDBB&amp;state=9f72c202b5b9ca8eaa4f10afa61113f2</code></p>\n<p>返回: </p>\n<pre><code>access_token=87BE06D456*************C0EC87084&amp;expires_in=7776000&amp;refresh_token=BC2DE1161086B21864FF704B8358AC47</code></pre>\n<p>错误: </p>\n<pre><code>callback( {"error":100010,"error_description":"redirect uri is illegal"} );</code></pre>\n<hr />\n<h2>Openid</h2>\n<p>示例:\n<code>https://graph.qq.com/oauth2.0/me?access_token=87BE06D456*************C0EC87084</code> </p>\n<p>正确</p>\n<pre><code>callback( {"client_id":"10*****39","openid":"562CE8D66427**************5FBA6D"} );</code></pre>\n<p>错误</p>\n<pre><code>callback( {"error":100016,"error_description":"access token check failed"} );</code></pre>\n<hr />\n<h2>获取用户资料</h2>\n<p>地址:\n<code>https://graph.qq.com/user/get_user_info</code></p>\n<table>\n<thead>\n<tr>\n<th>参数:\n参数</th>\n<th>说明</th>\n<th>示例</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>access_token</td>\n<td>授权请求获得,3个月有效期</td>\n<td>87BE06D456*<strong><strong>****</strong></strong>C0EC87084</td>\n</tr>\n<tr>\n<td>openid</td>\n<td>唯一标识得</td>\n<td>562CE8D66427<strong><strong><strong>**</strong></strong></strong>5FBA6D</td>\n</tr>\n<tr>\n<td>oauth_consumer_key</td>\n<td>APP ID</td>\n<td>10*****39</td>\n</tr>\n</tbody>\n</table>\n<p>示例:\n<code>https://graph.qq.com/user/get_user_info?oauth_consumer_key=10*****39&amp;access_token=87BE06D456*************C0EC87084&amp;openid=562CE8D66427**************5FBA6D</code></p>\n<p>返回: </p>\n<pre><code>{\n "ret": 0,\n "msg": "",\n "is_lost":0,\n "nickname": "悠悠山雨",\n "gender": "男",\n "province": "上海",\n "city": "徐汇区",\n "year": "1980",\n "figureurl": "http://qzapp.qlogo.cn/qzapp/10*****39/562CE8D66427**************5FBA6D/30",\n "figureurl_1": "http://qzapp.qlogo.cn/qzapp/10*****39/562CE8D66427**************5FBA6D/50",\n "figureurl_2": "http://qzapp.qlogo.cn/qzapp/10*****39/562CE8D66427**************5FBA6D/100",\n "figureurl_qq_1": "http://q.qlogo.cn/qqapp/10*****39/562CE8D66427**************5FBA6D/40",\n "figureurl_qq_2": "http://q.qlogo.cn/qqapp/10*****39/562CE8D66427**************5FBA6D/100",\n "is_yellow_vip": "0",\n "vip": "0",\n "yellow_vip_level": "0",\n "level": "0",\n "is_yellow_year_vip": "0"\n}</code></pre>\n<p>错误: </p>\n<pre><code>{"ret":100008,"msg":"client request\'s app is not existed"}</code></pre>\n<hr />\n<h2>文档</h2>\n<p>错误码解释: </p>\n<blockquote>\n<p><a href="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">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</a></p>\n</blockquote>\n<p>图标素材</p>\n<blockquote>\n<p><a href="http://wiki.connect.qq.com/%E8%A7%86%E8%A7%89%E7%B4%A0%E6%9D%90%E4%B8%8B%E8%BD%BD">http://wiki.connect.qq.com/%E8%A7%86%E8%A7%89%E7%B4%A0%E6%9D%90%E4%B8%8B%E8%BD%BD</a></p>\n</blockquote>\n<p>QQ互联</p>\n<blockquote>\n<p><a href="https://connect.qq.com">https://connect.qq.com</a></p>\n</blockquote>\n<p>SDK</p>\n<blockquote>\n<p><a href="http://wiki.connect.qq.com/sdk%E4%B8%8B%E8%BD%BD">http://wiki.connect.qq.com/sdk%E4%B8%8B%E8%BD%BD</a></p>\n</blockquote>\n<p>API调试</p>\n<blockquote>\n<p><a href="http://connect.qq.com/sdk/webtools/index.html#get_user_info">http://connect.qq.com/sdk/webtools/index.html#get_user_info</a></p>\n</blockquote>\n<p>流程</p>\n<blockquote>\n<p><a href="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">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</a></p>\n</blockquote>', '## 请求授权\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地址是否正确,判断文件后缀是否符合,判断目录是否可写,判断文件是否已存在', '<h3>抓取远程图片流程</h3>\n<ul>\n<li>判断URL地址是否正确</li>\n<li>判断文件后缀是否符合</li>\n<li>判断目录是否可写</li>\n<li>判断文件是否已存在</li>\n</ul>\n<h3>远程图片</h3>\n<pre><code class="language-php">$url = \'https://ss1.bdstatic.com/70cFvXSh_Q1YnxGkpoWK1HF6hhy/it/u=2206535334,3323223263&amp;fm=27&amp;gp=0.jpg\';\n$store = __DIR__.\'/uploads/\'.basename($url);\n\n// 判断链接是否有效\n$headers = get_headers($url,1);\nif (!(stristr($headers[0], "200") &amp;&amp; stristr($headers[0], "OK"))){\n exit("链接失效: {$url}");\n}</code></pre>\n<h4>file_get_content方式</h4>\n<pre><code class="language-php">file_put_contents($store, file_get_contents($url));</code></pre>\n<h4>curl方式</h4>\n<pre><code class="language-php">$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);</code></pre>\n<h4>stream方式</h4>\n<pre><code class="language-php">ob_start();\n$context = stream_context_create(\n array(\'http\' =&gt; array(\n \'follow_location\' =&gt; false\n ))\n);\nreadfile($url, false, $context);\n$img = ob_get_contents();\nob_end_clean();\nfile_put_contents($store, $img);</code></pre>\n<h3>工具函数</h3>\n<pre><code class="language-php">function getfileTypeByMimeType($type)\n{\n $mimeType = [\n \'.xml\' =&gt; \'application/xml,text/xml,application/x-xml\',\n \'.json\' =&gt; \'application/json,text/x-json,application/jsonrequest,text/json\',\n \'.js\' =&gt; \'text/javascript,application/javascript,application/x-javascript\',\n \'.css\' =&gt; \'text/css\',\n \'.rss\' =&gt; \'application/rss+xml\',\n \'.yaml\' =&gt; \'application/x-yaml,text/yaml\',\n \'.atom\' =&gt; \'application/atom+xml\',\n \'.pdf\' =&gt; \'application/pdf\',\n \'.txt\' =&gt; \'text/plain\',\n \'.png\' =&gt; \'image/png\',\n \'.jpg\' =&gt; \'image/jpg,image/jpeg,image/pjpeg\',\n \'.gif\' =&gt; \'image/gif\',\n \'.csv\' =&gt; \'text/csv\',\n \'.html\' =&gt; \'text/html,application/xhtml+xml,*/*\',\n \'.webp\' =&gt; \'image/webp\',\n ];\n foreach ($mimeType as $key =&gt; $val) {\n $_types = explode(\',\', $val);\n if(in_array($type, $_types)) return $key;\n }\n return false;\n}</code></pre>', '### 抓取远程图片流程\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');
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )