bingo 发布的文章

PHP 插件扩展大全


国外程序员整理的 PHP 资源大全



ziadoz 在 Github 发起维护的一个 PHP 资源列表,内容包括:库、框架、模板、安全、代码分析、日志、第三方库、配置工具、Web 工具、书籍、电子书、经典博文等等。



依赖管理



依赖和包管理库



Composer/Packagist:一个包和依赖管理器



Composer Installers:一个多框架Composer库安装器



Pickle:一个PHP扩展安装器







其他的依赖管理



其他的相关依赖管理



Satis:一个静态Composer存储库生成器



Composition:一个在运行时检查Composer环境的库



Version:语义版本的解析和比较库



NameSpacer -转化下划线到命名空间的库



Patch Installer -使用Composer安装补丁的库



Composer Checker -校验Composer配置的工具







框架



Web开发框架



Symfony2 -一个独立组件组成的框架



-另一个由独立组件组成的框架



Laravel 4 -另一个PHP框架



Aura PHP -独立组件的框架



Yii2 – 另一个PHP框架



Nette – 另一个由个体组件组成的框架



PPI fr<x>amework 2 -一个互操作性框架



Phalcon -通过C扩展实现的框架







其他框架



其他Web开发框架



Symfony CMF – 创建自定义CMS的内容管理框架



Knp RAD Bundle -Symfony 2的快速应用程序(RAD)包







框架组件



来自web开发框架的独立组件



Symfony2 Components -Symfony2组件



-ZF2组件



Aura Components -PHP5.4组件包



Hoa Project -另一个PHP组件包







微型框架



微型框架和路由



Silex – 基于Symfony2组件的微型框架



– 另一个简单的微型框架



Bullet PHP -用于构建REST APIs的微型框架



Fast Route – 快速路由库



Pux -另一个快速路由库







其他微型框架



其他相关的微型框架和路由



Silex Skeleton -Silex的项目架构



Silex Web Profiler -Silex web调试工具条



Stack – Silex/Symfony的可堆叠中间件库



Slim Skeleton -Slim架构



Slim View -Slim的自定义视图集合



Slim Middleware -Slim的自定义中间件集合







模板



模板化和词法分析的库和工具



Twig -一个全面的模板语言



Twig Cache Extension -一个用于Twig的模板片段缓存库



Mustache -一个Mustache模板语言的PHP实现



Phly Mustache -另一个Mustache模板语言的PHP实现



MtHaml – 一个HAML 模板语言的PHP实现



PHPTAL -一个 TAL 模板语言的PHP实现



Plates -一个原生PHP模板



Lex -一个轻量级模板解析器







静态站点生成器



预处理工具来生成web页面的内容。



Sculpin -转换Markdown和Twig为静态HTML的工具



Phrozn – 另一个转换Textile,Markdown和Twig为HTML的工具







HTTP



用于HTTP和网站爬取的库



Guzzle -一个全面的HTTP客户端



Buzz -另一个HTTP客户端



Requests -一个简单的HTTP库



HTTPFul -一个链式HTTP库



Goutte -一个简单的web爬取器



PHP VCR -录制和重放HTTP请求的库







URL



解析URL的库



Purl -一个URL处理库



PHP Domain Parser -一个本地前缀解析库







Email



发送和解析邮件的库



SwiftMailer – 一个邮件解决方案



PHPMailer – 另一个邮件解决方案



Fetch -一个IMAP库



Email Reply Parser -一个邮件回复解析库



Stampie -邮件服务库,不如 SendGrid, PostMark, MailGunMandrill.



-一个在邮件模板内联CSS的库







文件



文件处理和MIME类型检测库



Gaufrette -一个文件系统抽象层



Flysystem – 另一个文件系统抽象层



Canal -一个检测互联网媒体类型的库



Apache MIME Types -一个解析Apache MIME类型的库



Ferret – 一个MIME检测库



Hoa Mime -另一个MIME检测库



Lurker -一个资源跟踪库



PHP File Locator -一个在大型项目定位文件的库



PHP FFmpeg -一个用于FFmpeg 视频包装的库.



CSV – 一个CSV数据处理库







Streams 流



处理流的库



Streamer – 一个面向对象的流包装库







Dependency Injection依赖注入



实现依赖注入设计模式的库



Pimple – 一个小的依赖注入容器



Auryn – 另一个依赖注入容器



Orno Di -另一个可伸缩的依赖注入容器



PHP DI -一个使用注释实现的依赖注入



Acclimate -一个依赖注入容器和服务定位的通用接口







Imagery 图像



处理图像的库



Imagine -一个图像处理库



PHP Image Workshop -另一个图像处理库



Intervention Image -另一个图像处理库



-一个提取GIF动画帧信息的库



GIF Creator – 一个通过多张图片创建GIF动画的库



Image With Text -一个在图像中嵌入文本的库



Color Extractor -一个从图像中提取颜色的库







Testing 测试



测试代码和生成测试数据的库



PHPUnit -一个单元测试框架



DBUnit -PHPUnit的数据库测试库



ParaTest – PHPUnit的并行测试库



PHPSpec -基于功能点设计的单元测试库



Codeception -一个全栈测试框架



AspectMock – PHPUnit/ Codeception 模拟框架。



Atoum -一个简单的测试库



Mockery -一个用测试的模拟对象库



Phake -另一个用测试的模拟对象库



Prophecy -一个可选度很高的模拟框架



Faker -一个伪数据生成库



Samsui – 另一个伪数据生成库



Alice -富有表现力的一代库



Behat -一个行为驱动开发(BDD)测试框架



Pho -一个行为驱动开发测试框架



Mink -Web验收测试



HTTP Mock – 一个在单元测试模拟HTTP请求的库



VFS Stream -一个用于测试的虚拟文件系统流的包装器



VFS -另一个用于测试虚拟文件系统



Locust -一个用Python编写的现代加载测试库







Continuous Integration 持续集成



持续集成的库和应用



Travis CI – 一个持续集成平台



PHPCI -一个PHP的开源持续集成平台



Sismo – 一个持续测试服务库



Jenkins一个 PHP 支持的持续集成平台



JoliCi – 一个用PHP编写的由Docker支持的持续集成客户端







Documentation 文档



生成项目文档的库



Sami -一个API文档生成器



APIGen -另一个API文档生成器



PHP Documentor 2 -一个API文档生成器



phpDox – 一个PHP项目的文档生成器(不限于API文档)







Security 安全



生成安全的随机数,加密数据,扫描漏洞的库



HTML Purifier -一个兼容标准的HTML过滤器



RandomLib -一个生成随机数和字符串的库



True Random -使用 www.random.org生成随机数的库



SecurityMultiTool -一个PHP安全库



PHPSecLib -一个纯PHP安全通信库



TCrypto -一个简单的键值加密存储库



PHP IDS – 一个结构化的PHP安全层



PHP SSH -一个试验的面向对象的SSH包装库



IniScan -一个扫描PHP INI文件安全的库



SensioLabs Security Check -一个为检查Composer依赖提供安全建议的web工具



Zed – 一个集成的web应用渗透测试工具







Passwords 密码



处理和存储密码的库和工具



Password Compat -一个新的PHP5.5密码函数的兼容库



phpass – 一个便携式的密码哈希框架



PHP Password Lib -一个生成和校验密码的库



Password Policy – 一个PHP和ja<x>vasc<x>ript的密码策略库



Password Validator – 校验和升级密码哈希的库



Zxcvbn PHP -一个基于Zxcvbn JS的现实的PHP密码强度估计库







Code Analysis 代码分析



分析,解析和处理代码库的库的工具



PHP Parser -一个PHP编写的PHP解析器



PHPPHP – 一个PHP实现的PHP虚拟机



PHPSandbox -一个PHP沙盒环境



Dissect -一个词法和语法分析的工具集合



PHP Mess Detector -一个扫描代码缺陷,次优代码,未使用的参数等等的库。



PHP Code Sniffer -一个检测PHP、CSS和JS代码标准冲突的库



PHPCPD – 一个检测复制和粘贴代码的库



PHP Analyser -一个分析PHP代码查找缺陷和错误的库



PHP CS Fixer – 一个编码标准库



PHP Manipulator -一个分析和修改PHP源代码的库



PHP Metrics -一个静态测量库



PHP Refactoring Browser -一个重构PHP代码的命令行工具集



UBench – 一个简单的微型基准检测库



Athletic -一个基于注释的基准检测库



Mondrian – 使用使用图论的代码分析工具



Scrutinizer -一个审查PHP代码的web工具



PHPLOC -一个快速测量PHP项目大小的工具



xHprof -另一个PHP分析工具



-一个帮助遵守特定的编码惯例的工具。







Debugging 调试



调试代码的库和工具



xDebug -一个调试和分析PHP的工具



PHP Debug Bar – 一个调试工具栏



PHP Console -一个web调试控制台



Barbushin PHP Console -另一个使用Google Chrome的web调试控制台



PHPDBG – 一个交互的PHP调试器



Tracy -一个简单的错误检测,写日志和时间测量库







Build Tools 构建工具



项目构建和自动化工具



Go -一个简单的PHP构建工具



Bob – 一个简单的项目自动化工具



Phake -一个PHP克隆库



Box – 一个构建PHAR文件的工具



Phing -一个灵感来自于Apache Ant的PHP项目构建系统







Task Runners 任务运行器



自动运行任务的库



Task -一个灵感来源于Grunt和Gulp的纯PHP任务运行器



Robo -一个面向对象配置的PHP任务运行器



Bldr -一个构建在Symfony组件上的PHP任务运行器







Navigation导航



构建导航结构的工具



KnpMenu – 一个菜单库



Cartographer -一个站点地图生成库







Asset Management 资源管理



管理,压缩和最小化web站点资源的工具



Assetic – 一个资源管理的管道库



Pipe -另一个资源管理的管道库



Munee -一个资源优化库



JShrink -一个ja<x>vasc<x>ript最小化库



Puli – 一个检测资源绝对路径的库







Geolocation 地理位置



为地理编码地址和使用纬度经度的库。



GeoCoder -一个地理编码库



GeoTools -一个地理工具相关的库



PHPGeo -一个简单的地理库



GeoJSON -一个地理JSON的实现







Date and Time 日期和时间



处理日期和时间的库



Carbon – 一个简单的日期时间API扩展



ExpressiveDate -另一个日期时间API扩展



CalendR – 一个日历管理库







Event 事件



时间驱动或非阻塞事件循环实现的库



React -一个事件驱动的非阻塞I/O库



Rx.PHP – 一个reactive扩展库



Ratchet – 一个web套接字库



Hoa WebSocket -另一个web套接字库



Hoa EventSource -一个事件源库



Evenement -一个事件分发库



FuelPHP Event -另一个事件分发库







Logging 日志



生成和处理日志文件的库



Monolog – 一个全面的日志工具



KLogger -一个易用的PSR-3兼容的日志类







E-commerce 电子商务



处理支付和构建在线电子商务商店的库和应用



OmniPay -一个框架混合了多网关支付处理的库



Payum – 一个支付抽象库



Sylius – 一个开源的电子商务解决方案



Thelia -另一个开源的电子商务解决方案



Money – 一个Fowler金钱模式的PHP实现



Sebastian Money -另一个处理货币值的库



Swap -一个汇率库







PDF



处理PDF文件的库和软件



Snappy -一个PDF和图像生成器库



WKHTMLToPDF -一个将HTML转换为PDF的工具







Databa<x>se 数据库



使用对象关系映射(ORM)或数据映射技术的数据库交互库



Doctrine -一个全面的DBAL和ORM



Doctrine Extensions -一个Doctrine行为扩展的集合



Propel – 一个快速的ORM,迁移库和查询构架器



-Laravel 4 ORM



Baum -一个Eloquent的嵌套集实现



Spot2 -一个MySQL的ORM映射器



RedBean -一个轻量级,低配置的ORM



Pomm -一个PostgreSQL对象模型管理器



ProxyManager -一个为数据映射生成代理对象的工具集







Migrations 迁移



帮助管理数据库模式和迁移的库



PHPMig -另一个迁移管理库



Phinx – 另一个数据库迁移管理库



Migrations -一个迁移管理库



Doctrine Migrations -一个Doctrine迁移库







NoSQL



处理NoSQL后端的库



MongoQB -一个MongoDB查询构建库



Monga -一个MongoDB抽象库



Predis – 一个功能完整的Redis库







Queue 队列



处理事件和任务队列的库



Pheanstalk -一个Beanstalkd 客户端库



PHP AMQP -一个纯PHP AMQP库



Thumper – 一个RabbitMQ模式库



Bernard -一个多后端抽象库







Search 搜索



在数据上索引和执行查询的库和软件



ElasticSearch PHP -ElasticSearch的官方客户端库



Elastica -ElasticSearch的客户端库



Solarium -Solr的客户端库



SphinxQL query builder -Sphinx搜索引擎的的查询库







Command Line 命令行



构建命令行工具的库



Boris – 一个微型PHP REPL



PsySH – 另一个微型PHP REPL



Pecan -一个事件驱动和非阻塞内核



GetOpt – 一个命令行选择解析器



OptParse -另一个命令行选择解析器



Commando -另一个简单的命令行选择解析器



GetOptionKit -另一个命令行选择解析器



-计算cron运行日期的库



ShellWrap -一个简单的命令行包装库



Hoa Console -另一个命令行库



Shunt – 一个在多台远程机器上并行运行命令行的库



Cilex -一个构建命令行工具的微型框架







Authentication 身份验证



实现身份验证的库



Sentry -一个混合的身份验证和授权的框架库



Sentry Social -一个社交网络身份验证库



Opauth -一个多渠道的身份验证框架



OAuth2 -一个OAuth2身份验证服务,资源服务器和客户端库



OAuth2 Server -另一个OAuth2服务器实现



PHP oAuthLib -另一个OAuth库



TwitterOAuth -一个Twitter OAuth库



TwitterSDK -一个完全测试的Twitter SDK



Hawk -一个Hawk HTTP身份认证库



HybridAuth -一个开源的社交登陆库







Markup 标记



处理标记的库



Decoda -一个轻量级标记解析库



PHP Markdown -一个Markdown解析器



CommonMark PHP -一个对 CommonMark spec全支持的Markdown解析器



Dflydev Markdown -另一个Markdown解析器



Parsedown -另一个Markdown解析器



Ciconia – 另一个支持Github Markdown风格的Markdown解析器



Cebe Markdown -一个快速的可扩展的Markdown解析器



HTML5 PHP – 一个HTML5解析和序列化库







Strings 字符串



解析和处理字符串的库



ANSI to HTML5 -ANSI到HTML5的转化库



Patchwork UTF-8 -一个处理UTF-8字符串的便携库



Hoa String -另一个UTF-8字符串库



Stringy -一个多字节支持的字符串处理库



Color Jizz -处理和转换颜色的库



UUID – 生成UUIDs的库



Slugify -转换字符串到slug的库



Urlify – 一个Django的 URLify.jsPHP通道



Text – 一个文本处理库



SQL Formatter -一个格式化SQL语句的库



UA Parser – 一个解析用户代理字符串的库







Numbers 数字



处理数字的库



Numbers PHP -处理数字的库



Math -处理大数字的库



ByteUnits – 在二进制和度量系统中解析,格式化和转换字节单元的库



PHP Units of Measure -一个计量单位转换的库



PHP Conversion – 另一个计量单位转换的库



LibPhoneNumber for PHP -Google电话号码处理的PHP实现库







Filtering and Validation 过滤和验证



过滤和验证数据的库



Filterus – 一个简单的PHP过滤库



Respect Validate -一个简单的验证库



Valitron -另一个验证库



Upload – 一个处理文件上传和验证的库



DMS Filter – 一个注释过滤库



-一个支持YAML,JSON和xm<x>l的模式验证库



ISO-codes -验证各种ISO和ZIP编码的库(IBAN, SWIFT/BIC, BBAN, VAT, SSN, UKNIN)







REST和API



开发REST-ful API的库和web工具



Apigility -一个使用Zend fr<x>amework 2构建的API构建器



Hateoas -一个HOATEOAS REST web服务库



HAL -一个超文本应用语言(HAL)构建库



Negotiation -一个内容协商库



Drest -一个将Doctrine实体暴露为REST资源节点的库



Restler -一个将PHP方法暴露为RESTful web API的轻量级框架







Caching 缓存



缓存数据的库



Alternative PHP Cache (APC) – 打开PHP伪代码缓存



Cache -一个缓存库(Doctrine部分)



Stash -另一个缓存库







数据结构和存储



实现数据结构和存储技术的库



Ardent -一个数据结构库



PHP Collections – 一个简单的集合库



Serializer -一个序列化和反序列化数据的库



-一个对象存储库



Fractal -一个转换复杂数据结构到JSON输出的库



Totem -一个管理和穿件数据交换集的库



PINQ -一个PHP实时Linq库



JsonMapper -一个将内嵌JSON结构映射为PHP类的库







Notifications 通知



处理通知软件的库



Nod -一个通知库(Growl等)



Notificato – 一个处理推送通知的库



Notification Pusher -一个设备推送通知的独立库



Notificator -一个轻量级的通知库







Deployment 部署



项目部署库



Pomander -一个PHP应用部署工具



Rocketeer -PHP世界里的一个快速简单的部署器



Envoy -一个用PHP运行SSH任务的工具



Plum – 一个部署库







国际化和本地化



国际化(I18n)和本地化(L10n)



Aura.Intl







第三方API



访问第三方API的库



Amazon Web Service SDK – PHP AWS SDK官方库



S3 Stream Wrapper -Amazon S3流包装库



Stripe -Stripe官方PHP库



Campaign Monitor -Campaign Monitor官方PHP库



Digital Ocean -Digital Ocean API 接口库



Github – Github API交互库



PHP Github API -另一个Github API交互库



Twitter OAuth -Twitter OAuth工作流交互库



Twitter REST – Twitter REST API交互库



Dropbox SDK – The official PHP Dropbox SDK library.



Dropbox SDK – Dropbox SDK官方PHP库



Twilio – The official Twilio PHP REST API.



Twilio – Twilio官方PHP REST API



Mailgun The official Mailgun PHP API.



Mailgun Mailgun官方PHP REST API







Extensions 扩展



帮组构建PHP扩展的库



Zephir -用于开发PHP扩展,且介于PHP和C++之间的编译语言



PHP CPP -一个开发PHP扩展的C++库







Miscellaneous 杂项



不在上面分类中的有用库和工具



Spork -一个处理forking的库



JSON Lint – 一个JSON lint工具



JSONPCallbackValidator -验证JSONP回调的库



Pagerfanta -一个分页库



Ruler – 一个简单的无状态的生产环境规则引擎。



LiteCQRS -一个CQRS(命令查询责任分离)库



Sslurp – 一个使得SSL处理减少的库



PHP Option一个可选的类型库



Metrics -一个简单的度量API库



– 一个解析VCard和iCalendar对象的库



Annotations -一个注释库(Doctrine部分)



Whoops -一个不错的错误处理库



Finite -一个简单的PHP有限状态机



LadyBug -一个dumper库



Procrastinator -运行耗时任务的库



Compose -一个功能组合库



SuperClosure -一个允许闭包序列化的库



Jumper – 一个远程服务执行库



Underscore -一个Undersccore JS库的PHP实现



PHP PassBook -一个iOS PassBook PHP库



-一个PHP表达式语言



RMT – 一个编写版本和发布软件的库



Wise – 一个配置管理器



Opengraph -一个开放图库



Essence -一个提取web媒体的库



Embera -一个Oem<x>bed消费库



Graphviz -一个图形库



Monad PHP 一个简单Monad库



Flux -一个正则表达式构建库



Patchwork – 一个重新定义用户的函数库



Galapagos -语言转换进化



Design Patterns PHP -一个使用PHP实现的设计模式存储库



PHPCR – 一个Java内容存储库(JCR)的PHP实现



Functional PHP – 一个函数式编程库



ClassPreloader – 一个优化自动加载的库



Lib Country -一个国家和地区数据的库



Lib Accessor -一个简化访问的库



PHPStack -一个PHP编写的TCP/IP栈概念



Nmap -一个Nmap PHP包装器



Code Mover -一个移动代码的库



Iter -一个使用生成器提供迭代原语的库



Lambda PHP -一个PHP中的Lambda 计算解析器



Country List – 所有带有名称和ISO 3166-1编码的国家列表



PHP-GPIO – 用于Raspberry PI的GPIO pin的库



print_o – 一个对象图的可视化器



Alias -一个类别名库







Software 软件



创建一个开发环境的软件



PHP安装



在你的电脑上帮助安装和管理PHP的工具



HomeBrew -一个OSX包管理器



HomeBrew PHP -一个HomeBrew的PHP通道



PHP OSX – 一个OSX下的PHP安装器



PHP Brew -一个PHP版本管理和安装器



PHP Env – 另一个PHP版本管理器



PHP Switch – 另一个PHP版本管理器



PHP Build – 另一个PHP版本安装器



VirtPHP – 一个创建和管理独立PHP环境的工具







Development Environment 开发环境



创建沙盒开发环境的软件和工具



Vagrant -一个便携的开发环境工具



Ansible – 一个非常简单的编制框架



Puppet -一个服务器自动化框架和应用



PuPHPet -一个构建PHP开发虚拟机的web工具



Protobox -另一个构建PHP开发虚拟机的web工具



Phansible – 一个用Ansible构建PHP开发虚拟机的web工具







Virtual Machines 虚拟机



相关的PHP虚拟机



HipHop PHP -Facebook出品的PHP虚拟机,运行时和JIT



HippyVM -另一个PHP虚拟机



Hack – 一个PHP进行无缝操作的 HHVM编程语言



IDE 集成开发环境



支持PHP的集成开发环境



Netbeans -一个支持PHP和HTML5的IDE



Eclipse for PHP Developers -一个基于Eclipse平台的PHP IDE



PhpStorm -一个商业PHP IDE







Web Applications Web应用



基于Web的应用和工具



3V4L一个在线的PHP shell



DBV -一个数据库版本控制应用



PHP Queue -一个管理后端队列的应用



Composer as a Service – 作为一个zip文件下载Composer包的工具



MailCatcher – 一个抓取和查看邮件的web工具







Resources 资源



各种提高你的PHP开发技能和知识的资源,比如书籍,网站,文章



PHP网站



PHP相关的有用网站



PHP The Right Way -一个PHP最佳实践的快速指引手册



PHP Best Practices – 一个PHP最佳实践指南



PHP Weekly – 一个PHP新闻周刊



PHP Security – 一个PHP安全指南



PHP FIG – PHP框架交互组



PHP UG -一个帮助用户定位最近的PHP用户组(UG)的网站



Seven PHP -一个PHP社区成员采访的网站



Nomad PHP -一个在线PHP学习资源



PHP Mentoring -点对点PHP导师组织







Other Websites 其他网站



web开发相关的有用网站



The Open Web Application Security Project (OWASP) -一个开放软件安全社区



WebSec IO – 一个web安全社区资源



Web Advent -一个web开发人员日历



Semantic Versioning -一个解析语义版本的网站



Atlassian Git Tutorials -一个Git教程系列



Hg Init -一个Mercurial教程系列



Servers for Hackers – 一个关于服务器管理的新闻通讯



原文链接:http://www.kubiji.cn/topic-id2570.html

MySQL Explain

一、语法

explain < table_name >

          
          例如:
          
     

explain select * from t3 where id=3952602;

          
          二、explain输出解释
          
      +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
      | id | select_type | table | type  | possible_keys     | key     | key_len | ref   | rows | Extra |
      +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
          
          1 id
          
          SQL执行的顺利的标识,SQL从大到小的执行。
          
          例如:
          
   

mysql> explain select from (select from ( select * from t3 where id=3952602) a) b;

      +----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+
      | id | select_type | table      | type   | possible_keys     | key     | key_len | ref  | rows | Extra |
      +----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+
      |  1 | PRIMARY     | <derived2> | system | NULL              | NULL    | NULL    | NULL |    1 |       |
      |  2 | DERIVED     | <derived3> | system | NULL              | NULL    | NULL    | NULL |    1 |       |
      |  3 | DERIVED     | t3         | const  | PRIMARY,idx_t3_id | PRIMARY | 4       |      |    1 |       |
      +----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+
          
          很显然这条SQL是从里向外的执行,就是从id=3 向上执行。
          2 select_type
          
          就是select类型,可以有以下几种
          
          (1)SIMPLE
          
          简单SELECT(不使用UNION或子查询等)。
          
          例如:
          
     

mysql> explain select * from t3 where id=3952602;

       +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
       | id | select_type | table | type  | possible_keys     | key     | key_len | ref   | rows | Extra |
       +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
       |  1 | SIMPLE      | t3    | const | PRIMARY,idx_t3_id | PRIMARY | 4       | const |    1 |       |
       +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
          
          (2)PRIMARY
          
          就是最外层的select。
          
          例如:
          
    

mysql> explain select from (select from t3 where id=3952602) a ;

       +----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+
       | id | select_type | table      | type   | possible_keys     | key     | key_len | ref  | rows | Extra |
       +----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+
       |  1 | PRIMARY     | <derived2> | system | NULL              | NULL    | NULL    | NULL |    1 |       |
       |  2 | DERIVED     | t3         | const  | PRIMARY,idx_t3_id | PRIMARY | 4       |      |    1 |       |
       +----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+
          
          (3)UNION
          
          UNION中的第二个或后面的SELECT语句。
          
          例如
          
     

mysql> explain select from t3 where id=3952602 union all select from t3 ;

       +----+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+
       | id | select_type  | table      | type  | possible_keys     | key     | key_len | ref   | rows | Extra |
       +----+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+
       |  1 | PRIMARY      | t3         | const | PRIMARY,idx_t3_id | PRIMARY | 4       | const |    1 |       |
       |  2 | UNION        | t3         | ALL   | NULL              | NULL    | NULL    | NULL  | 1000 |       |
       |NULL | UNION RESULT | <union1,2> | ALL   | NULL              | NULL    | NULL    | NULL  | NULL |       |
       +----+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+
          
          (4)DEPENDENT UNION
          
          UNION中的第二个或后面的SELECT语句,取决于外面的查询。
          
     

     mysql> explain select * from t3 where id in (select id from t3 where id=3952602 union all select id from t3)  ;
               +----+--------------------+------------+--------+-------------------+---------+---------+-------+------+--------------------------+
               | id | select_type        | table      | type   | possible_keys     | key     | key_len | ref   | rows | Extra         
   |
               +----+--------------------+------------+--------+-------------------+---------+---------+-------+------+--------------------------+
               |  1 | PRIMARY            | t3         | ALL    | NULL              | NULL    | NULL    | NULL  | 1000 | Using where              |
               |  2 | DEPENDENT SUBQUERY | t3         | const  | PRIMARY,idx_t3_id | PRIMARY | 4       | const |    1 | Using index   
          |
               |  3 | DEPENDENT UNION    | t3         | eq_ref | PRIMARY,idx_t3_id | PRIMARY | 4       | func  |    1 | Using where;
          Using index |
               |NULL | UNION RESULT       | <union2,3> | ALL    | NULL              | NULL    | NULL    | NULL  | NULL |                          |
               +----+--------------------+------------+--------+-------------------+---------+---------+-------+------+--------------------------+
          
          (4)UNION RESULT
          
          UNION的结果。
          
     

mysql> explain select from t3 where id=3952602 union all select from t3 ;

       +----+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+
       | id | select_type  | table      | type  | possible_keys     | key     | key_len | ref   | rows | Extra |
       +----+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+
       |  1 | PRIMARY      | t3         | const | PRIMARY,idx_t3_id | PRIMARY | 4       | const |    1 |       |
       |  2 | UNION        | t3         | ALL   | NULL              | NULL    | NULL    | NULL  | 1000 |       |
       |NULL | UNION RESULT | <union1,2> | ALL   | NULL              | NULL    | NULL    | NULL  | NULL |       |
       +----+--------------+------------+-------+-------------------+---------+---------+-------+------+-------+
          
          (5)SUBQUERY
          
          子查询中的第一个SELECT。
          
     

mysql> explain select * from t3 where id = (select id from t3 where id=3952602 ) ;

       +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------------+
       | id | select_type | table | type  | possible_keys     | key     | key_len | ref   | rows | Extra       |
       +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------------+
       |  1 | PRIMARY     | t3    | const | PRIMARY,idx_t3_id | PRIMARY | 4       | const |    1 |             |
       |  2 | SUBQUERY    | t3    | const | PRIMARY,idx_t3_id | PRIMARY | 4       |       |    1 | Using index |
       +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------------+
          
          (6)  DEPENDENT SUBQUERY
          
          子查询中的第一个SELECT,取决于外面的查询。
          
    

      mysql> explain select id from t3 where id in (select id from t3 where id=3952602 )  ;
               +----+--------------------+-------+-------+-------------------+---------+---------+-------+------+--------------------------+
               | id | select_type        | table | type  | possible_keys     | key     | key_len | ref   | rows | Extra                    |
               +----+--------------------+-------+-------+-------------------+---------+---------+-------+------+--------------------------+
               |  1 | PRIMARY            | t3    | index | NULL              | PRIMARY | 4       | NULL  | 1000 | Using where; Using index |
               |  2 | DEPENDENT SUBQUERY | t3    | const | PRIMARY,idx_t3_id | PRIMARY | 4       | const |    1 | Using index   
   |
               +----+--------------------+-------+-------+-------------------+---------+---------+-------+------+--------------------------+
          
          (7)DERIVED
          
          派生表的SELECT(FROM子句的子查询)。
          
      

mysql> explain select from (select from t3 where id=3952602) a ;

       +----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+
       | id | select_type | table      | type   | possible_keys     | key     | key_len | ref  | rows | Extra |
       +----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+
       |  1 | PRIMARY     | <derived2> | system | NULL              | NULL    | NULL    | NULL |    1 |       |
       |  2 | DERIVED     | t3         | const  | PRIMARY,idx_t3_id | PRIMARY | 4       |      |    1 |       |
       +----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+
          
          3 table
          
          显示这一行的数据是关于哪张表的。
          有时不是真实的表名字,看到的是derivedx(x是个数字,是第几步执行的结果)。
          
     

mysql> explain select from (select from ( select * from t3 where id=3952602) a) b;

       +----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+
       | id | select_type | table      | type   | possible_keys     | key     | key_len | ref  | rows | Extra |
       +----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+
       |  1 | PRIMARY     | <derived2> | system | NULL              | NULL    | NULL    | NULL |    1 |       |
       |  2 | DERIVED     | <derived3> | system | NULL              | NULL    | NULL    | NULL |    1 |       |
       |  3 | DERIVED     | t3         | const  | PRIMARY,idx_t3_id | PRIMARY | 4       |      |    1 |       |
       +----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+
          
          4 type
          
          这列很重要,显示了连接使用了哪种类别,有无使用索引。
          从最好到最差的连接类型为const、eq_reg、ref、range、index和ALL。
          
          (1)system
          
          这是const联接类型的一个特例,表仅有一行满足条件。
          
          如下(t3表上的id是 primary key)
          
     

mysql> explain select from (select from t3 where id=3952602) a ;

       +----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+
       | id | select_type | table      | type   | possible_keys     | key     | key_len | ref  | rows | Extra |
       +----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+
       |  1 | PRIMARY     | <derived2> | system | NULL              | NULL    | NULL    | NULL |    1 |       |
       |  2 | DERIVED     | t3         | const  | PRIMARY,idx_t3_id | PRIMARY | 4       |      |    1 |       |
       +----+-------------+------------+--------+-------------------+---------+---------+------+------+-------+
          
          (2)const
          
          表最多有一个匹配行,它将在查询开始时被读取。
          
          因为仅有一行,在这行的列值可被优化器剩余部分认为是常数。
          
          const表很快,因为它们只读取一次!
          
          const用于用常数值比较PRIMARY KEY或UNIQUE索引的所有部分时。
          
          在下面的查询中,tbl_name可以用于const表:
          
     

SELECT * from tbl_name WHERE primary_key=1;

      SELECT * from tbl_name WHERE primary_key_part1=1和 primary_key_part2=2;
          
          例如:
          
     

mysql> explain select * from t3 where id=3952602;

       +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
       | id | select_type | table | type  | possible_keys     | key     | key_len | ref   | rows | Extra |
       +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
       |  1 | SIMPLE      | t3    | const | PRIMARY,idx_t3_id | PRIMARY | 4       | const |    1 |       |
       +----+-------------+-------+-------+-------------------+---------+---------+-------+------+-------+
          
          (3) eq_ref
          
          对于每个来自于前面的表的行组合,从该表中读取一行。
          
          这可能是最好的联接类型,除了const类型。
          
          它用在一个索引的所有部分被联接使用并且索引是UNIQUE或PRIMARY KEY。
          
          eq_ref可以用于使用= 操作符比较的带索引的列。
          
          比较值可以为常量或一个使用在该表前面所读取的表的列的表达式。
          
          在下面的例子中,MySQL可以使用eq_ref联接来处理ref_tables:
          
     

SELECT * FROM ref_table,other_table

        WHERE ref_table.key_column=other_table.column;
      
      SELECT * FROM ref_table,other_table
        WHERE ref_table.key_column_part1=other_table.column
        AND ref_table.key_column_part2=1;
          
          例如
          
     

mysql> create unique index idx_t3_id on t3(id) ;

       Query OK, 1000 rows affected (0.03 sec)
       Records: 1000  Duplicates: 0  Warnings: 0
      
      mysql> explain select * from t3,t4 where t3.id=t4.accountid;
       +----+-------------+-------+--------+-------------------+-----------+---------+----------------------+------+-------+
       | id | select_type | table | type   | possible_keys     | key       | key_len | ref                  | rows | Extra |
       +----+-------------+-------+--------+-------------------+-----------+---------+----------------------+------+-------+
       |  1 | SIMPLE      | t4    | ALL    | NULL              | NULL      | NULL    | NULL                 | 1000 |       |
       |  1 | SIMPLE      | t3    | eq_ref | PRIMARY,idx_t3_id | idx_t3_id | 4       | dbatest.t4.accountid |    1 |       |
       +----+-------------+-------+--------+-------------------+-----------+---------+----------------------+------+-------+
          
          (4)ref
          
          对于每个来自于前面的表的行组合,所有有匹配索引值的行将从这张表中读取。
          
          如果联接只使用键的最左边的前缀,或如果键不是UNIQUE或PRIMARY KEY(换句话说,如果联接不能基于关键字选择单个行的话),则使用ref。
          
          如果使用的键仅仅匹配少量行,该联接类型是不错的。
          
          ref可以用于使用=或<=>操作符的带索引的列。
          
          在下面的例子中,MySQL可以使用ref联接来处理ref_tables:
          
     

SELECT * FROM ref_table WHERE key_column=expr;

      
      SELECT * FROM ref_table,other_table
        WHERE ref_table.key_column=other_table.column;
      
      SELECT * FROM ref_table,other_table
        WHERE ref_table.key_column_part1=other_table.column
        AND ref_table.key_column_part2=1;
          
          例如:
          
     

mysql> drop index idx_t3_id on t3;

       Query OK, 1000 rows affected (0.03 sec)
       Records: 1000  Duplicates: 0  Warnings: 0
      
      mysql> create index idx_t3_id on t3(id) ;
       Query OK, 1000 rows affected (0.04 sec)
       Records: 1000  Duplicates: 0  Warnings: 0
      
      mysql> explain select * from t3,t4 where t3.id=t4.accountid;
       +----+-------------+-------+------+-------------------+-----------+---------+----------------------+------+-------+
       | id | select_type | table | type | possible_keys     | key       | key_len | ref                  | rows | Extra |
       +----+-------------+-------+------+-------------------+-----------+---------+----------------------+------+-------+
       |  1 | SIMPLE      | t4    | ALL  | NULL              | NULL      | NULL    | NULL                 | 1000 |       |
       |  1 | SIMPLE      | t3    | ref  | PRIMARY,idx_t3_id | idx_t3_id | 4       | dbatest.t4.accountid |    1 |       |
       +----+-------------+-------+------+-------------------+-----------+---------+----------------------+------+-------+
       2 rows in set (0.00 sec)
      
          (5)  ref_or_null
          
          该联接类型如同ref,但是添加了MySQL可以专门搜索包含NULL值的行。
          
          在解决子查询中经常使用该联接类型的优化。
          
          在下面的例子中,MySQL可以使用ref_or_null联接来处理ref_tables:
          
     

SELECT * FROM ref_table

        WHERE key_column=expr OR key_column IS NULL;
          
          (6) index_merge
          
          该联接类型表示使用了索引合并优化方法。
          
          在这种情况下,key列包含了使用的索引的清单,key_len包含了使用的索引的最长的关键元素。
          
          例如:
          
     

mysql> explain select * from t4 where id=3952602 or accountid=31754306 ;

       +----+-------------+-------+-------------+----------------------------+----------------------------+---------+------+------+------------------------------------------------------+
       | id | select_type | table | type        | possible_keys              | key                        | key_len | ref  | rows | Extra         
  |
       +----+-------------+-------+-------------+----------------------------+----------------------------+---------+------+------+------------------------------------------------------+
       |  1 | SIMPLE      | t4    | index_merge | idx_t4_id,idx_t4_accountid | idx_t4_id,idx_t4_accountid | 4,4     |
  NULL |    2 | Using union(idx_t4_id,idx_t4_accountid); Using where |
       +----+-------------+-------+-------------+----------------------------+----------------------------+---------+------+------+------------------------------------------------------+
       1 row in set (0.00 sec)
          
          (7) unique_subquery
          
          该类型替换了下面形式的IN子查询的ref:
          
          value IN (SELECT primary_key FROM single_table WHERE some_expr)
          
          unique_subquery是一个索引查找函数,可以完全替换子查询,效率更高。
          
          (8)index_subquery
          
          该联接类型类似于unique_subquery,可以替换IN子查询。
          
          但只适合下列形式的子查询中的非唯一索引:
          
          value IN (SELECT key_column FROM single_table WHERE some_expr)
          
          (9)range
          
          只检索给定范围的行,使用一个索引来选择行。
          
          key列显示使用了哪个索引。
          
          key_len包含所使用索引的最长关键元素。
          
          在该类型中ref列为NULL。
          
          当使用=、<>、>、>=、<、<=、IS NULL、<=>、BETWEEN或者IN操作符,用常量比较关键字列时,可以使用range。
          
     

mysql> explain select * from t3 where id=3952602 or id=3952603 ;

       +----+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+
       | id | select_type | table | type  | possible_keys     | key       | key_len | ref  | rows | Extra       |
       +----+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+
       |  1 | SIMPLE      | t3    | range | PRIMARY,idx_t3_id | idx_t3_id | 4       | NULL |    2 | Using where |
       +----+-------------+-------+-------+-------------------+-----------+---------+------+------+-------------+
       1 row in set (0.02 sec)
          
          (10)index
          
          该联接类型与ALL相同,除了只有索引树被扫描。
          
          这通常比ALL快,因为索引文件通常比数据文件小。
          
          当查询只使用作为单索引一部分的列时,MySQL可以使用该联接类型。
          
          (11) ALL
          
          对于每个来自于先前的表的行组合,进行完整的表扫描。
          
          如果表是第一个没标记const的表,这通常不好,并且通常在它情况下很差。
          
          通常可以增加更多的索引而不要使用ALL,使得行能基于前面的表中的常数值或列值被检索出。
          5 possible_keys
          
          possible_keys列指出MySQL能使用哪个索引在该表中找到行。
          
          注意,该列完全独立于EXPLAIN输出所示的表的次序。
          
          这意味着在possible_keys中的某些键,实际上不能按生成的表次序使用。
          
          如果该列是NULL,则没有相关的索引。
          
          在这种情况下,可以通过检查WHERE子句,看是否它引用某些列,或适合索引的列来提高你的查询性能。
          
          如果是这样,创造一个适当的索引并且再次用EXPLAIN检查查询
          6 key
          
          key列显示MySQL实际决定使用的键(索引)。
          
          如果没有选择索引,键是NULL。
          
          要想强制MySQL使用、或忽视possible_keys列中的索引,在查询中使用FORCE INDEX、USE INDEX或者IGNORE INDEX。
          7 key_len
          
          key_len列显示MySQL决定使用的键长度。
          
          如果键是NULL,则长度为NULL。
          
          使用的索引的长度。在不损失精确性的情况下,长度越短越好
          8 ref
          
          ref列显示使用哪个列,或常数与key一起从表中选择行。
          9 rows
          
          rows列显示MySQL认为它执行查询时必须检查的行数。
          10 Extra
          
          该列包含MySQL解决查询的详细信息,下面详细介绍。
          
          (1)Distinct
          
          一旦MYSQL找到了与行相联合匹配的行,就不再搜索了
          
          (2)Not exists
          
          MYSQL优化了LEFT JOIN,一旦它找到了匹配LEFT JOIN标准的行,就不再搜索了
          
          (3)Range checked for each
          
          Record(index map:#)
          
          没有找到理想的索引,因此对于从前面表中来的每一个行组合,MYSQL检查使用哪个索引,并用它来从表中返回行。
          
          这是使用索引的最慢的连接之一。
          
          (4)Using filesort
          
          看到这个的时候,查询就需要优化了。
          
          MYSQL需要进行额外的步骤,来发现如何对返回的行排序。
          
          它根据连接类型、以及存储排序键值、和匹配条件的全部行的行指针来排序全部行。
          
          (5)Using index
          
          列数据是从仅仅使用了索引中的信息,而没有读取实际的行动的表返回的。
          
          这发生在,对表的全部的请求列都是同一个索引的部分的时候。
          
          (6)Using temporary
          
          看到这个的时候,查询需要优化了。
          
          这里,MYSQL需要创建一个临时表来存储结果。
          
          这通常发生在对不同的列集进行ORDER BY上,而不是GROUP BY上。
          
          (7)Using where
          使用了WHERE从句来限制哪些行将与下一张表匹配或者是返回给用户。
          
          如果不想返回表中的全部行,并且连接类型ALL或index,这就会发生,或者是查询有问题。
          
          
          
          
          
          原文出处:[原文出处][1]
      
      
        [1]: http://www.awaimai.com/2141.html

索引--M

mysql 数据库的使用率是很高的,网站的瓶颈大多都在数据库的读写方面,合理的索引组合和添加可以很大程度上提高效率,反之过度的添加会有反效果。

常用索引的类别

1)主键索引:主键索引是加在主键上的索引,设置主键(primary key)的时候,mysql会自动创建主键索引;
2)普通索引:创建在非主键列上的索引;
3)聚合索引:创建在多列上的索引。

索引的操作

查看某张表的索引:show index from 表名;
创建普通索引:alter table 表名 add index 索引名 (加索引的列)
创建聚合索引:alter table 表名 add index 索引名 (加索引的列1,加索引的列2)
删除某张表的索引:drop index 索引名 on 表名;

一些默认的事情

  • 应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引。
  • 应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描。
  • 应尽量避免在 where 子句中使用!=或<>操作符,否则引擎将放弃使用索引而进行全表扫描。
  • 应尽量避免在 where 子句中使用or 来连接条件,否则将导致引擎放弃使用索引而进行全表扫描。
  • 不要在 where 子句中的“=”左边进行函数、算术运算或其他表达式运算,否则系统将可能无法正确使用索引。
  • 在使用索引字段作为条件时,如果该索引是复合索引,那么必须使用到该索引中的第一个字段作为条件时才能保证系统使用该索引,否则该索引将不会被使用,并且应尽可能的让字段顺序与索引顺序相一致。
  • 索引并不是越多越好,索引固然可 以提高相应的 select 的效率,但同时也降低了 insert 及 update 的效率,因为
    insert 或 update 时有可能会重建索引。

抽象类和接口

在开发的过程中或者在面试的过程中,总是会遇到这个问题,在自己的印象中还是比较模糊的,今天简单的写两条,这个网上也有很多,都大同小异。

抽象类

在声明类时有一个方法时抽象方法,那么这个类就是抽象类,抽象类要使用abstract关键字来修饰。
在抽象类中可以有不是抽象的成员方法和成员属性,但访问权限不能使用private关键字修饰为私有的。

<?php
    abstract class Person{
        protected $name;
        protected $country;
 
        function __construct($name="",$country="china"){
            $this ->name = $name;
            $this ->country = $country;
        }
 
        abstract function say();
        abstract function eat();
 
        function run(){
            echo "使用两条腿走路<br>";
        }
    }
?>

抽象类就像是一个“半成品”的类,在抽象类中有没有被实现的抽象方法,所以抽象类是不能被实例化的,即创建不了对象,也就不能直接使用它。
当子类继承抽象类以后,就必须把抽象类中的抽象方法按照子类自己的需要去实现。子类必须把父类中的抽象方法全部都实现,否则子类中还存在抽象方法,所以还是抽象类,也不能实例化对象。

接口

接口中声明的方法必须都是抽象方法,另外不能再接口中声明变量,只能使用const关键字声明为常量的成员属性,而且接口中所有成员都必须有public的访问权限。

使用extends关键字让一个接口去继承另一个接口,实现接口之间的扩展。

通过类去继承接口时需要使用implements关键字来实现,而并不是使用extends关键字完成。

如果需要使用接口中的成员,则需要通过子类去实现接口中的全部抽象方法,然后创建子类的对象去调用在子类中实现后的方法。

   <?php
      interface 接口名称{ //使用interface关键字声明接口
      常量成员 //接口中的成员属性只能是常量,不能是变量
      抽象方法 //接口中的所有方法必须是抽象方法,不能有非抽象的方法存在
      }
   ?>

<?php
interface one{
const CONSTANT = 'CONSTANT value';
function fun1();
function fun2();
}
 
//声明一个抽象类去实现接口One中的第二个方法
abstract class Three implements One{ //只实现接口中的一个抽象方法
function fun2(){
//具体的实现内容由子类自己决定
}
}
 
//声明一个类实现接口One中的全部抽象方法
class Four implements One{
function fun1(){
//具体的实现内容由子类自己决定
}
 
function fun2(){
//具体的实现内容由子类自己决定
}
}
 
?>

总结

1、对接口的使用是通过关键字implements。对抽象类的使用是通过关键字extends。当然接口也可以通过关键字extends继承。
2、接口中不可以声明成员变量(包括类静态变量),但是可以声明类常量。抽象类中可以声明各种类型成员变量,实现数据的封装。
3、接口没有构造函数,抽象类可以有构造函数。
4、接口中的方法默认都是public类型的,而抽象类中的方法可以使用protected,public来修饰。
5、一个类可以同时实现多个接口,但一个类只能继承于一个抽象类。

数据库设计--范式

数据库的范式貌似有很多,经常听的应该就三个(个人情况),平常建立数据库倒是也没有怎么注意,但是还是记一下,理解一下比较好。

三范式

1NF:字段不可分;

  原子性 字段不可再分,否则就不是关系数据库; 
  即一个字段只存储一项信息。

2NF:有主键,非主键字段依赖主键;

  唯一性 一个表只说明一个事物; 
  任意一个字段都只依赖表中的同一个字段。

3NF:非主键字段不能相互依赖;

  每列都与主键有直接关系,不存在传递依赖; 
  一张表最多只存两层同类型信息。

文件上传

//文件存储路径
$file_path="upload/";
//664权限为文件属主和属组用户可读和写,其他用户只读。
if(is_dir($file_path)!=TRUE) mkdir($file_path,0664) ;
//定义允许上传的文件扩展名
$ext_arr = array("gif", "jpg", "jpeg", "png", "bmp", "txt", "zip", "rar");

if (empty($_FILES) === false) {

//判断检查
if($photo_up_size > 2097152){
    exit("对不起,您上传的照片超过了2M。");
}
if($_FILES["file"]["error"] > 0){
    exit("文件上传发生错误:".$_FILES["file"]["error"]);
}

//获得文件扩展名
$temp_arr = explode(".", $_FILES["file"]["name"]);
$file_ext = array_pop($temp_arr);
$file_ext = trim($file_ext);
$file_ext = strtolower($file_ext);
//检查扩展名
if (in_array($file_ext, $ext_arr) === false) {
    exit("上传文件扩展名是不允许的扩展名。");
}
//以时间戳重命名文件
$new_name = time().".".$file_ext;
//将文件移动到存储目录下
move_uploaded_file($_FILES["file"]["tmp_name"],"$file_path" . $new_name);
//向数据表写入文件存储信息以便管理
//*********** 代码略 ***********//
echo "文件上传成功!";
exit;

} else {

echo "无正确的文件上传";

}