推荐文章

yii2 console MySQL server

html

yii2 console MySQL server has gone away经过我的不屑努力和研究终于得到解决方案<?phpnamespace common\lib;class Command extends \yii\db\Command{ public function execute() { try { return parent::execute(); } catch (\yii\db\Exception $e) { if ($e->errorInfo[1] == 2006 || $e->errorInfo[1] == 2013) { $this->db->close(); $this->db->open(); $this->pdoStatement = null ; return parent::execute(); }else{ throw $e; } } } protected function queryInternal($method, $fetchMode = null){ try { return parent::queryInternal($method, $fetchMode); } catch (\yii\db\Exception $e) { if ($e->errorInfo[1] == 2006 || $e->errorInfo[1] == 2013) { $this->db->close(); $this->db->open(); $this->pdoStatement = null ; return parent::queryInternal($method, $fetchMode); }else{ throw $e; } } }}'db' => [ 'class' => 'yii\db\Connection', 'dsn' => 'mysql:host='.$db_config['host'].';dbname='.$db_config['dbname'], 'username' => $db_config['username'], 'password' => $db_config['password'], 'charset' => 'utf8', 'commandClass'=>"\\common\\lib\\Command", //<==注意这里要替换],<!--more-->

18

2018/09

Yii2 ElasticSearch的使用

html

Yii2 ElasticSearch的使用Yii2 elasticSearch – 配置配置部分如下:'elasticsearch' => [ 'class' => 'yii\elasticsearch\Connection', 'nodes' => [ ['http_address' => '192.168.0.199:9200'], ['http_address' => '192.168.0.210:9200'], ], ],您配置了es的集群,那么需要在http_address中把每一个节点的ip都要配置上,我只有两个节点,那么,我只写了两个IP。这样就完成了在Yii2中es的配置。 <!--more-->yii2 elasticSearch - model<?phpnamespace flow\models\elasticsearch;use \yii\elasticsearch\ActiveRecord;class IndexElasticSearch extends ActiveRecord{ public static $indexIndex; public $_dbName; public static function getDb() { return \Yii::$app->get('elasticsearch'); } /** * Description: 定义字段映射的方法 * Author: JiaMeng <666@majiameng.com> * Updater: * @param $data */ public function map($data){ foreach($data as $k=>$v){ if(in_array($k,$this->attributes())){ $this->$k = $v; } } } //db public static function index() { return 'index'; } //table public static function type() { return 'index'; } // 属性 public function attributes() { $mapConfig = self::mapConfig(); return array_keys($mapConfig['properties']); } // mapping配置 public static function mapConfig(){ return [ 'properties' => [ 'id' => ['type' => 'integer', "index" => true], 'title' => ['type' => 'text', "index" => true,"analyzer"=>'ik_max_word','search_analyzer'=>'ik_max_word'],//ik中文分词 'type' => ['type' => 'integer', "index" => true], 'inputtime' => ['type' => 'integer', "index" => true],//文章创建时间 'updatetime' => ['type' => 'integer', "index" => true],//文章更新时间 'content' => ['type' => 'text',"index" => true,"analyzer"=>'ik_max_word','search_analyzer'=>'ik_max_word'],//文章内容 'other' => ['type' => 'text',"index" => false],//'"index" => false' 不进行分词 ] ]; } public static function mapping() { return [ static::type() => self::mapConfig(), ]; } /** * Set (update) mappings for this model */ public static function updateMapping(){ $db = self::getDb(); $command = $db->createCommand(); if(!$command->indexExists(self::index())){ $command->createIndex(self::index()); } $command->setMapping(self::index(), self::type(), self::mapping()); } public static function getMapping(){ $db = self::getDb(); $command = $db->createCommand(); return $command->getMapping(); } /** * Description: 保存数据 * Author: JiaMeng <666@majiameng.com> * Updater: * @param $params * @return self */ static public function edit($params){ /** 查询当前id是否被被使用 */ $id = $params['type'].'_'.$params['id']; $query = [ "match" => [ '_id' => $id ] ]; $elastic = self::find()->query($query)->one(); if(empty($elastic)){ /** 添加数据 */ $elastic = new self(); $elastic->primaryKey = $id; } $elastic->map($params); if(!$elastic->save()){ echo array_values($askimg->firstErrors)[0]; } return $elastic; }}yii2 elasticSearch - search搜索 $must = []; //根据keyword搜索关键词 if(!empty($keyword)){ $must[] = [ "multi_match" => [//分词多字段搜索 'query' => $keyword, 'fields' => ['title','comments'],//搜索的字段 ], ]; } //根据type精确搜索 if(!empty($type)){ $must[] = [ "term" => [ 'type' => $type ] ] } //根据多条id精确搜索(类似于mysql的in) $ids = [1,2,3,4]; if(!empty($ids)){ $must[] = [ "terms" => [ 'id' => $ids ] ] } $query = [ 'bool'=>[ 'must'=>$must ], ]; $this->page = 1; $this->pageSize = 10; $searchModel = IndexElasticSearch::find() ->query($query); $elastic = $searchModel ->orderBy('id desc') ->offset(($this->page-1)*$this->pageSize) ->limit($this->page*$this->pageSize) ->asArray()->all(); return $elastic;1.清除ElasticSearch所有数据curl -v -X DELETE http://127.0.0.1:9200/_all

17

2018/08

ffmpeg生成视频缩略图

html

php使用ffmpeg生成视频缩略图/** * Name: ffmpeg.php. * Author: JiaMeng <666@majiameng.com> * Date: 2018/7/12 14:39 * Description: ffmpeg.php. */class ffmpeg{ const FFMPEG_COVER_COMMAND = '/usr/local/ffmpeg/bin/ffmpeg -i "%s" -y -f mjpeg -ss %s -t 0.001 -s "%s" "%s"';//获取视频封面 /** * Description: 获取视频封面 * Author: JiaMeng <666@majiameng.com> * @param string $file 视频文件路径 * @param string $videoCoverName 生成的封面文件路径 * @param string $resolution 分辨率 * @param int $time 截取封面图的开始时间 * @return bool */ static public function getVideoCover($file,$videoCoverName,$resolution='320x240',$time=1){ $command = sprintf(self::FFMPEG_COVER_COMMAND, $file,$time,$resolution,$videoCoverName); exec($command.' 2>&1 ',$output, $status); if($status == 0){ return true;//生成成功 } echo '生成视频封面:请检查文件上传目录权限,error:'.implode(',',$output));//输出异常 }<!--more-->

13

2018/07

ffmpeg获取视频信息

html

php使用ffmpeg获取视频信息可以获取到视频的分辨率、文件大小、播放时长、编码格式、视频格式、音频编码、音频采样频率、等…..废话不多说,直接上代码…<!--more-->/** * Name: ffmpeg.php. * Author: JiaMeng <666@majiameng.com> * Date: 2018/7/12 14:39 * Description: ffmpeg.php. */class ffmpeg{ const FFMPEG_COMMAND = '/usr/local/ffmpeg/bin/ffmpeg -i %s 2>&1';//操作ffmpeg命令 /** * Description: 获取视频信息 * Author: JiaMeng <666@majiameng.com> * @param string $file 视频文件路径 * @return array */ static function video_info($file) { /** 通过使用输出缓冲,获取到ffmpeg所有输出的内容 */ ob_start(); passthru(sprintf(self::FFMPEG_COMMAND, $file)); $info = ob_get_contents(); ob_end_clean(); $result = array(); // Duration: 01:24:12.73, start: 0.000000, bitrate: 456 kb/s if (preg_match("/Duration: (.*?), start: (.*?), bitrate: (\d*) kb\/s/", $info, $match)) { $result['duration'] = $match[1]; // 提取出播放时间 $da = explode(':', $match[1]); $result['seconds'] = $da[0] * 3600 + $da[1] * 60 + $da[2]; // 转换为秒 $result['start'] = $match[2]; // 开始时间 $result['bitrate'] = $match[3]; // bitrate 码率 单位 kb } // Stream #0.1: Video: rv40, yuv420p, 512x384, 355 kb/s, 12.05 fps, 12 tbr, 1k tbn, 12 tbc if (preg_match("/Video: (.*?), (.*?), (.*?), (.*?)[,\s]/", $info, $match)) { $result['vcodec'] = $match[1]; // 编码格式 $result['vformat'] = $match[2]; // 视频格式 $result['resolution'] = $match[3]; // 分辨率 if(strpos($result['resolution'],'x') === false){ // Stream #0:0(und): Video: h264 (Constrained Baseline) (avc1 / 0x31637661), yuv420p(tv, smpte170m/smpte170m/bt709), 320x240, 80 kb/s, 29.65 fps, 29.97 tbr, 90k tbn, 59.31 tbc (default) $result['resolution'] = $match[4]; // 分辨率 } $a = explode('x', $result['resolution']); $result['width'] = $a[0]; $result['height'] = $a[1]; } // Stream #0.0: Audio: cook, 44100 Hz, stereo, s16, 96 kb/s if (preg_match("/Audio: (\w*), (\d*) Hz/", $info, $match)) { $result['acodec'] = $match[1]; // 音频编码 $result['asamplerate'] = $match[2]; // 音频采样频率 } if (isset($result['seconds']) && isset($result['start'])) { $result['play_time'] = $result['seconds'] + $result['start']; // 实际播放时间 } $result['size'] = filesize($file); // 文件大小 return $result; }}怎么用这个类就不用我说了把

12

2018/07

Idea (phpstorm) 配置 svn

html

Idea 配置 svn安装了phpstorm之后,想配置svn,结果在file->settings->Version Contorl->subversion->with conmand line client配置成D:\Program Files\TortoiseSVN\bin\tortoisePro.exe(一般的svn程序文件)已经安装的路径地址之后,一直提示“Can’t use Subversion command line client: ‘D:\Program Files\TortoiseSVN\bin\tortoisePro.exe‘ Probably the path to Subversion executable is wrong. Fix it.”.然后google search一下,才发现这个tortoisePro.exe是guide操作程序,不支持conmand line操作,需要重新下载一个http://www.jetbrains.com/phpstorm/webhelp/using-subversion-integration.html然后我选择了这个下载slikSVN下载http://subversion.apache.org/packages.html#windows下载完了之后就一直按下一步安装即可,作者安装在了 D:\Program Files\SlikSvn所以呢,在with conmand line client设置成你的D:\Program Files\SlikSvn\bin\svn.exe即可使用svn了。

29

2017/12

MengPHP后台管理系统 1.0.0

html

MengPHP后台管理系统 1.0.0MengPHP 基于ThinkPHP5+layui开发的一套开源PHP快速开发框架,默认集成了权限管理、模块管理、插件管理、钩子管理、数据库管理等常用功能,以方便开发者快速构建自己的应用,我们在发布第一个版本就为您集成了一键升级框架的功能,扩展的模块、插件、模板均可独立在线升级。为了让您开发的应用获得更多的使用者,MengPHP在发布之初就上线了PHP应用市场(http://majiameng.com),我们诚邀您的加入。目录结构www WEB部署目录(或者子目录)├─app 应用目录│ ├─admin 系统模块目录│ ├─common 系统公共模块目录│ │ ├─behavior 行为目录│ │ ├─controller 公共模块控制器目录│ │ ├─lang 公共模块语言包目录│ │ ├─model 公共模型目录│ │ ├─util 扩展类库目录│ │ ├─validate 公共验证器目录│ ├─extra 扩展配置目录│ ├─index 前台默认模块目录(禁止在此目录下开发)│ ├─install 系统安装目录│ ├─command.php 命令行工具配置文件│ ├─common.php 公共(函数)文件│ ├─function.php 为方便系统升级,二次开发中用到的公共函数请写在此文件│ ├─config.php 应用(公共)配置文件│ ├─database.php 数据库配置文件(安装时自动生成)│ ├─route.php 路由配置文件│ ├─tags.php 应用行为扩展定义文件├─extend 扩展类库目录├─backup 备份目录(数据库、升级文件)├─static 静态资源目录(后台用)├─thinkphp ThinkPHP核心框架目录├─upload 文件上传目录├─vendor 第三方类库目录(Composer)├─composer.json Composer json文件├─admin.php 后台管理入口文件├─index.php 首页入口文件├─LICENSE.txt Apache2开源协议├─.htaccess 伪静态配置文件├─robots.txt 爬虫协议├─version.php 系统版本文件<!--more-->命名规范ThinkPHP遵循PSR-2命名规范和PSR-4自动加载规范,并且注意如下规范:目录和文件目录不强制规范,驼峰和小写+下划线模式均支持;类库、函数文件统一以.php为后缀;类的文件名均以命名空间定义,并且命名空间的路径和类库文件所在路径一致;类名和类文件名保持一致,统一采用驼峰法命名(首字母大写);函数和类、属性命名类的命名采用驼峰法,并且首字母大写,例如 User、UserType,默认不需要添加后缀,例如UserController应该直接命名为User;函数的命名使用小写字母和下划线(小写字母开头)的方式,例如 get_client_ip;方法的命名使用驼峰法,并且首字母小写,例如 getUserName;属性的命名使用驼峰法,并且首字母小写,例如 tableName、instance;以双下划线“”打头的函数或方法作为魔法方法,例如 `call和__autoload`;常量和配置常量以大写字母和下划线命名,例如 APP_PATH和 THINK_PATH;配置参数以小写字母和下划线命名,例如 url_route_on 和url_convert;数据表和字段数据表和字段采用小写加下划线方式命名,并注意字段名不要以下划线开头,例如 think_user 表和 user_name字段,不建议使用驼峰和中文作为数据表字段命名。参与开发请参阅 MengPhp 核心框架包。版权信息MengPhp遵循Apache2开源协议发布,并提供免费使用。本项目包含的第三方源码和二进制文件之版权信息另行标注。版权所有Copyright © 2016-2017 by MengPhpAll rights reserved。

01

2017/11

中高级PHP程序员应该掌握哪些技术?

html

本文把php程序员划分为中、高级程序员两大类程序员,并针对这两大程序员应具备的技能进行分类探索。中级PHP程序员1.Linux 能够流畅的使用Shell脚本来完成很多自动化的工作;awk/sed/perl 也操作的不错,能够完成很多文本处理和数据统计等工作;基本能够安装大 部分非特殊的Linux程序(包括各种库、包、第三方依赖等等,比如MongoDB/Redis/Sphinx/Luncene/SVN之类的);了解基 本的Linux服务,知道如何查看Linux的性能指标数据,知道基本的Linux下面的问题跟踪等 2. Nginx: 在第一阶段的基础上面,了解复杂一些的Nginx配置;包括多核配置、events、proxypass,sendfile/tcp*配置,知道超 时等相关配置和性能影响;知道nginx除了web server,还能够承担代理服务器、反向静态服务器等配置;知道基本的nginx配置调优;知道如 何配置权限、编译一个nginx扩展到nginx;知道基本的nginx运行原理(master/worker机制,epoll),知道为什么nginx 性能比apache性能好等知识; <!--more-->3. MySQL/MongoDB: 在第一阶段的基础上面,在MySQL开发方面,掌握很多小技巧,包括常规SQL优化(group by/order by/rand优化等);除了能够搭 建MySQL,还能够冷热备份MySQL数据,还知道影响innodb/myisam性能的配置选项(比如key_buffer/query_cache /sort_buffer/innodb_buffer_pool_size/innodb_flush_log_at_trx_commit等),也知 道这些选项配置成为多少值合适;另外也了解一些特殊的配置选项,比如 知道如何搭建mysql主从同步的环境,知道各个binlog_format的区 别;知道MySQL的性能追查,包括slow_log/explain等,还能够知道基本的索引建立处理等知识;原理方面了解基本的MySQL的架构 (Server+存储引擎),知道基本的InnoDB/MyISAM索引存储结构和不同(聚簇索引,B树);知道基本的InnoDB事务处理机制;了解大 部分MySQL异常情况的处理方案(或者知道哪儿找到处理方案)。条件允许的情况,建议了解一下NoSQL的代表MongoDB数据库,顺便对比跟 MySQL的差别,同事能够在合适的应用场景安全谨慎的使用MongoDB,知道基本的PHP与MongoDB的结合开发。4. Redis/Memcached: 在大部分中型系统里面一定会涉及到缓存处理,所以一定要了解基本的缓存;知道Memcached和Redis的异同和应用场景,能够独立安 装 Redis/Memcached,了解Memcahed的一些基本特性和限制,比如最大的value值,知道PHP跟他们的使用结合;Redis了解 基本工作原理和使用,了解常规的数据类型,知道什么场景应用什么类型,了解Redis的事务等等。原理部分,能够大概了解Memcached的内存结构 (slab机制),redis就了解常用数据类型底层实现存储结构(SDS/链表/SkipList/HashTable)等等,顺便了解一下Redis 的事务、RDB、AOF等机制更好5. PHP: 除了第一阶段的能力,安装配置方面能够随意安装PHP和各种第三方扩展的编译安装配置;了解php-fpm的大部分配置选项和含义(如 max_requests/max_children/request_terminate_timeout之类的影响性能的配置),知道mod_php /fastcgi的区别;在PHP方面已经能够熟练各种基础技术,还包括各种深入些的PHP,包括对PHP面向对象的深入理解/SPL/语法层面的特殊特 性比如反射之类的;在框架方面已经阅读过最少一个以上常规PHP MVC框架的代码了,知道基本PHP框架内部实现机制和设计思想;在PHP开发中已经能 够熟练使用常规的设计模式来应用开发(抽象工厂/单例/观察者/命令链/策略/适配器 等模式);建议开发自己的PHP MVC框架来充分让开发自由化, 让自己深入理解MVC模式,也让自己能够在业务项目开发里快速升级;熟悉PHP的各种代码优化方法,熟悉大部分PHP安全方面问题的解决处理;熟悉基本的 PHP执行的机制原理(Zend引擎/扩展基本工作机制);6. 系统设计: 能够设计大部分中型系统的网站架构、数据库、基本PHP框架选型;性能测试排查处理等;能够完成类似:浏览 器 -> CDN(Squid) -> Nginx+PHP -> 缓存 -> 数据库 结构网站的基本设计开发维护;能够支撑 每天数百万到千万流量基本网站的开发维护工作; 高级PHP程序员 重点:除了基本的LNMP程序,还能够在某个方向或领域有深入学习。(纵深维度发展) 目标:除了能够完成基本的PHP业务开发,还能够解决大部分深入复杂的技术问题,并且可以独立设计完成中大型的系统设计和开发工作;自己能够独立hold深入某个技术方向,在这块比较专业。(比如在MySQL、Nginx、PHP、Redis等等任一方向深入研究)1. Linux: 除了第二阶段的能力,在Linux下面除了常规的操作和性能监控跟踪,还能够使用很多高级复杂的命令完成工作(watch/tcpdump/starce /ldd/ar等);在shell脚本方面,已经能够编写比较复杂的shell脚本(超过500行)来协助完成很多包括备份、自动化处理、监控等工作的 shell;对awk/sed/perl 等应用已经如火纯青,能够随意操作控制处理文本统计分析各种复杂格式的数据;对Linux内部机制有一些了解, 对内核模块加载,启动错误处理等等有个基本的处理;同时对一些其他相关的东西也了解,比如NFS、磁盘管理等等;2. Nginx: 在第二阶段的基础上面,已经能够把Nginx操作的很熟练,能够对Nginx进行更深入的运维工作,比如监控、性能优化,复杂问题处理等等;看个人兴趣, 更多方面可以考虑侧重在关于Nginx工作原理部分的深入学习,主要表现在阅读源码开始,比如具体的master/worker工作机制,Nginx内部 的事件处理,内存管理等等;同时可以学习Nginx扩展的开发,可以定制一些自己私有的扩展;同时可以对Nginx+Lua有一定程度的了解,看看是否可 以结合应用出更好模式;这个阶段的要求是对Nginx原理的深入理解,可以考虑成为Nginx方向的深入专业者。3. MySQL/MongoDB: 在第二阶段的基础上面,在MySQL应用方面,除了之前的基本SQL优化,还能够在完成一些复杂操作,比如大批量数据的导入导出,线上大批量数据的更改表 结构或者增删索引字段等等高危操作;除了安装配置,已经能够处理更多复杂的MySQL的问题,比如各种问题的追查,主从同步延迟问题的解决、跨机房同步数 据方案、MySQL高可用架构等都有涉及了解;对MySQL应用层面,对MySQL的核心关键技术比较熟悉,比如事务机制(隔离级别、锁等)、对触发器、 分区等技术有一定了解和应用;对MySQL性能方面,有包括磁盘优化(SAS迁移到SSD)、服务器优化(内存、服务器本身配置)、除了二阶段的其他核心 性能优化选项(innodb_log_buffer_size/back_log/table_open_cache /thread_cache_size/innodb_lock_wait_timeout等)、连接池软件选择应用,对show * (show status/show profile)类的操作语句有深入了解,能够完成大部分的性能问题追查;MySQL备份技术的深入熟悉,包括灾备 还原、对Binlog的深入理解,冷热备份,多IDC备份等;在MySQL原理方面,有更多了解,比如对MySQL的工作机制开始阅读部分源码,比如对主 从同步(复制)技术的源码学习,或者对某个存储引擎(MyISAM/Innodb/TokuDB)等等的源码学习理解,如果条件允许,可以参考CSV引擎 开发自己简单的存储引擎来保存一些数据,增强对MySQL的理解;在这个过程,如果自己有兴趣,也可以考虑往DBA方向发展。MongoDB层面,可以考 虑比如说在写少读多的情况开始在线上应用MongoDB,或者是做一些线上的数据分析处理的操作,具体场景可以按照工作来,不过核心是要更好的深入理解 RMDBS和NoSQL的不同场景下面的应用,如果条件或者兴趣允许,可以开始深入学习一下MongoDB的工作机制。 4. Redis/Memcached: 在第二阶段的基础上面,能够更深入的应用和学习。因为Memcached不是特别复杂,建议可以把源码进行阅读,特别是内存管理部分,方便深入理 解;Redis部分,可以多做一些复杂的数据结构的应用(zset来做排行榜排序操作/事务处理用来保证原子性在秒杀类场景应用之类的使用操作);多涉及 aof等同步机制的学习应用,设计一个高可用的Redis应用架构和集群;建议可以深入的学习一下Redis的源码,把在第二阶段积累的知识都可以应用 上,特别可以阅读一下包括核心事件管理、内存管理、内部核心数据结构等充分学习了解一下。如果兴趣允许,可以成为一个Redis方面非常专业的使用者。5. PHP: 作为基础核心技能,我们在第二阶段的基础上面,需要有更深入的学习和应用。从基本代码应用上面来说,能够解决在PHP开发中遇到95%的问题,了解大部分 PHP的技巧;对大部分的PHP框架能够迅速在一天内上手使用,并且了解各个主流PHP框架的优缺点,能够迅速方便项目开发中做技术选型;在配置方面,除 了常规第二阶段会的知识,会了解一些比较偏门的配置选项(php auto_prepend_file/auto_append_file),包括扩展中 的一些复杂高级配置和原理(比如memcached扩展配置中的memcache.hash_strategy、apc扩展配置中的 apc.mmap_file_mask/apc.slam_defense/apc.file_update_protection之类的);对php的 工作机制比较了解,包括php-fpm工作机制(比如php-fpm在不同配置机器下面开启进程数量计算以及原理),对zend引擎有基本熟悉 (vm/gc/stream处理),阅读过基本的PHP内核源码(或者阅读过相关文章),对PHP内部机制的大部分核心数据结构(基础类型/Array /Object)实现有了解,对于核心基础结构(zval/hashtable/gc)有深入学习了解;能够进行基本的PHP扩展开发,了解一些扩展开发 的中高级知识(minit/rinit等),熟悉php跟apache/nginx不同的通信交互方式细节(mod_php/fastcgi);除了开发 PHP扩展,可以考虑学习开发Zend扩展,从更底层去了解PHP。6. C/C++: 在第二阶段基础上面,能够在C/C++语言方面有更深入的学习了解,能够完成中小型C/C++系统的开发工作;除了基本第二阶段的基础C/C++语法和数 据结构,也能够学习一些特殊数据结构(b-tree/rb-tree/skiplist/lsm-tree/trie-tree等)方便在特殊工作中需 求;在系统编程方面,熟悉多进程、多线程编程;多进程情况下面了解大部分多进程之间的通信方式,能够灵活选择通信方式(共享内存/信号量/管道等);多线 程编程能够良好的解决锁冲突问题,并且能够进行多线程程序的开发调试工作;同时对网络编程比较熟悉,了解多进程模型/多线程模型/异步网络IO模型的差别 和选型,熟悉不同异步网络IO模型的原理和差异(select/poll/epoll/iocp等),并且熟悉常见的异步框架(ACE/ICE /libev/libevent/libuv/Boost.ASIO等)和使用,如果闲暇也可以看看一些国产自己开发的库(比如muduo);同时能够设 计好的高并发程序架构(leader-follow/master-worker等);了解大部分C/C++后端Server开发中的问题(内存管理、日 志打印、高并发、前后端通信协议、服务监控),知道各个后端服务RPC通信问题(struct/http/thirft/protobuf等);能够更熟 络的使用GCC和GDB来开发编译调试程序,在线上程序core掉后能够迅速追查跟踪解决问题;通用模块开发方面,可以积累或者开发一些通用的工具或库 (比如异步网络框架、日志库、内存池、线程池等),不过开发后是否应用要谨慎,省的埋坑去追bug;7. 前端: 深入了解HTTP协议(包括各个细致协议特殊协议代码和背后原因,比如302静态文件缓存了,502是nginx后面php挂了之类的);除了之前的前端 方面的各种框架应用整合能力,前端方面的学习如果有兴趣可以更深入,表现形式是,可以自己开发一些类似jQuery的前端框架,或者开发一个富文本编辑器 之类的比较琐碎考验JavaScript功力;8. 其他领域语言学习: 在基础的PHP/C/C++语言方面有基本积累,建议在当前阶段可以尝试学习不同的编程语言,看个人兴趣爱好,脚本类语言可以学学 Python /Ruby 之类的,函数式编程语言可以试试 Lisp/Haskell/Scala/Erlang 之类的,静态语言可以试试 Java /Golang,数据统计分析可以了解了解R语言,如果想换个视角做后端业务,可以试试 Node.js还有前面提到的跟Nginx结合的 Nginx_Lua等。学习不同的语言主要是提升自己的视野和解决问题手段的差异,比如会了解除了进程/线程,还有轻量级协程;比如在跨机器通信场景下 面,Erlang的解决方案简单的惊人;比如在不想选择C/C++的情况下,还有类似高效的Erlang/Golang可用等等;主要是提升视野。9. 其他专业方向学习: 在本阶段里面,会除了基本的LNMP技能之外,会考虑一些其他领域知识的学习,这些都是可以的,看个人兴趣和长期的目标方向。目前情况能够选择的领域比较 多,比如、云计算(分布式存储、分布式计算、虚拟机等),机器学习(数据挖掘、模式识别等,应用到统计、个性化推荐),自然语言处理(中文分词等),搜索 引擎技术、图形图像、语音识别等等。除了这些高大上的,也有很多偏工程方面可以学习的地方,比如高性能系统、移动开发(Android/IOS)、计算机 安全、嵌入式系统、硬件等方向。10. 系统设计: 系统设计在第二阶段的基础之上,能够应用掌握的经验技能,设计出比较复杂的中大型系统,能够解决大部分线上的各种复杂系统的问题,完成类似 浏览 器 -> CDN -> 负载均衡 ->接入层 -> Nginx+PHP -> 业务缓存 -> 数据 库 -> 各路复杂后端RPC交互(存储后端、逻辑后端、反作弊后端、外部服务) -> 更多后端 酱紫的复杂业务;能够支撑每天数千万到数 亿流量网站的正常开发维护工作。以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

20

2017/10

php安装ffmpeg扩展

html

title: ffmpeg-php扩展php视频缩略图,较常用的是ffmpeg-php1: 安装 ffmpegffmpeg的下载链接 http://ffmpeg.org/download.html解压安装包tar -jxvf ffmpeg-x.x.tar.bz2进入目录cd ffmpeg-x.x编译安装./configure --enable-shared --disable-yasm --prefix=/usr/local/ffmpeg && make && make install1.1动态链接库vim /etc/ld.so.conf加入:<code>/usr/local/ffmpeg/lib</code>执行ldconfig安装完成之后 执行 ffmpeg -version<!--more-->2 安装ffmpeg-php官方的下载链接https://sourceforge.net/projects/ffmpeg-php/files/ffmpeg-php/官方版本已经很久很久不更新了,我在centos 7 + php5.6&php7.1 centos6.5+php5 试了都不行。在configure完 make的时候会报错。后来在github上找了一个版本。在centos7.2+php5.5.6 上编译安装成功 (centos7 + php7.1还是不行)地址: git clone https://github.com/tony2001/ffmpeg-php.git 也可以访问我的百度云盘进行下载https://pan.baidu.com/s/1skQTVlj进入 ffmpeg-php目录 进行编译扩展/usr/local/php/bin/phpize ./configure —with-php-config=/usr/local/php/bin/php-configmake && make install注意(如果make之后出现错误,那就是ffmpeg-php版本的问题,别再折腾了,换版本吧(或者降低php版本试试))。在php的配置文件 php.ini中 添加 extension=ffmpeg.so重启php。在 phpinfo()中查看有无ffmpeg信息。或者执行 /usr/local/php/bin/php -i |grep ffmpeg要是有输出的话OK在没有的话就没有办法了,没错我就安装不上php的ffmpeg的扩展但是不影响我使用,我们可以使用exec命令来操作ffmpeg1.请看文章获取视频信息2.请看文章截取视频封面图

16

2017/05

PHP给源代码加密

html

虽说分享是传统的美德,但我们有时候辛辛苦苦写一些程序只是为了卖点小钱,挣点辛苦费,也防止有些没有道德的人倒卖,所以我们不得不对我们的程序进行加密,以下我们来介绍一下如何通过PHP的自定义函数来加密我们的PHP源代码。加密方法一:<!--more--><?php function encode_file_contents($filename) { $type=strtolower(substr(strrchr($filename,'.'),1)); if ('php' == $type && is_file($filename) && is_writable($filename)) { // 如果是PHP文件 并且可写 则进行压缩编码 $contents = file_get_contents($filename); // 判断文件是否已经被编码处理 $contents = php_strip_whitespace($filename); // 去除PHP头部和尾部标识 $headerPos = strpos($contents,'<?php'); $footerPos = strrpos($contents,'?>'); //文件内容必须有尾部?/> $contents = substr($contents, $headerPos + 5, $footerPos - $headerPos); $encode = base64_encode(gzdeflate($contents)); // 开始编码 $encode = '<?php'."\n eval(gzinflate(base64_decode("."'".$encode."'".")));\n\n?>"; return file_put_contents($filename, $encode); } return false; } //调用函数 $filename = 'demo.php'; encode_file_contents($filename); echo "OK,加密完成!" ?>加密方法二:<?php function RandAbc($length = "") { // 返回随机字符串 $str = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz"; return str_shuffle($str); } //加密算法 function encode_file_contents($filename){ $T_k1 = RandAbc(); //随机密匙1 $T_k2 = RandAbc(); //随机密匙2 $vstr = file_get_contents($filename); $v1 = base64_encode($vstr); $c = strtr($v1, $T_k1, $T_k2); //根据密匙替换对应字符。 $c = $T_k1.$T_k2.$c; $q1 = "O00O0O"; $q2 = "O0O000"; $q3 = "O0OO00"; $q4 = "OO0O00"; $q5 = "OO0000"; $q6 = "O00OO0"; $s = '$'.$q6.'=urldecode("%6E1%7A%62%2F%6D%615%5C%76%740%6928%2D%70%78%75%71%79%2A6%6C%72%6B%64%679%5F%65%68%63%73%77%6F4%2B%6637%6A");$'.$q1.'=$'.$q6.'{3}.$'.$q6.'{6}.$'.$q6.'{33}.$'.$q6.'{30};$'.$q3.'=$'.$q6.'{33}.$'.$q6.'{10}.$'.$q6.'{24}.$'.$q6.'{10}.$'.$q6.'{24};$'.$q4.'=$'.$q3.'{0}.$'.$q6.'{18}.$'.$q6.'{3}.$'.$q3.'{0}.$'.$q3.'{1}.$'.$q6.'{24};$'.$q5.'=$'.$q6.'{7}.$'.$q6.'{13};$'.$q1.'.=$'.$q6.'{22}.$'.$q6.'{36}.$'.$q6.'{29}.$'.$q6.'{26}.$'.$q6.'{30}.$'.$q6.'{32}.$'.$q6.'{35}.$'.$q6.'{26}.$'.$q6.'{30};eval($'.$q1.'("'.base64_encode('$'.$q2.'="'.$c.'";eval(\'?>\'.$'.$q1.'($'.$q3.'($'.$q4.'($'.$q2.',$'.$q5.'*2),$'.$q4.'($'.$q2.',$'.$q5.',$'.$q5.'),$'.$q4.'($'.$q2.',0,$'.$q5.'))));').'"));'; $s = '<?php '."\n".$s."\n".' ?>'; //echo $s; // 生成 加密后的PHP文件 $fpp1 = fopen('temp_'.$filename, 'w'); fwrite($fpp1, $s) or die('写文件错误'); } $filename = 'demo.php'; //要加密的文件 encode_file_contents($filename);?>看了这两种加密算法之后你会想,我的文件变成什么样子了呢,当然是别人看不懂啦,当然,你自己也看不懂!!!你可以试一下 文件还是可以照常执行的哦 不会出现问题的

16

2017/05

2017最新PHP经典面试题总结

html

2017最新PHP经典面试题总结1、双引号和单引号的区别双引号解释变量,单引号不解释变量双引号里插入单引号,其中单引号里如果有变量的话,变量解释双引号的变量名后面必须要有一个非数字、字母、下划线的特殊字符,或者用{}讲变量括起来,否则会将变量名后面的部分当做一个整体,引起语法错误双引号解释转义字符,单引号不解释转义字符,但是解释’\和\能使单引号字符尽量使用单引号,单引号的效率比双引号要高(因为双引号要先遍历一遍,判断里面有没有变量,然后再进行操作,而单引号则不需要判断)<!--more-->2、常用的超全局变量(8个)$_GET —–>get传送方式$POST —–>post传送方式$REQUEST —–>可以接收到get和post两种方式的值$GLOBALS —–>所有的变量都放在里面$FILE —–>上传文件使用$SERVER —–>系统环境变量$SESSION —–>会话控制的时候会用到$COOKIE —–>会话控制的时候会用到3、HTTP中POST、GET、PUT、DELETE方式的区别HTTP定义了与服务器交互的不同的方法,最基本的是POST、GET、PUT、DELETE,与其比不可少的URL的全称是资源描述符,我们可以这样理解:url描述了一个网络上资源,而post、get、put、delegate就是对这个资源进行增、删、改、查的操作!3.1表单中get和post提交方式的区别get是把参数数据队列加到提交表单的action属性所指的url中,值和表单内各个字段一一对应,从url中可以看到;post是通过HTTPPOST机制,将表单内各个字段与其内容防止在HTML的head中一起传送到action属性所指的url地址,用户看不到这个过程对于get方式,服务器端用Request.QueryString获取变量的值,对于post方式,服务器端用Request.Form获取提交的数据get传送的数据量较小,post传送的数据量较大,一般被默认不受限制,但在理论上,IIS4中最大量为80kb,IIS5中为1000k,get安全性非常低,post安全性较高3.2GET请求会向数据库发索取数据的请求,从而来获取信息,该请求就像数据库的select操作一样,只是用来查询一下数据,不会修改、增加数据,不会影响资源的内容,即该请求不会产生副作用。无论进行多少次操作,结果都是一样的。与GET不同的是,PUT请求是向服务器端发送数据的,从而改变信息,该请求就像数据库的update操作一样,用来修改数据的内容,但是不会增加数据的种类等,也就是说无论进行多少次PUT操作,其结果并没有不同。POST请求同PUT请求类似,都是向服务器端发送数据的,但是该请求会改变数据的种类等资源,就像数据库的insert操作一样,会创建新的内容。几乎目前所有的提交操作都是用POST请求的。DELETE请求顾名思义,就是用来删除某一个资源的,该请求就像数据库的delete操作。4、PHP介绍Hypertext Preprocessor—-超文本预处理器Personal Home Page 原始名称目标用途: 允许web开发人员快速编写动态生成的web页面,与其他页面相比,PHP是将程序嵌入到HTML文档中去执行,效率比完全生成HTML编辑的CGI高很多HTML: Hypertext Markup Language创始人: 拉姆斯勒·勒多夫Rasmus Lerdorf,1968年生,加拿大滑铁卢大学勒多夫最开始是为了维护个人网页,用prel语言写了维护程序,之后又用c进行了重写,最终衍生出php/fi时间轴:1995.06.08将PHP/FI公开释出1995 php2.0,加入了对MySQL的支持1997 php3.02000 php4.02008 php5.0由于php6.0没有完全解决Unicode编码,所以基本没有生产线上的应用,基本只是一款概念产品,很多功能已经在php5.3.3和php5.3.4上实现常见的IDE(Intergrated Development Environment): 集成开发环境Coda(mac)PHPStromAdobe DreamweaverNetBeans常见文本编辑器,具备代码高亮:NodePad++SublimeTextPHP优势PHP特性:php独特混合了C,Java,Prel以及PHP自创的语法可以比CGI或者Prel更快速去执行动态网页,与其他变成语言相比,PHP是讲程序嵌入到HTML文档中去执行,执行效率比完全生成HTML编辑的CGI要高很多,所有的CGI都能实现支持几乎所有流行的数据库以及操作系统PHP可以使用C,C++进行程序的扩展PHP优势:开放源代码免费性快捷性跨平台强效率高图形处理面向对象专业专注PHP技术应用:静态页面生成数据库缓存过程缓存div+css w3c标准大负荷分布式flex支持MVCSmarty模块引擎PHP认证级别初级 IFE:Index Front Engineer 前端工程师中级 IPE:Index PHP Engineer PHP工程师高级 IAE:Index Architecture Engineer 架构工程师6、echo、print_r、print、var_dump之间的区别* echo、print是php语句,var_dump和print_r是函数* echo 输出一个或多个字符串,中间以逗号隔开,没有返回值是语言结构而不是真正的函数,因此不能作为表达式的一部分使用* print也是php的一个关键字,有返回值 只能打印出简单类型变量的值(如int,string),如果字符串显示成功则返回true,否则返回false* print_r 可以打印出复杂类型变量的值(如数组、对象)以列表的形式显示,并以array、object开头,但print_r输出布尔值和NULL的结果没有意义,因为都是打印"\n",因此var_dump()函数更适合调试* var_dump() 判断一个变量的类型和长度,并输出变量的数值7、HTTP状态码点击这儿查看HTTP状态码详解常见的HTTP状态码:200 – 请求成功301 – 资源(网页等)被永久转义到其他URL404 – 请求的资源(网页等)不存在505 – 内部服务器错误HTTP状态码分类:1** – 信息,服务器收到的请求,需要请求者继续执行操作2** – 成功,操作被成功接收并处理3** – 重定向,需要进一步的操作以完成请求4** – 客户端错误,请求包含语法错误或者无法完成请求5** 服务器错误,服务器在处理请求的过程中发生了错误8、什么是魔术引号魔术引号是一个将自动将进入PHP脚本的数据进行转义的过程,最好在编码时不要转义而在运行时根据需要而转义9、如何获取客户端的ip(要求取得一个int)和服务器ip的代码客户端:$_SERVER["REMOTE_ADDR"];或者getenv('REMOTE_ADDR')ip2long进行转换服务器端:gethostbyname('[www.baidu.com](http://www.baidu.com)')10、使用那些工具进行版本控制cvs、svn、vss、git11、优化数据库的方法MySQL数据库优化的八大方式(经典必看)点击获取选取最适用的字段属性,尽可能减少定义字段宽度,尽量把字段设置NOTNULL,例如’省份’、’性别’最好适用ENUM使用连接(JOIN)来代替子查询适用联合(UNION)来代替手动创建的临时表事务处理锁定表、优化事务处理适用外键,优化锁定表建立索引优化查询语句12、是否使用过模板引擎?使用的模板引擎的名字是?Smarty:Smarty算是一种很老的PHP模板引擎了,它曾是我使用这门语言模板的最初选择。虽然它的更新已经不算频繁了,并且缺少新一代模板引擎所具有的部分特性,但是它仍然值得一看。13、对于大流量网站,采用什么方法来解决访问量的问题确认服务器硬件是否能够支持当前的流量数据库读写分离,优化数据表程序功能规则,禁止外部的盗链控制大文件的下载使用不同主机分流主要流量14、语句include和require的区别是什么?为避免多次包含同一文件,可以用(?)语句代替他们require是无条件包含,也就是如果一个流程里加入require,无论条件成立与否都会先执行require,当文件不存在或者无法打开的时候,会提示错误,并且会终止程序执行include有返回值,而require没有(可能因为如此require的速度比include快),如果被包含的文件不存在的化,那么会提示一个错误,但是程序会继续执行下去注意:包含文件不存在或者语法错误的时候require是致命的,而include不是require_once表示了只包含一次,避免了重复包含15、谈谈mvc的认识由模型、视图、控制器完成的应用程序,由模型发出要实现的功能到控制器,控制器接收组织功能传递给视图16、 说明php中传值与传引用的区别,并说明传值什么时候传引用?变量默认总是传值赋值,那也就是说,当将一个表达式的值赋予一个变量时,整个表达式的值被赋值到目标变量,这意味着:当一个变量的赋予另外一个变量时,改变其中一个变量的值,将不会影响到另外一个变量php也提供了另外一种方式给变量赋值:引用赋值。这意味着新的变量简单的引用(换言之,成为了其别名或者指向)了原始变量。改动的新的变量将影响到原始变量,反之亦然。使用引用赋值,简单地将一个&符号加到将要赋值的变量前(源变量)对象默认是传引用对于较大是的数据,传引用比较好,这样可以节省内存的开销17、isset、empty、is_null的区别isset 判断变量是否定义或者是否为空 变量存在返回ture,否则返回false 变量定义不赋值返回false unset一个变量,返回false 变量赋值为null,返回falseempty:判断变量的值是否为空,能转换为false的都是空,为空返回true,反之返回false。 "",0,"0",NULL,FALSE都认为为空,返回true 没有任何属性的对象都认为是空is_null:检测传入的值(值、变量、表达式)是否为null 定义了,但是赋值为Null 定义了,但是没有赋值 unset一个变量18、前端调试的工具Firefox的firebugChrome的开发工具EmmetJSON格式校验工具19. 简单描述mysql中,索引,主键,唯一索引,联合索引的区别,对数据库的性能有什么影响(从读写两方面)(新浪网技术部)索引是一种特殊的文件(InnoDB数据表上的索引是表空间的一个组成部分),它们包含着对数据表里所有记录的引用指针。普通索引(由关键字KEY或INDEX定义的索引)的唯一任务是加快对数据的访问速度。普通索引允许被索引的数据列包含重复的值。如果能确定某个数据列将只包含彼此各不相同的值,在为这个数据列创建索引的时候就应该用关键字UNIQUE把它定义为一个唯一索引。也就是说,唯一索引可以保证数据记录的唯一性。主键,是一种特殊的唯一索引,在一张表中只能定义一个主键索引,主键用于唯一标识一条记录,使用关键字 PRIMARY KEY 来创建。索引可以覆盖多个数据列,如像INDEX(columnA, columnB)索引,这就是联合索引。索引可以极大的提高数据的查询速度,但是会降低插入、删除、更新表的速度,因为在执行这些写操作时,还要操作索引文件。20.数据库中的事务是什么?事务(transaction)是作为一个单元的一组有序的数据库操作。如果组中的所有操作都成功,则认为事务成功,即使只有一个操作失败,事务也不成功。如果所有操作完成,事务则提交,其修改将作用于所有其他数据库进程。如果一个操作失败,则事务将回滚,该事务所有操作的影响都将取消。ACID 四大特性,原子性、隔离性、一致性、持久性。21.了解XSS攻击吗?如何防止?XSS是跨站脚本攻击,首先是利用跨站脚本漏洞以一个特权模式去执行攻击者构造的脚本,然后利用不安全的Activex控件执行恶意的行为。使用htmlspecialchars()函数对提交的内容进行过滤,使字符串里面的特殊符号实体化。22.SQL注入漏洞产生的原因?如何防止?SQL注入产生的原因:程序开发过程中不注意规范书写sql语句和对特殊字符进行过滤,导致客户端可以通过全局变量POST和GET提交一些sql语句正常执行。防止SQL注入的方式:开启配置文件中的magic_quotes_gpc 和 magic_quotes_runtime设置执行sql语句时使用addslashes进行sql语句转换Sql语句书写尽量不要省略双引号和单引号。过滤掉sql语句中的一些关键词:update、insert、delete、select、 * 。提高数据库表和字段的命名技巧,对一些重要的字段根据程序的特点命名,取不易被猜到的。Php配置文件中设置register_globals为off,关闭全局变量注册控制错误信息,不要在浏览器上输出错误信息,将错误信息写到日志文件中。23.PHP网站的主要攻击方式有哪些?命令注入(Command Injection)eval 注入(Eval Injection)客户端脚本攻击(Script Insertion)跨网站脚本攻击(Cross Site Scripting, XSS)SQL 注入攻击(SQL injection)跨网站请求伪造攻击(Cross Site RequestForgeries, CSRF)Session 会话劫持(Session Hijacking)Session 固定攻击(Session Fixation)HTTP 响应拆分攻击(HTTP Response Splitting)文件上传漏洞(File Upload Attack)目录穿越漏洞(Directory Traversal)远程文件包含攻击(Remote Inclusion)动态函数注入攻击(Dynamic VariableEvaluation)URL 攻击(URL attack)表单提交欺骗攻击(Spoofed FormSubmissions)HTTP 请求欺骗攻击(Spoofed HTTP Requests)24、框架中什么是单一入口和多入口 , 单一入口的优缺点?多口就是通过访问不同的文件来完成用户请求。单一入口只 web 程序所有的请求都指向一个脚本文件的。单一入口更容易控制权限,方便对 http 请求可以进行安全性检查。缺点:URL 看起来不那么美观,特别是对搜索引擎来说不友好。25、 对于关系型数据库而言,索引是相当重要的概念,请回答有关索引的几个问题:a)、索引的目的是什么?快速访问数据表中的特定信息,提高检索速度创建唯一性索引,保证数据库表中每一行数据的唯一性。加速表和表之间的连接使用分组和排序子句进行数据检索时,可以显著减少查询中分组和排序的时间b)、索引对数据库系统的负面影响是什么?负面影响:创建索引和维护索引需要耗费时间,这个时间随着数据量的增加而增加;索引需要占用物理空间,不光是表需要占用数据空间,每个索引也需要占用物理空间;当对表进行增、删、改、的时候索引也要动态维护,这样就降低了数据的维护速度。c)、为数据表建立索引的原则有哪些?在最频繁使用的、用以缩小查询范围的字段上建立索引。在频繁使用的、需要排序的字段上建立索引d)、 什么情况下不宜建立索引?对于查询中很少涉及的列或者重复值比较多的列,不宜建立索引。对于一些特殊的数据类型,不宜建立索引,比如文本字段(text)等。26、 简述在MySQL数据库中MyISAM和InnoDB的区别区别于其他数据库的最重要的特点就是其插件式的表存储引擎。切记:存储引擎是基于表的,而不是数据库。InnoDB与MyISAM的区别:InnoDB存储引擎: 主要面向OLTP(Online Transaction Processing,在线事务处理)方面的应用,是第一个完整支持ACID事务的存储引擎(BDB第一个支持事务的存储引擎,已经停止开发)。特点:行锁设计、支持外键;支持类似于Oracle风格的一致性非锁定读(即:默认情况下读取操作不会产生锁);InnoDB将数据放在一个逻辑的表空间中,由InnoDB自身进行管理。从MySQL4.1版本开始,可以将每个InnoDB存储引擎的表单独存放到一个独立的ibd文件中;InnoDB通过使用MVCC(多版本并发控制:读不会阻塞写,写也不会阻塞读)来获得高并发性,并且实现了SQL标准的4种隔离级别(默认为REPEATABLE级别);InnoDB还提供了插入缓冲(insert buffer)、二次写(double write)、自适应哈希索引(adaptive hash index)、预读(read ahead)等高性能和高可用的功能;InnoDB采用了聚集(clustered)的方式来存储表中的数据,每张标的存储都按主键的顺序存放(如果没有显式的在建表时指定主键,InnoDB会为每一行生成一个6字节的ROWID,并以此作为主键);InnoDB表会有三个隐藏字段:除了上面提到了6字节的DB_ROW_ID外,还有6字节的DB_TX_ID(事务ID)和7字节的DB_ROLL_PTR(指向对应回滚段的地址)。这个可以通过innodb monitor看到;MyISAM存储引擎: 是MySQL官方提供的存储引擎,主要面向OLAP(Online Analytical Processing,在线分析处理)方面的应用。特点:不支持事务,支持表所和全文索引。操作速度快;MyISAM存储引擎表由MYD和MYI组成,MYD用来存放数据文件,MYI用来存放索引文件。MySQL数据库只缓存其索引文件,数据文件的缓存交给操作系统本身来完成;MySQL5.0版本开始,MyISAM默认支持256T的单表数据;27、 解释MySQL外连接、内连接与自连接的区别先说什么是交叉连接: 交叉连接又叫笛卡尔积,它是指不使用任何条件,直接将一个表的所有记录和另一个表中的所有记录一一匹配。内连接 则是只有条件的交叉连接,根据某个条件筛选出符合条件的记录,不符合条件的记录不会出现在结果集中,即内连接只连接匹配的行。外连接 其结果集中不仅包含符合连接条件的行,而且还会包括左表、右表或两个表中的所有数据行,这三种情况依次称之为左外连接,右外连接,和全外连接。左外连接,也称左连接,左表为主表,左表中的所有记录都会出现在结果集中,对于那些在右表中并没有匹配的记录,仍然要显示,右边对应的那些字段值以NULL来填充。右外连接,也称右连接,右表为主表,右表中的所有记录都会出现在结果集中。左连接和右连接可以互换,MySQL目前还不支持全外连接。28、 写出三种以上MySQL数据库存储引擎的名称(提示:不区分大小写)MyISAM、InnoDB、BDB(BerkeleyDB)、Merge、Memory(Heap)、Example、Federated、Archive、CSV、Blackhole、MaxDB 等等十几个引擎29、 什么是面向对象?主要特征是什么?几大原则是什么?面向对象是程序的一种设计模式,它利于提高程序的重用性,使程序机构更加清晰。 主要特征是:封装、继承、多态。五大基本原则: 单一职责原则;开放封闭原则;替换原则; 依赖原则; 接口分离原则。30、什么是静态路由,其特点是什么?什么是动态路由,其特点是什么?参考答案:静态路由是由系统管理员设计与构建的路由表规定的路由。适用于网关数量有限的场 合,且网络拓朴结构不经常变化的网络。其缺点是不能动态地适用网络状况的变化,当 网络状况变化后必须由网络管理员修改路由表。动态路由是由路由选择协议而动态构建的,路由协议之间通过交换各自所拥有的路由信 息实时更新路由表的内容。动态路由可以自动学习网络的拓朴结构,并更新路由表。其 缺点是路由广播更新信息将占据大量的网络带宽。31、使用过 Memcache 缓存吗,如果使用过,能够简单的描述一下它的工作原理吗?Memcahce 是把所有的数据保存在内存当中,采用 hash 表的方式,每条数据由 key 和 value 组成,每个 key 是独一无二的,当要访问某个值的时候先按照找到值,然后返回结果。Memcahce 采用 LRU 算法来逐渐把过期数据清除掉。32. 列举流行的 Ajax 框架?说明 Ajax 实现原理是什么及 json 在 Ajax 中起什么作用?流行的 Ajax 框架有 jQuery,Prototype,Dojo,MooTools。Ajax 的工作原理是一个页面的指定位置可以加载另一个页面所有的输出内容,这样就实现了一个静态页面也能获取到数据库中的返回数据信息了。所以 Ajax 技术实现了一个静态网页在不刷新整个页面的情况下与服务器通信,减少了用户等待时间,同时也从而降低了网络流量,增强了客户体验的友好程度。在使用 Ajax 时,涉及到数据传输,即将数据从服务器返回到客户端,服务器端和客户端分别使用不同的脚步语言来处理数据,这就需要一种通用的数据格式,XML 和 json 就是最常用的两种,而 json 比 XML 更简单。33、Myql中的事务回滚机制概述事务是用户定义的一个数据库操作序列,这些操作要么全做要么全不做,是一个不可分割的工作单位,事务回滚是指将该事务已经完成的对数据库的更新操作撤销。要同时修改数据库中两个不同表时,如果它们不是一个事务的话,当第一个表修改完,可能第二个表修改过程中出现了异常而没能修改,此时就只有第二个表依旧是未修改之前的状态,而第一个表已经被修改完毕。而当你把它们设定为一个事务的时候,当第一个表修改完,第二表修改出现异常而没能修改,第一个表和第二个表都要回到未修改的状态,这就是所谓的事务回滚。

11

2017/03