㈠ 怎样在php的Laravel框架中完成任务调度
<p>那个函数。最后return 一个返回值 .所以结果就把操作的运算符给打印出来了。没有把结果给到的结果return 出去。自然输出不 了</p><p>可以在最后一行的时候,把$sum的值和$oper一起return 出来
return $sum.$oper;
你可以去后盾人平台看看,里面的东西不错
㈡ PHP的路由是什么 还有什么通俗的说法吗
你所说的路由其实和路由器是一个道理, 通过一个入口接受请求, 然后通过(URL)匹配规则将请求分发到不同的地方。具体到一些主流框架上面,Router模块会配合Http模块分析请求, 并且按照一定规则解析去匹配路由,然后使用调度模块使逻辑调到某块代码(通常是控制器),最后返回响应(Response)。
所以说你就把这种路由当做家里用来上网的路由器, 道理是一样的。
㈢ TP框架的业务逻辑谁能给我说说
你是要系统流程吧?
这个手册里面有的。我给你粘贴一份吧
用户URL请求
调用应用入口文件(通常是网站的index.php)
载入框架入口文件(ThinkPHP.php)
记录初始运行时间和内存开销
系统常量判断及定义
载入框架引导类(ThinkThink)并执行Think::start方法进行应用初始化
设置错误处理机制和自动加载机制
调用ThinkStorage类进行存储初始化(由STORAGE_TYPE常量定义存储类型)
部署模式下如果存在应用编译缓存文件则直接加载(直接跳转到步骤22)
读取应用模式(由APP_MODE常量定义)的定义文件(以下以普通模式为例说明)
加载当前应用模式定义的核心文件(普通模式是ThinkPHP/Mode/common.php)
加载惯例配置文件(普通模式是ThinkPHP/Conf/convention.php)
加载应用配置文件(普通模式是Application/Common/Conf/config.php)
加载系统别名定义
判断并读取应用别名定义文件(普通模式是Application/Common/Conf/alias.php)
加载系统行为定义
判断并读取应用行为定义文件(普通模式是Application/Common/Conf/tags.php)
加载框架底层语言包(普通模式是ThinkPHP/Lang/zh-cn.php)
如果是部署模式则生成应用编译缓存文件
加载调试模式系统配置文件(ThinkPHP/Conf/debug.php)
判断并读取应用的调试配置文件(默认是Application/Common/Conf/debug.php)
判断应用状态并读取状态配置文件(如果APP_STATUS常量定义不为空的话)
检测应用目录结构并自动生成(如果CHECK_APP_DIR配置开启并且RUNTIME_PATH目录不存在的情况下)
调用ThinkApp类的run方法启动应用
应用初始化(app_init)标签位侦听并执行绑定行为
判断并加载动态配置和函数文件
调用ThinkDispatcher::dispatch方法进行URL请求调度
自动识别兼容URL模式和命令行模式下面的$_SERVER['PATH_INFO']参数
检测域名部署以及完成模块和控制器的绑定操作(APP_SUB_DOMAIN_DEPLOY参数开启)
分析URL地址中的PATH_INFO信息
获取请求的模块信息
检测模块是否存在和允许访问
判断并加载模块配置文件、别名定义、行为定义及函数文件
判断并加载模块的动态配置和函数文件
模块的URL模式判断
模块的路由检测(URL_ROUTER_ON开启)
PATH_INFO处理(path_info)标签位侦听并执行绑定行为
URL后缀检测(URL_DENY_SUFFIX以及URL_HTML_SUFFIX处理)
获取当前控制器和操作,以及URL其他参数
URL请求调度完成(url_dispatch)标签位侦听并执行绑定行为
应用开始(app_begin)标签位侦听并执行绑定行为
调用SESSION_OPTIONS配置参数进行Session初始化(如果不是命令行模式)
根据请求执行控制器方法
如果控制器不存在则检测空控制器是否存在
控制器开始(action_begin)标签位侦听并执行绑定行为
默认调用系统的ReadHtmlCache行为读取静态缓存(HTML_CACHE_ON参数开启)
判断并调用控制器的_initialize初始化方法
判断操作方法是否存在,如果不存在则检测是否定义空操作方法
判断前置操作方法是否定义,有的话执行
Action参数绑定检测,自动匹配操作方法的参数
如果有模版渲染(调用控制器display方法)
视图开始(view_begin)标签位侦听并执行绑定行为
调用ThinkView的fetch方法解析并获取模版内容
自动识别当前主题以及定位模版文件
视图解析(view_parse)标签位侦听并执行绑定行为
默认调用内置ParseTemplate行为解析模版(普通模式下面)
模版引擎解析模版内容后生成模版缓存
模版过滤替换(template_filter)标签位侦听并执行绑定行为
默认调用系统的ContentReplace行为进行模版替换
输出内容过滤(view_filter)标签位侦听并执行绑定行为
默认调用系统的WriteHtmlCache行为写入静态缓存(HTML_CACHE_ON参数开启)
调用ThinkView类的render方法输出渲染内容
视图结束(view_end)标签位侦听并执行绑定行为
判断后置操作方法是否定义,有的话执行
控制器结束(action_end)标签位侦听并执行绑定行为
应用结束(app_end)标签位侦听并执行绑定行为
执行系统的ShowPageTrace行为(SHOW_PAGE_TRACE参数开启并且不是AJAX请求)
日志信息存储写入
㈣ java有什么常用开源的框架
java常用开源框架如下:
1.Spring Framework 【Java开源JEE框架】
Spring是一个解决了许多在J2EE开发中常见的问题的强大框架。 Spring提供了管理业务对象的一致方法并且鼓励了注入对接口编程而不是对类编程的良好习惯。Spring的架构基础是基于使用JavaBean属性的Inversion of Control容器。然而,这仅仅是完整图景中的一部分:Spring在使用IoC容器作为构建完关注所有架构层的完整解决方案方面是独一无二的。
2.WebWork 【Java开源Web开发框架】
WebWork是由OpenSymphony组织开发的,致力于组件化和代码重用的拉出式MVC模式J2EE Web框架。
3.Struts 【Java开源Web开发框架】
Struts是一个基于Sun J2EE平台的MVC框架,主要是采用Servlet和JSP技术来实现的。由于Struts能充分满足应用开发的需求,简单易用,敏捷迅速,在过去的一年中颇受关注。Struts把Servlet、JSP、自定义标签和信息资源(message resources)整合到一个统一的框架中
4.Hibernate 【Java开源持久层框架】
Hibernate是一个开放源代码的对象关系映射框架,它对JDBC进行了非常轻量级的对象封装,使得Java程序员可以随心所欲的使用对象编程思维来操纵数据库。 Hibernate可以应用在任何使用JDBC的场合
5.Quartz 【Java开源调度框架】
Quartz是OpenSymphony开源组织在Job scheling领域又一个开源项目,它可以与J2EE与J2SE应用程序相结合也可以单独使用。Quartz可以用来创建简单或为运行十个,百个,甚至是好几万个Jobs这样复杂的日程序表。
6.Velocity 【Java开源模板引擎】
Velocity是一个基于java的模板引擎(template engine)。它允许任何人仅仅简单的使用模板语言(template language)来引用由java代码定义的对象。 当Velocity应用于web开发时,界面设计人员可以和java程序开发人员同步开发一个遵循MVC架构的web站点,也就是说,页面设计人员可以只关注页面的显示效果,而由java程序开发人员关注业务逻辑编码。Velocity将java代码从web页面中分离出来,这样为web站点的长期维护提供了便利,同时也为我们在JSP和PHP之外又提供了一种可选的方案。
7.IBATIS 【Java开源持久层框架】
使用ibatis 提供的ORM机制,对业务逻辑实现人员而言,面对的是纯粹的Java对象, 这一层与通过Hibernate 实现ORM 而言基本一致,而对于具体的数据操作,Hibernate 会自动生成SQL 语句,而ibatis 则要求开发者编写具体的SQL 语句。相对Hibernate等 “全自动”ORM机制而言,ibatis 以SQL开发的工作量和数据库移植性上的让步,为系统 设计提供了更大的自由空间。作为“全自动”ORM 实现的一种有益补充,ibatis 的出现显 得别具意义。
㈤ php面试题 memcache和redis的区别
Redis与Memcached的区别传统MySQL+ Memcached架构遇到的问题实际MySQL是适合进行海量数据存储的,通过Memcached将热点数据加载到cache,加速访问,很多公司都曾经使用过这样的架构,但随着业务数据量的不断增加,和访问量的持续增长,我们遇到了很多问题:1.MySQL需要不断进行拆库拆表,Memcached也需不断跟着扩容,扩容和维护工作占据大量开发时间。2.Memcached与MySQL数据库数据一致性问题。3.Memcached数据命中率低或down机,大量访问直接穿透到DB,MySQL无法支撑。4.跨机房cache同步问题。众多NoSQL百花齐放,如何选择最近几年,业界不断涌现出很多各种各样的NoSQL产品,那么如何才能正确地使用好这些产品,最大化地发挥其长处,是我们需要深入研究和思考的问题,实际归根结底最重要的是了解这些产品的定位,并且了解到每款产品的tradeoffs,在实际应用中做到扬长避短,总体上这些NoSQL主要用于解决以下几种问题1.少量数据存储,高速读写访问。此类产品通过数据全部in-momery 的方式来保证高速访问,同时提供数据落地的功能,实际这正是Redis最主要的适用场景。2.海量数据存储,分布式系统支持,数据一致性保证,方便的集群节点添加/删除。3.这方面最具代表性的是dynamo和bigtable 2篇论文所阐述的思路。前者是一个完全无中心的设计,节点之间通过gossip方式传递集群信息,数据保证最终一致性,后者是一个中心化的方案设计,通过类似一个分布式锁服务来保证强一致性,数据写入先写内存和redo log,然后定期compat归并到磁盘上,将随机写优化为顺序写,提高写入性能。4.Schema free,auto-sharding等。比如目前常见的一些文档数据库都是支持schema-free的,直接存储json格式数据,并且支持auto-sharding等功能,比如mongodb。面对这些不同类型的NoSQL产品,我们需要根据我们的业务场景选择最合适的产品。Redis适用场景,如何正确的使用前面已经分析过,Redis最适合所有数据in-momory的场景,虽然Redis也提供持久化功能,但实际更多的是一个disk-backed的功能,跟传统意义上的持久化有比较大的差别,那么可能大家就会有疑问,似乎Redis更像一个加强版的Memcached,那么何时使用Memcached,何时使用Redis呢?如果简单地比较Redis与Memcached的区别,大多数都会得到以下观点:1 Redis不仅仅支持简单的k/v类型的数据,同时还提供list,set,zset,hash等数据结构的存储。2 Redis支持数据的备份,即master-slave模式的数据备份。3 Redis支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。抛开这些,可以深入到Redis内部构造去观察更加本质的区别,理解Redis的设计。在Redis中,并不是所有的数据都一直存储在内存中的。这是和Memcached相比一个最大的区别。Redis只会缓存所有的 key的信息,如果Redis发现内存的使用量超过了某一个阀值,将触发swap的操作,Redis根据“swappability = age*log(size_in_memory)”计 算出哪些key对应的value需要swap到磁盘。然后再将这些key对应的value持久化到磁盘中,同时在内存中清除。这种特性使得Redis可以 保持超过其机器本身内存大小的数据。当然,机器本身的内存必须要能够保持所有的key,毕竟这些数据是不会进行swap操作的。同时由于Redis将内存 中的数据swap到磁盘中的时候,提供服务的主线程和进行swap操作的子线程会共享这部分内存,所以如果更新需要swap的数据,Redis将阻塞这个 操作,直到子线程完成swap操作后才可以进行修改。使用Redis特有内存模型前后的情况对比:VM off: 300k keys, 4096 bytes values: 1.3G usedVM on: 300k keys, 4096 bytes values: 73M usedVM off: 1 million keys, 256 bytes values: 430.12M usedVM on: 1 million keys, 256 bytes values: 160.09M usedVM on: 1 million keys, values as large as you want, still: 160.09M used当 从Redis中读取数据的时候,如果读取的key对应的value不在内存中,那么Redis就需要从swap文件中加载相应数据,然后再返回给请求方。 这里就存在一个I/O线程池的问题。在默认的情况下,Redis会出现阻塞,即完成所有的swap文件加载后才会相应。这种策略在客户端的数量较小,进行 批量操作的时候比较合适。但是如果将Redis应用在一个大型的网站应用程序中,这显然是无法满足大并发的情况的。所以Redis运行我们设置I/O线程 池的大小,对需要从swap文件中加载相应数据的读取请求进行并发操作,减少阻塞的时间。如果希望在海量数据的环境中使用好Redis,我相信理解Redis的内存设计和阻塞的情况是不可缺少的。补充的知识点:memcached和redis的比较1 网络IO模型Memcached是多线程,非阻塞IO复用的网络模型,分为监听主线程和worker子线程,监听线程监听网络连接,接受请求后,将连接描述字pipe 传递给worker线程,进行读写IO, 网络层使用libevent封装的事件库,多线程模型可以发挥多核作用,但是引入了cache coherency和锁的问题,比如,Memcached最常用的stats 命令,实际Memcached所有操作都要对这个全局变量加锁,进行计数等工作,带来了性能损耗。(Memcached网络IO模型)Redis使用单线程的IO复用模型,自己封装了一个简单的AeEvent事件处理框架,主要实现了epoll、kqueue和select,对于单纯只有IO操作来说,单线程可以将速度优势发挥到最大,但是Redis也提供了一些简单的计算功能,比如排序、聚合等,对于这些操作,单线程模型实际会严重影响整体吞吐量,CPU计算过程中,整个IO调度都是被阻塞住的。2.内存管理方面Memcached使用预分配的内存池的方式,使用slab和大小不同的chunk来管理内存,Item根据大小选择合适的chunk存储,内存池的方式可以省去申请/释放内存的开销,并且能减小内存碎片产生,但这种方式也会带来一定程度上的空间浪费,并且在内存仍然有很大空间时,新的数据也可能会被剔除,原因可以参考Timyang的文章:/memcached/)。Memcached的客户端软件实现非常多,包括C/C++, PHP, Java, Python, Ruby, Perl, Erlang, Lua等。当前Memcached使用广泛,除了LiveJournal以外还有Wikipedia、Flickr、Twitter、Youtube和WordPress等。在Window系统下,Memcached的安装非常方便,只需从以上给出的地址下载可执行软件然后运行memcached.exe –d install即可完成安装。在linux等系统下,我们首先需要安装libevent,然后从获取源码,make && make install即可。默认情况下,Memcached的服务器启动程序会安装到/usr/local/bin目录下。在启动Memcached时,我们可以为其配置不同的启动参数。1.1 Memcache配置Memcached服务器在启动时需要对关键的参数进行配置,下面我们就看一看Memcached在启动时需要设定哪些关键参数以及这些参数的作用。1)-p Memcached的TCP监听端口,缺省配置为11211;2)-U Memcached的UDP监听端口,缺省配置为11211,为0时表示关闭UDP监听;3)-s Memcached监听的UNIX套接字路径;4)-a 访问UNIX套接字的八进制掩码,缺省配置为0700;5)-l 监听的服务器IP地址,默认为所有网卡;6)-d 为Memcached服务器启动守护进程;7)-r 最大core文件大小;8)-u 运行Memcached的用户,如果当前为root的话需要使用此参数指定用户;9)-m 分配给Memcached使用的内存数量,单位是MB;10)-M 指示Memcached在内存用光的时候返回错误而不是使用LRU算法移除数据记录;11)-c 最大并发连数,缺省配置为1024;12)-v –vv –vvv 设定服务器端打印的消息的详细程度,其中-v仅打印错误和警告信息,-vv在-v的基础上还会打印客户端的命令和相应,-vvv在-vv的基础上还会打印内存状态转换信息;13)-f 用于设置chunk大小的递增因子;14)-n 最小的chunk大小,缺省配置为48个字节;15)-t Memcached服务器使用的线程数,缺省配置为4个;16)-L 尝试使用大内存页;17)-R 每个事件的最大请求数,缺省配置为20个;18)-C 禁用CAS,CAS模式会带来8个字节的冗余;2. Redis简介Redis是一个开源的key-value存储系统。与Memcached类似,Redis将大部分数据存储在内存中,支持的数据类型包括:字符串、哈希表、链表、集合、有序集合以及基于这些数据类型的相关操作。Redis使用C语言开发,在大多数像Linux、BSD和Solaris等POSIX系统上无需任何外部依赖就可以使用。Redis支持的客户端语言也非常丰富,常用的计算机语言如C、C#、C++、Object-C、PHP、Python、Java、Perl、Lua、Erlang等均有可用的客户端来访问Redis服务器。当前Redis的应用已经非常广泛,国内像新浪、淘宝,国外像Flickr、Github等均在使用Redis的缓存服务。Redis的安装非常方便,只需从bin目录下。在启动Redis服务器时,我们需要为其指定一个配置文件,缺省情况下配置文件在Redis的源码目录下,文件名为redis.conf。php面试题 memcache和redis的区别
㈥ php swoole 只能运行在php-cli 环境吗
一直想写点Swoole的东西,毕竟它重新定义了php,却一直不知道怎么下手写Swoole涉及的知识点非常多,互为表里,每次想写都发现根本理不出一个头绪Swoole是一个php的扩展,它的核心目的就是解决php在实现server服务中可能遇到的一系列问题,这些问题用源生的php往往并不能很高效(执行效率)的解决,一般也不会使用php来解决,所以会有说swolle重新定义的php的说法。
其实swoole也提供了一个框架,swoole framework是基于swoole extension设计的一个框架,要用好这个框架,还是要先了解swoole extension。
扩展的英文名称是Extension,php扩展是用C语言作为开发语言,基于Zend引擎提供的API,编译成的一个动态库。
如果曾经做过类似动态库调用开发的童鞋可能会更好理解一些,例如Android中的NDK开发在php的配置文件中配置好extension的属性后,就可以引用这个动态库了。
也就是说,swoole本身是用C语言编写的,它可以让php获得一些额外的function。
然后是运行方式,swoole的许多功能都只能运行在cli模式下,而cli模式往往是很多刚接触swoole的phper遇到的第一个问题。
有时候其实只是需要转变一下思路
我们现在整理一下最常见的php代码执行方式:
安装apache、php
配置apache对那个目录进行php解析
用浏览器访问那个目录的php文件
更多的细节这里就不提了,毕竟我相信每个phper对这个都是很熟悉的。
但这里就开始出现了第一个问题,我们知道,php是一个脚本语言,脚本语言的核心特点在于不用编译,随时执行,而执行脚本的工具就是解析器,而php的解析器就是zend引擎。
严格来说,zend并不是唯一的选择,不过,zend是最官方的。另外,Zend Studio和Zend Engine不是同一个东西,本文中的Zend全部指Zend Engine。
换个角度讲,只要有解析器,写好的php脚本就是可以执行的,而zend引擎与apache之间并没有绝对的关系实际上,apahce是调用了zend对php脚本进行执行,然后将执行结果输出给了浏览器所以所谓cli模式(CommandLine,命令行模式),其实就是在命令行下直接调用zend引擎对php脚本进行解析并执行,并获得程序输出结果的php脚本执行方式。
其实php也可以作为shell脚本来使用哦,就像bash shell一样既然问题讲清楚了,在一个系统中具体怎么操作呢?
本文以CentOS 7.5作为系统环境,swoole是针对linux系统开发的,windows下并不适用。学习swoole的一个前题是懂得基本的linux系统使用。
当安装好php的时候,找到php的安装目录,如果是默认安装的话,可以试试whereis命令# 某种简单的方法
whereis php
> /usr/local/bin/php;
locate whereis find这些命令都可以试试,目的是找到php然后我们来写一个最经典的php脚本:
<?php
//vi hello_cli.php
echo 'Hello PHP Cli';
编写纯php脚本时,php标签不要封口
然后我们在shell里执行它:
/usr/local/bin/php hello_cli.php
> Hello PHP Cli
这段代码中的第一个php,是一个可执行文件,它接受一个php脚本文件作为输入参数,并解析执行这个php脚本文件(通过zend)。
没有错,第一个cli模式下的php程序就被你执行成功了!
默认情况下,php都会被安装在了$PATH的目录下,那就可以直接省略路径前缀了,下文中调用php的时候,全都省略了路径前缀。
因为swoole是pecl的项目,所以使用pecl安装是最简单的方法,强烈推荐第一次接触的童鞋先使用pecl安装,在熟悉了swoole之后,再考虑使用编译安装的方式以获取更多进阶功能。
pecl这个工具基本都会被安装在与php相同的目录下(往往也都是$PATH目录)pecl install swoole
执行以下命令查看是否安装成功:
php -m | grep swoole
> swoole
如果正确的输出了swoole,那么恭喜你,这次安装很成功另一个常见的比较麻烦的问题是,有些童鞋的电脑里安装了多个php,而安装的时候没有正确的安装到预期的php的扩展目录中,就会导致无法正常工作,解决方案就是弄清楚各个php安装目录及配置关系,选择正确的目录进行安装。
其实本文还没正式开始介绍swoole,都是在学习swoole之前的准备工作,swoole的上手门槛比一般的php应用要高的多,如果没有网络开发和操作系统方面的一些知识,学习它并不是一件容易的事情,学习曲线很陡峭。
这句话我在群里说了无数次
很多新手会诟病swoole的手册写的太模糊,其实是前置知识不足,而手册也给出了需要的前置知识列表,以下引用至官网的手册-学习swoole需要哪些知识?
多进程/多线程
了解Linux操作系统进程和线程的概念
了解Linux进程/线程切换调度的基本知识
了解进程间通信的基本知识,如管道、UnixSocket、消息队列、共享内存socket
了解SOCKET的基本操作如accept/connect、send/recv、close、listen、bind了解SOCKET的接收缓存区、发送缓存区、阻塞/非阻塞、超时等概念IO复用
了解select/poll/epoll
了解基于select/epoll实现的事件循环,Reactor模型了解可读事件、可写事件
TCP/IP网络协议
了解TCP/IP协议
了解TCP、UDP传输协议
调试工具
使用gdb调试Linux程序
使用strace跟踪进程的系统调用
使用tcpmp跟踪网络通信过程
其他Linux系统工具,如ps、lsof、top、vmstat、netstat、sar、ss等学习并理解一个新事务并不是一个容易的事情,特别对于swoole这种具备一定颠覆性的工具,要有耐心和实践。
淡定的把手册看完,遇到不理解的名词学会使用搜索引擎学习,swoole的手册其实是个大宝库,网络开发常见的问题其实里边都涉及到了。
㈦ 有哪些适合练手的PHP项目
1. 项目名称:轻量级 B2C 商城系统
项目简介:本项目是一个拥有 PC 端 + H5 移动端的超轻量,功能强大的 B2C 商城系统。
技术实现:
核心框架:基于全新超轻量高性能Speed框架
JS框架:jQuery 1.10.2
移动端JS框架:Zepto 1.2.0
图表库:Flot 0.8.3
富文本编辑器:网络 精简版 UMeditor
JS模板引擎:Juicer 0.6.8
运行环境:
操作系统: Windows / Linux / Unix
Web 服务器:Apache / Nginx / IIS
PHP 版本:5.2 及以上
MySQL 版本:5.0 及以上
生产环境推荐:Linux + Nginx + PHP5.5 + MySQL5.6
项目地址:cigery/verydows - 码云
2、项目名称:基于 PHP 的轻量级路由器
项目简介:非常轻量级的路由器。无依赖、简洁、速度快、自定义性强。
轻量级且速度快,查找速度不受路由数量的影响。
支持路由参数定义,以及路由选项(比如设定 domains、schema 等检查限制)。
支持请求方法:GET POST PUT DELETE HEAD OPTIONS ...
支持事件: found notFound execStart execEnd execError,当触发事件时你可以做一些事情(比如记录日志等)。
支持动态获取 action 名。支持设置方法执行器(actionExecutor),通过方法执行器来自定义调用真实请求方法。
支持自动匹配路由到控制器就像 yii 一样,请参看配置项 autoRoute。
支持通过方法 SRouter::dispatch($path, $method) 手动调度一个路由。
你也可以不配置任何东西,它也能很好的工作。
项目地址:inhere/php-srouter - 码云
3. 项目名称:轻量级论坛社区系统
项目简介:本项目是一个基于 CodeIgniter 框架开发的 PHP 新型社区系统,她轻量小巧、简单易用、强大高效,又简称 ”STB(烧饼 BBS)。
项目地址:烧饼/startbbs - 码云
4. 项目名称:基于 PHP 的三维验证码
<img src="https://pic2.mg.com/50/v2-_hd.png" data-rawwidth="360" data-rawheight="80" class="content_image" width="360">
项目简介:打破传统的,基于 PHP 的 3d 英文字母验证码,图片粒子化,机器难以识别边界,破解难度极大。
项目地址:Quekie/Safe 3D Identifying Code
5. 项目名称:基于 PHP 的多进程网络爬虫框架
<img src="https://pic4.mg.com/50/v2-_hd.jpg" data-rawwidth="650" data-rawheight="800" class="origin_image zh-lightbox-thumb" width="650" data-original="https://pic4.mg.com/v2-_r.jpg">
项目简介:Beanbun 是一个简单可扩展的爬虫框架,支持分布式,支持守护进程模式与普通模式,守护进程模式基于 Workerman,下载器基于 Guzzle。
特点:
支持守护进程与普通两种模式(守护进程模式只支持 Linux 服务器)
默认使用 guzzle 进行爬取
支持分布式
支持内存、Redis 等多种队列方式
支持自定义URI过滤
支持广度优先和深度优先两种爬取方式
遵循 PSR-4 标准
爬取网页分为多步,每步均支持自定义动作(如添加代理、修改 user-agent 等)
灵活的扩展机制,可方便的为框架制作插件:自定义队列、自定义爬取方式...
项目地址:Kiddyu/Beanbun - 码云
㈧ HDwiki架构
MVC
php是嵌入式语言,最简单但也是最繁琐的就是php和html嵌套着写,开发维护绝对能让人产生暴力冲动.所以HDwiki采用了mvc模式,可以方便开发人员分工协作,提高开发效率,增强程序的可维护性和扩展性,而且还利用Controller将Model与View分离,降低它们之间的耦合度.
HDwiki中,一个请求发过来后(如index.php?doc-view-1),调度控制器(hdwiki.class.php) 会根据请求决定由哪个控制器的哪个方法去处理,本例中是doc这个控制器的doview方法去处理,这个控制器文件便是/control/doc.php,doc这个控制器的doview方法负责处理业务部分(比如数据校验,业务逻辑),调用模型(model)和视图(view).模型主要是根据要求取的数据,可以是从数据库去,也可是是从文件中去,还可以是从内存中去,归根到底一句话,根据业务逻辑处理数据.而视图就是要将我们处理好的数据显示出来,控制器将要显示的数据发给视图,视图根据要求就将显示的样式,html代码,要显示的数据处理成一个模板文件,最后显示出来.这样一个请求便处理完了.可能会有哥们要问了,为什么能根据index.php?doc-view-1能知道控制器是哪个,方法是哪个?这就是我们要说的下一个关键词---URL
URL
HDwiki中的url形式为index.php?doc-view-1,index.php是所有请求的唯一入口,query_string以"-"分割,第一个doc表示调用的控制器文件,路径是/control/doc.php,第二个"view"是要调用的控制器的方法doview,后面的参数"1"(或者更多的参数)均是doview方法中需要的参数,顺序是自定义的,等等,url中明明是view,怎么调用的是doview方法呢?在hdwiki系统里可以从url中知道要访问的方法名称,但是如果control中有方法不想被url直接访问,也就要区分开,所以需要在所有url中集中处理,能被直接访问的统一加do.
权限
HDwiki的权限可能是最独树一帜的,每个用户的是否有访问权限完全根据url来判断.我们给用户分组,比方说管理员组,词条管理员组,普通用户组,匿名组等,每个组都有一坨的可访问的url列表,你在哪个组,你就只能访问那些url,也就是那些应用,每个url都是一个权限控制.你能访问的url都会被控制.当然一个url中大家都可以看,但是有部分是有限制的,这就需要做点点调整,比如匿名用户看到的是"请登录",登录用户看到的是"退出",这个我们就会辅助以用户组id来判断.
标签
hdwiki的标签功能能让站长和开发者更方便快捷的添加要显示的各种数据,基本表现形式是在页面中添加例如 {hdwiki:docnumber /}的数据,便能显示总词条数.其原理也很简单,就是根据标签正则匹配,然后调用相应的方法去调用数据,当然,每个标签要调用的方法都已经写好了全部保存在model/tag.class.php中,以{hdwiki:docnumber /}为例,当调用页面时,它被解析成$_ENV['tag']->docnumber(),而这段代码便是去调用/model/tag.class.php的docnumber这个方法,这个方法便调出总词条数的数值.这样,只要在tag.class.php中存在的方法,就可以在任何页面调用了.
㈨ 怎么在thinkphp添加数据时获取自动增长的id
下面是TP5的方法,TP3的在添加后变量直接就获取了。添加数据后如果需要返回新增数据的自增主键,可以使用 getLastInsID 方法:
Db::name('user')->insert($data);
$userId = Db::name('user')->getLastInsID();或者直接使用 insertGetId 方法新增数据并返回主键值:
Db::name('user')->insertGetId($data);
㈩ 各种语言写网络爬虫有什么优点缺点
我用 PHP 和 Python 都写过爬虫和正文提取程序。
最开始使用 PHP 所以先说说 PHP 的优点:
1.语言比较简单,PHP 是非常随意的一种语言。写起来容易让你把精力放在你要做的事情上,而不是各种语法规则等等。
2.各种功能模块齐全,这里分两部分:
1.网页下载:curl 等扩展库;
2.文档解析:dom、xpath、tidy、各种转码工具,可能跟题主的问题不太一样,我的爬虫需要提取正文,所以需要很复杂的文本处理,所以各种方便的文本处理工具是我的大爱。;
总之容易上手。
缺点:
1.并发处理能力较弱:由于当时 PHP 没有线程、进程功能,要想实现并发需要借用多路服用模型,PHP 使用的是 select 模型。实现其来比较麻烦,可能是因为水平问题我的程序经常出现一些错误,导致漏抓。
再说说 Python:
优点:
1.各种爬虫框架,方便高效的下载网页;
2.多线程、进程模型成熟稳定,爬虫是一个典型的多任务处理场景,请求页面时会有较长的延迟,总体来说更多的是等待。多线程或进程会更优化程序效率,提升整个系统下载和分析能力。
3.GAE 的支持,当初写爬虫的时候刚刚有 GAE,而且只支持 Python ,利用 GAE 创建的爬虫几乎免费,最多的时候我有近千个应用实例在工作。
缺点:
1.对不规范 HTML 适应能力差:举个例子,如果一个页面里面同时有 GB18030 字符集的中文和 UTF-8 字符集的中文,Python 处理起来就没有 PHP 那么简单,你自己需要做很多的判断工作。当然这是提取正文时的麻烦。
Java 和 C++ 当时也考察过,相对脚本语言比较麻烦,所以放弃。
总之,如果开发一个小规模的爬虫脚本语言是个各方面比较有优势的语言。如果要开发一个复杂的爬虫系统可能 Java 是个增加选项, C++ 我感觉写个模块之类的更加适合。对于一个爬虫系统来说,下载和内文解析只是基本的两个功能。真正好的系统还包括完善的任务调度、监控、存储、页面数据保存和更新逻辑、排重等等。爬虫是一个耗费带宽的应用,好的设计会节约大量的带宽和服务器资源,并且好坏差距很大。