php的或

常用编程语言的优缺点(上)

php的优点

1. 跨平台,性能优越,跟Linux/Unix结合别跟Windows结合性能强45%,开发成本低,

PHP最经典的组合就是:Linux + Apache + MySQL + PHP。非常适合开发中小型的web应用,因为上手容易,所以开发的速度比较快。而且所有的软件都是开源免费的,可以减少投入。

比如LAMP(Linux /Apache/Mysql/PHP)或者FAMP(FreeBSD/Apache/Mysql/PHP)结合,或者数据应用够大可以考虑换 PostgreSQL或者Oracle,支持N种数据库。(N >= 10)2. 语法简单,入门快,如果有其它语言基础的程序员二周左右的时间基本可以入门,并且跟ASP有部分类似。有成熟的开发工具,比如NuPHPed,或者Zend Studio等等,再Linux平台下可以使用Eclipse等等。3. 目前主流技术都支持,比如WebService、Ajax、XML等等,足够应用。4. 有比较完整的支持,比如使用ADODB或者PEAR::DB做数据库抽象层,用Smarty或者smart template做模板层,如果是PHP 5.1的话,还能够使用PDO(PHP Data Object)来访问数据库。5. 有很多成熟的框架,比如支持MVC的框架:phpMVC,支持类似ASP.net的事件驱动的框架:Prado,支持类似Ruby On Rails的快速开发的框架:Cake等等,足够满足你的应用需求。6. PHP 5已经有成熟的面向对象体系,能够适应基本的面向对象要求。适合开发大型项目。7. 有成熟的社区来支持PHP的开发。

8. 目前已经很多大型应用都是使用PHP,比如淘宝网、Yahoo、163、Sina等等大型门户,很多选用PHP来作为他们的开发语言,所以大型门户都能够选用它,我想足够能够你的使用了。(据了解现在内部都在逐渐转向JAVA)

9. 有很多开源的框架或开源的系统可以使用,比如比较知名的开源框架有Zend Framework、CakePHP、CodeIgniter、symfony等,开源论坛有Discuz!、Phpwind等,开源博客 WordPress,开源网店系统如Ecshop、ShopEx等,开源的SNS系统如UCHome、ThinkSNS等。PHP是解释性的脚本语言,写完代码以后即可以执行,不像c,java,c++等语言还需要去编译执行,相对来说比较节省时间。10.相对来说,PHP程序员的薪水的平均工资要比c,c++,java程序员的平均工资要低一些,特别是对于中小型企业来说可以节约一些成本。11.配置及部署相对简单一些,对比JAVA开发来说,JAVA开发的配置就复杂多了,什么Structs、Spring、Hibernate、Tomcat等等很多地方都需要配置,甚至你在程序中每写一个SQL语句都需要先在Hibernate中配置一下,有时重新部署一个class文件或jar文件还可能需要重启Web服务器(Tomcat或Resin或其它的Web服务器)使新部署的库文件生效。PHP开发中主要是PHP自身的配置文件及Web服务器的配置(如Apache或Nginx或Lighttpd等),相对于JAVA来说还是简单一些,而且新修改了文件以后不需要重新启动Web即可以立即生效。12.有很多开源的框架或开源的系统可以使用,比如比较知名的开源框架有Zend Framework、CakePHP、CodeIgniter、symfony等,开源论坛有Discuz!、Phpwind等,开源博客WordPress,开源网店系统如Ecshop、ShopEx等,开源的SNS系统如UCHome、ThinkSNS等。缺点

1.对多线程支持不太好,大多数时候我们只能简单的模拟去实现的。

2.语法不太严谨,比如变量不需要定义就可以使用,在c,Java,c++中变量是必须先定义以后才可以使用的。

3.也许有经验的PHP程序员最感到痛苦的地方是PHP的解释运行机制。这种运行机制使得每个PHP页面被解释执行后,所有的相关资源都会被回收。也就是说,PHP在语言级别上没有办法让某个对象常驻内存。在PHP中,所有的变量都是页面级的,无论是全局变量,还是类的静态成员,都会在页面执行完毕后被清空。以JSP为例,在JSP中,Java Bean的scope有四种有效值:Page、Application、Session、Request,分别对应页面、程序、会话、请求四种生存期。但在PHP中,只有Page一种生存期。

C#C#是一种精确、简单、类型安全、面向对象的语言。

说到C#,就不得不先简单介绍一下.net。到底什么是.net呢,按照微软总裁兼首席执行官Steve Ballrner把它定义为:.Net代表一个集合,一个环境,它可以作为平台支持下一代Internet的可编程结构。C#是.net的代表语言。 C#的特点: 1. 完全面向对象。 2. 支持分布式,之所以有C#,是因为微软相信分布式应用程序是未来的趋势,即处理过程分布在客户机和服务器上。所以C#一出生就注定了能很好解决分布式问题。3. 跟Java类似,C#代码经过编译后,成为了一种IL(中间语言)。在运行时,再把IL编译为平台专用的代码。 4. 健壮,C#在检查程序错误和编译与运行时错误一点也不逊于Java,C#也用了自动管理内存机制。 5. C#不像Java那样完全摒弃了指针和手动内存管理。C#默认情况下是不能使用指针的,程序员在有必要时可以打开指针来使用。这样可以保证编程的灵活性。 6. 安全性:C#的安全性是有.net平台来提供的。C#代码编译后成为IL语言。是一种受控代码,.net提供类型安全检查等机制保证代码是安全的。 7. 可移植性:由于C#使用类似Java的中间语言机制。使得C#也跟Java类似,可以很方便的移植到其他系统。在运行时,再把中间代码编译为适合特定机器的代码。 8. 解释性:C#也是一种特殊的解释性语言。9. 高性能:C#把代码编译成中间语言后,可以高效的执行程序。10. 多线程:与Java类似,可以由一个主进程分出多个执行小任务的多线程。 11. 组件模式:C#很适合组件开发。各个组件可以由其他语言实现的,然后集成在.net中。 C#是在Java流行起来后所诞生的一种新的语言。由于微软在操作系统上占有很大的优势。在以往的开发中累积了不少经验,所形成的.net平台,所以C#在Windows方面可以说比Java具有更大的优势。如果单纯从技术上来讲,C#在网络编程上可以与Java匹敌。C#还在Windows Forms也有一定的优势。 C#是一种非常类似于C++的语言,风格是更接近于Java,不管是C++程序员还是Java程序员,都可以很方便的转到C#上来。C#的强大是依赖于.net的发展,而.net的发展是看微软在.net上的决心和投入有多少。从Windows 2003和Vista系统可以看出(前者内置.net1.1,后者内置.net2.0。).Net在Windows编程中具有重要的战略意义。 C#目前主要是应用在网络编程上,其他领域比如数据库、窗体编程,都逐渐在增大。

Python

Python的优缺点

优点

1.简单————Python是一种代表简单主义思想的语言。阅读一个良好的Python程序就感觉像是在读英语一样,尽管这个英语的要求非常严格!Python的这种伪代码本质是它最大的优点之一。它使你能够专注于解决问题而不是去搞明白语言本身。

2.易学————就如同你即将看到的一样,Python极其容易上手。前面已经提到了,Python有极其简单的语法。

3.免费、开源————Python是FLOSS(自由/开放源码软件)之一。简单地说,你可以自由地发布这个软件的拷贝、阅读它的源代码、对它做改动、把它的一部分用于新的自由软件中。FLOSS是基于一个团体分享知识的概念。这是为什么Python如此优秀的原因之一——它是由一群希望看到一个更加优秀的Python的人创造并经常改进着的。

4.高层语言————当你用Python语言编写程序的时候,你无需考虑诸如如何管理你的程序使用的内存一类的底层细节。

5.可移植性————由于它的开源本质,Python已经被移植在许多平台上(经过改动使它能够工作在不同平台上)。如果你小心地避免使用依赖于系统的特性,那么你的所有Python程序无需修改就可以在下述任何平台上面运行。这些平台包括Linux、Windows、FreeBSD、Macintosh、Solaris、OS/2、Amiga、AROS、AS/400、BeOS、OS/390、z/OS、Palm OS、QNX、VMS、Psion、Acom RISC OS、VxWorks、PlayStation、Sharp Zaurus、Windows CE甚至还有PocketPC、Symbian以及Google基于linux开发的Android平台!

6.解释性————这一点需要一些解释。一个用编译性语言比如C或C++写的程序可以从源文件(即C或C++语言)转换到一个你的计算机使用的语言(二进制代码,即0和1)。这个过程通过编译器和不同的标记、选项完成。当你运行你的程序的时候,连接/转载器软件把你的程序从硬盘复制到内存中并且运行。而Python语言写的程序不需要编译成二进制代码。你可以直接从源代码 运行 程序。在计算机内部,Python解释器把源代码转换成称为字节码的中间形式,然后再把它翻译成计算机使用的机器语言并运行。事实上,由于你不再需要担心如何编译程序,如何确保连接转载正确的库等等,所有这一切使得使用Python更加简单。由于你只需要把你的Python程序拷贝到另外一台计算机上,它就可以工作了,这也使得你的Python程序更加易于移植。

7.面向对象————Python既支持面向过程的编程也支持面向对象的编程。在“面向过程”的语言中,程序是由过程或仅仅是可重用代码的函数构建起来的。在“面向对象”的语言中,程序是由数据和功能组合而成的对象构建起来的。与其他主要的语言如C++和Java相比,Python以一种非常强大又简单的方式实现面向对象编程。

8.可扩展性————如果你需要你的一段关键代码运行得更快或者希望某些算法不公开,你可以把你的部分程序用C或C++编写,然后在你的Python程序中使用它们。

9.可嵌入性————你可以把Python嵌入你的C/C++程序,从而向你的程序用户提供脚本功能。

10.丰富的库————Python标准库确实很庞大。它可以帮助你处理各种工作,包括正则表达式、文档生成、单元测试、线程、数据库、网页浏览器、CGI、FTP、电子邮件、XML、XML-RPC、HTML、WAV文件、密码系统、GUI(图形用户界面)、Tk和其他与系统有关的操作。记住,只要安装了Python,所有这些功能都是可用的。这被称作Python的“功能齐全”理念。除了标准库以外,还有许多其他高质量的库,如wxPython、Twisted和Python图像库等等。

概括————Python确实是一种十分精彩又强大的语言。它合理地结合了高性能与使得编写程序简单有趣的特色。

规范的代码————Python采用强制缩进的方式使得代码具有极佳的可读性。

缺点

强制缩进

这也许不应该被称为局限,但是它用缩进来区分语句关系的方式还是给很多初学者带来了困惑。即便是很有经验的Python程序员,也可能陷入陷阱当中。最常见的情况是tab和空格的混用会导致错误,而这是用肉眼无法分别的。

单行语句和命令行输出问题

很多时候不能将程序连写成一行,如import sys;for i in sys.path:print i。而perl和awk就无此限制,可以较为方便的在shell下完成简单程序,不需要如Python一样,必须将程序写入一个.py文件。(对很多用户而言这也不算是限制)

NO.1 运行速度,有速度要求的话,用C++改写关键部分吧。

NO.2 国内市场较小(国内以python来做主要开发的,目前只有一些 web2.0公司)。但时间推移,目前很多国内软件公司,尤其是游戏公司,也开始规模使用他。

No.3 中文资料匮乏(好的python中文资料屈指可数)。托社区的福,有几本优秀的教材已经被翻译了,但入门级教材多,高级内容还是只能看英语版。

NO.4 构架选择太多(没有像C#这样的官方.net构架,也没有像ruby由于历史较短,构架开发的相对集中。Ruby on Rails 构架开发中小型web程序天下无敌)。不过这也从另一个侧面说明,python比较优秀,吸引的人才多,项目也多。

展开
收起

php程序员鱼龙混杂?如何才能成为不可或缺的技术人才

程序员危机是一个真实存在的问题。也有人说是互联网行业的下滑或者互联网行业已过了风口等等。我在这儿主要谈的是 PHP 程序员的危机,而这种危机多半来自于丰富的语言种类和公司对语言的选择上。

PHP 从诞生到现在已经有20多年历史,从Web时代兴起到移动互联网退潮,互联网领域各种编程语言和技术层出不穷, Node.js 、 GO 、 Python 不断地在挑战 PHP 的地位。这些技术的推动者非常热衷于唱衰 PHP , PHP 语言的未来在哪里?PHP 程序员当如何应对未来的变革?

作为老牌的Web后端编程语言,PHP 在全球市场占有率非常高,仅次于 Java ,从各个招聘网站的数据上来看PHP 开发的职位非常多,薪资水平也非常不错。实际在中小企业、互联网创业公司PHP的市场地位是高于 Java 的。Java 在超大型企业、传统软件行业、金融领域优势更大。

目前来看 Node.js、 GO 、 Python 、 Ruby 等语言还难以企及PHP和Java。

一个合格的PHP程序员必须具备以下六点。

(1) 熟悉HTML/CSS/JS等网页基本元素,完成阶段可自行制作简单的网页,对元素属性相对熟悉。

(2) 理解动态语言的概念和运做机制,熟悉基本的PHP语法。

(3) 学习如何将PHP与HTML结合起来,完成简单的动态页面。

(4) 接触学习MySQL,开始设计数据库。

(5) 不断巩固PHP语法,熟悉大部分的PHP常用函数,理解面向对象编程,MySQL优化,以及一些模板和框架。

(6) 最终完成一个功能齐全的动态站点。

技术能力

1)初级PHP:Thinkphp,Yii, Laravel等驾轻就熟,增删改查必备。

2)中级PHP:get进阶技--数据库索引和优化自不必说,分表分库还是要有的,memcache和redis的使用频率不能低于月次,不了解前端是不是说不过去了?

3)高级PHP: 除了上面的条件外,还要有门面担当的素质,玩转Linux常用指令,熟悉memcache和redis 原理,对于算法和数据结构有你敢问我就敢答的自信,Hadoop,hive,spark不过是平常的玩具,最重要的还是经历过大场面(有处理过百万日PV网站高并发,大数据的经验)

影响PHP工程师薪资的因素

工作年限

1)普遍情况下北京PHP薪资水平。3年以下PHPer,年限差异对薪资影响不大,主要是积累的阶段。

2)3-5年的PHPer会出现分水岭,薪资跨度较大,跟程序员的自我修养有比较大的关系,此段位的程序员由于经验和精力等原因,会成为公司coding的主力,部分中小型公司也有机会转型到技术管理。当然也有部分有情怀的程序员开始创业。

3)5-8年的PHP发展会往技术或者管理两个方向,不过在中国,程序员普遍发展的轨迹,很少有程序员过了35岁还奋斗在一线(都35了还能熬夜么?),并且在市场上竞争力也会减弱,所以大部分会提早走上管理之路。

PHP入门易,精通难,且做且珍惜!从PHP的发展来看,除了先天条件,后天的规划也很重要,做一枚安静的屌丝or出任CTO,迎娶白富美?选择什么样的平台很关键,大平台技术好,福利高,有保障,但是空间小,像螺丝钉。发展型公司氛围好,产品前景不错,空间大,但是风险大,选择各有利弊,结合自己不同阶段的追求,才能做出最适合自己的选择。

总结

互联网行业不是一个进入就可以高枕无忧的行业,你需要不断地学习,提升自己。

想要进入这个行业的准程序员们也不要泄气,你要找到正确的方法和途径。很多线下的培训机构都稂莠不齐,请慎重选择。如果你学不会在网络中找资料,那就说明有问题了。因为现在网络资源这么发达,找资料是比较容易的。

PHP 程序员不需要有太大的语言本身的危机感。

快速成长的关键是要对自己有一个正确的认识,不盲目跟风。注意根据场景来学习,能够思考并解决场景中遇到的问题,解决或优化瓶颈问题。这个过程中也是一个很好的学习过程。

展开
收起

ThinkPHP5.0使用SQL函数或运算

如果需要在查询中使用SQL函数或者运算,例如在field方法、update等方法中,可以用下面的方式。

虽然大部分时候都建议用PHP的运算和方法来替代SQL运算和函数,但该方式在复杂查询的时候仍然可以发挥作用。基本运算和字段的递增递减框架的查询类已经做好了封装,例如上面的写法可以改为:

Db::table('user')->count();Db::table('data') ->where('id', 1) ->setInc('read_times');

在后面的聚合查询部分会列出全部的聚合运算方法,关于字段的运算和设置可以参考后面的快捷更新。查询类封装了常用的聚合查询方法,包括:

示例代码:

聚合查询方法同样支持fetchSql方法。

展开
收起

zblogPHP备份迁移的图文教程

说真的,在我印象里关于zblog网站迁移来说是没有什么技术难题的,当然跟别的程序不太一样,别的网站程序,数据迁移可能需要修改很多的配置文件才行或者说某些文件修改比较费劲,那时我就建议用帝国备份是做,zblog本身迁移就很简单,但是最近有几个网友一直在问我关于网站迁移的问题,索性有时间就做一个简单的小教程,老司机请绕行~~~

windows和linux备份基本是一样的,指示windows有图形界面可能更好操作,我的网站采用的是linux系统+宝塔控制面板(宝塔用户还是很多的,简单介绍一些)

首先我们先登录宝塔控制面板账户:找到左侧文件-右侧需要备份的文件夹(例如我的001666),然后点击右侧压缩。如图:

系统会提示,压缩的目录,一般情况下默认就好,点击压缩

然后稍等,等待压缩,时间由网站数据大小觉得,我的数据不是很多,大概几十秒,然后就能看见压缩的文件,然后点击下载即可,如图:

网站数据就备份完成了,接下来备份mysql数据库文件,找到左侧菜单栏的“数据库”找到你网站的数据库名(别问我是哪个,我可不知道你的数据库名称。)然后点击右侧的“管理”按钮,如图:

点击管理之后会弹出一个新的mysql页面,找到对应的数据库,然后点击,查看右上方的导出按钮,开始备份数据库,如图:

一般来说,直接点击执行即可,不需要修改什么,直接弹出下载页面,下载到本地即可。如图:

到目前未知网站的备份已经全部完成,任务已经完成一大半了,接下来就是把下载到本地的网站数据和mysql数据库做好备份,然后上传到新的网站空间。(别问我怎么上传到新空间,我是不会告诉你的)

上传到新空间,然后找到左侧菜单“文件”找到网站目录,看见你刚刚上传的备份文件,点击右侧的“解压”按钮,如图:

“解压到”目录自己设置好或者不知道怎么弄的就默认,记住目前的路径就行了。然后就是等待解压完成。网站数据已经迁移完成,我们在恢复以下mysql数据库。还是找到左侧菜单的“数据库”,然后找到要还原的数据库,点击右侧管理(不截图了,跟上面备份mysql是一样的)然后进入数据库,在弹出的mysql数据库页面,点击数据库名,找到右上方的导入按钮,如图:

因为是新建立的数据库,所以应该跟图片一样,显示“数据库中没有表”然后点击导入按钮(什么你的数据库有表?那也好办全部删除即可,谨慎,不确定是否有用就先备份以下,原理同上)

还是什么都不用例会,默认就好,点击选择文件,找到你刚才下载到本地的数据库,确定之后往下翻,点击执行,就完成了。

到这里网站和数据的备份迁移就大功告成了,可以打开你的网站了,你以为你真的能打开么?哈哈你太天真啦,看见这个图片没?“MySQL数据库无法连接,可能的错误原因您在zb_users/c_option.php内配置、或刚才填写的的 MySQL 连接信息是否正确?您所连接的 MySQL 数据库是否已经成功启动?”

是的,网站是打不开的,因为数据库还没有修改配置文件(这里重点说下,也许你迁移网站之后可以打开,也是需要按如下操作修改的,因为可能你之前的是虚拟主机,数据库的地址还有账号密码都是之前的,但是如果你不修改的话,数据还是储存到之前的数据库里)

如图所示

找到FTP目录下的“/zb_users/c_option.php”文件,右键编辑(不要用文本形式打开所有php文件,可以使用EditPlus)

修改图片中的数据库的相关配置文件

展开
收起

PHP如何让数组所有键值都变成大写或小写 - 带你玩转PHP函数系列

在PHP开发的时候,我们有时候会需要把数组键值统一变成大写或者统一变成小写,特别是在获取数组的键值不规范的时候,那么我们怎么实现这个效果呢?

带你玩转PHP函数系列

开发工具/浏览器

PHP开发环境(本文使用的是WAMP)

代码编辑器(本文用的是PHPstorm)

谷歌浏览器

流程/步骤

1.首先我们需要模拟一个键值不规范的数组,PHP代码及浏览效果如图所示

2.要实现我们的效果我们要用到PHP的array_change_key_case()函数,该函数具体说明如图所示

3.使用array_change_key_case()函数,第二个参数传CASE_UPPER选项,可以把数组的键值变成大写英文字母

4.使用array_change_key_case()函数,第二个参数传CASE_LOWER选项,可以把数组的键值变成小写英文字母

5.总结

1).当我们遇到键值不规范的数组时

2).使用array_change_key_case()函数,第二个参数传CASE_UPPER选项,可以把数组的键值变成大写英文字母

3).使用array_change_key_case()函数,第二个参数传CASE_LOWER选项,可以把数组的键值变成小写英文字母

注意事项

PHP有很多实用的函数是大家以前忽略掉的,本系列的文章会为大家详细介绍所有PHP函数

希望本系列的文章能够给大家带来帮助节省大家解决问题的时间

展开
收起

Python是否会成为下一个PHP或者Java

首先,Python与PHP都是目前IT互联网行业内流行程度比较高的编程语言,但是Python与PHP的区别也比较明显,一方面Python是非常典型的全场景编程语言,而PHP则主要应用在Web开发领域,另一方面Python不仅在IT互联网行业内有大量的应用,在传统行业领域也有较为广泛的应用,而PHP则主要应用在IT互联网行业。

从当前的发展趋势来看,Python显然不会走PHP的老路,借助于工业互联网的推动,未来Python语言将随着大数据、物联网和人工智能等技术而得到更加广泛地应用,自身的功能边界和应用边界会不断得到拓展,从这个角度来看,未来Python的前景还是非常广阔的。相比之下,PHP虽然在Web开发领域占据着较大的优势,但是应用场景单一在一定程度上限制了PHP的发展,实际上这一点在云计算和大数据时代,已经有了一定的体现。

当前与Python对比比较多的另一个编程语言是Java,一方面原因是二者同为全场景编程语言,另一方面原因是Java语言的流行程度也非常高,直到今天Java语言依然是生产场景下非常重要的选择之一。从Python的发展趋势来看,Python也不会走Java的发展路线,Python的设计思想决定了Python更注重“整合”,这是一种维度比较高的设计,在云计算时代,这种设计思想对于程序员来说是非常方便的,从这个角度来看,Python与PHP也有相似之处,都是在不同的技术时代,让程序员能够更加方便地实现开发任务。

最后,对于当前要进入IT互联网行业发展的人来说,如果仅仅学习Python很难具有较强的岗位竞争力,还需要注重自身知识结构的完整性和实践能力的提升。

我从事互联网行业多年,目前也在带计算机专业的研究生,主要的研究方向集中在大数据和人工智能领域,我会陆续写一些关于互联网技术方面的文章,感兴趣的朋友可以关注我,相信一定会有所收获。

如果有互联网、大数据、人工智能等方面的问题,或者是考研方面的问题,都可以在评论区留言,或者私信我!

展开
收起

PHP高级之一次请求处理过程或生命周期详解

简介先看看下面这个过程:

我们从未手动开启过PHP的相关进程,它是随着Apache的启动而运行的;PHP通过mod_php5.so模块和Apache相连(具体说来是SAPI,即服务器应用程序编程接口);PHP总共有三个模块:内核、Zend引擎、以及扩展层;PHP内核用来处理请求、文件流、错误处理等相关操作;Zend引擎(ZE)用以将源文件转换成机器语言,然后在虚拟机上运行它;扩展层是一组函数、类库和流,PHP使用它们来执行一些特定的操作。比如,我们需要mysql扩展来连接MySQL数据库;当ZE执行程序时可能会需要连接若干扩展,这时ZE将控制权交给扩展,等处理完特定任务后再返还;最后,ZE将程序运行结果返回给PHP内核,它再将结果传送给SAPI层,最终输出到浏览器上。深入探讨  等等,没有这么简单。以上过程只是个简略版,让我们再深入挖掘一下,看看幕后还发生了些什么。

Apache启动后,PHP解释程序也随之启动;PHP的启动过程有两步;第一步是初始化一些环境变量,这将在整个SAPI生命周期中发生作用;第二步是生成只针对当前请求的一些变量设置。PHP启动第一步  不清楚什么第一第二步是什么?别担心,我们接下来详细讨论一下。让我们先看看第一步,也是最主要的一步。要记住的是,第一步的操作在任何请求到达之前就发生了。

启动Apache后,PHP解释程序也随之启动;PHP调用各个扩展的MINIT方法,从而使这些扩展切换到可用状态。看看php.ini文件里打开了哪些扩展吧;MINIT的意思是“模块初始化”。各个模块都定义了一组函数、类库等用以处理其他请求。  一个典型的MINIT方法如下:PHP_MINIT_FUNCTION(extension_name){/* Initialize functions, classes etc */}PHP启动第二步

当一个页面请求发生时,SAPI层将控制权交给PHP层。于是PHP设置了用于回复本次请求所需的环境变量。同时,它还建立一个变量表,用来存放执行过程中产生的变量名和值。PHP调用各个模块的RINIT方法,即“请求初始化”。一个经典的例子是Session模块的RINIT,如果在php.ini中启用了Session模块,那在调用该模块的RINIT时就会初始化$_SESSION变量,并将相关内容读入;RINIT方法可以看作是一个准备过程,在程序执行之间就会自动启动。  一个典型的RINIT方法如下:PHP_RINIT_FUNCTION(extension_name) {/* Initialize session variables, pre-populate variables, redefine global variables etc */}PHP关闭第一步  如同PHP启动一样,PHP的关闭也分两步:

一旦页面执行完毕(无论是执行到了文件末尾还是用exit或die函数中止),PHP就会启动清理程序。它会按顺序调用各个模块的RSHUTDOWN方法。RSHUTDOWN用以清除程序运行时产生的符号表,也就是对每个变量调用unset函数。  一个典型的RSHUTDOWN方法如下:PHP_RSHUTDOWN_FUNCTION(extension_name) {/* Do memory management, unset all variables used in the last PHP call etc */}PHP关闭第二步  最后,所有的请求都已处理完毕,SAPI也准备关闭了,PHP开始执行第二步:

PHP调用每个扩展的MSHUTDOWN方法,这是各个模块最后一次释放内存的机会。  一个典型的RSHUTDOWN方法如下:PHP_MSHUTDOWN_FUNCTION(extension_name) {/* Free handlers and persistent memory etc */}  这样,整个PHP生命周期就结束了。要注意的是,只有在服务器没有请求的情况下才会执行“启动第一步”和“关闭第二步”。

图1 php结构

从图上可以看出,php从下到上是一个4层体系

①Zend引擎

Zend整体用纯c实现,是php的内核部分,它将php代码翻译(词法、语法解析等一系列编译过程)为可执行opcode的处理并实现相应的处理方法、实现了基本的数据结构(如hashtable、oo)、内存分配及管理、提供了相应的api方法供外部调用,是一切的核心,所有的外围功能均围绕zend实现。

②Extensions

围绕着zend引擎,extensions通过组件式的方式提供各种基础服务,我们常见的各种内置函数(如array系列)、标准库等都是通过extension来实现,用户也可以根据需要实现自己的extension以达到功能扩展、性能优化等目的(如贴吧正在使用的php中间层、富文本解析就是extension的典型应用)。

③Sapi

Sapi全称是Server Application Programming Interface,也就是服务端应用编程接口,sapi通过一系列钩子函数,使得php可以和外围交互数据,这是php非常优雅和成功的一个设计,通过sapi成功的将php本身和上层应用解耦隔离,php可以不再考虑如何针对不同应用进行兼容,而应用本身也可以针对自己的特点实现不同的处理方式。后面将在sapi章节中介绍

④上层应用

这就是我们平时编写的php程序,通过不同的sapi方式得到各种各样的应用模式,如通过webserver实现web应用、在命令行下以脚本方式运行等等。

构架思想:

引擎(Zend)+组件(ext)的模式降低内部耦合

中间层(sapi)隔绝web server和php

**************************************************************************

如果php是一辆车,那么

车的框架就是php本身

Zend是车的引擎(发动机)

Ext下面的各种组件就是车的轮子

Sapi可以看做是公路,车可以跑在不同类型的公路上

而一次php程序的执行就是汽车跑在公路上。

因此,我们需要:性能优异的引擎+合适的车轮+正确的跑道

把php最终集成到Apache系统中,还需要对Apache进行一些必要的设置。这里,我们就以php的mod_php5 SAPI运行模式为例进行讲解,至于SAPI这个概念后面我们还会详细讲解。

假定我们安装的版本是Apache2 和 Php5,那么需要编辑Apache的主配置文件http.conf,在其中加入下面的几行内容:

Unix/Linux环境下:

LoadModule php5_module modules/mod_php5.so

AddType application/x-httpd-php .php

注:其中modules/mod_php5.so 是X系统环境下mod_php5.so文件的安装位置。

Windows环境下:

LoadModule php5_module d:/php/php5apache2.dll

AddType application/x-httpd-php .php

注:其中d:/php/php5apache2.dll 是在Windows环境下php5apache2.dll文件的安装位置。

这两项配置就是告诉Apache Server,以后收到的Url用户请求,凡是以php作为后缀,就需要调用php5_module模块(mod_php5.so/ php5apache2.dll)进行处理。

Apache请求处理循环详解 Apache请求处理循环的11个阶段都做了哪些事情呢?

1、Post-Read-Request阶段

在正常请求处理流程中,这是模块可以插入钩子的第一个阶段。对于那些想很早进入处理请求的模块来说,这个阶段可以被利用。

2、URI Translation阶段 Apache在本阶段的主要工作:将请求的URL映射到本地文件系统。模块可以在这阶段插入钩子,执行自己的映射逻辑。mod_alias就是利用这个阶段工作的。

3、Header Parsing阶段 Apache在本阶段的主要工作:检查请求的头部。由于模块可以在请求处理流程的任何一个点上执行检查请求头部的任务,因此这个钩子很少被使用。mod_setenvif就是利用这个阶段工作的。

4、Access Control阶段 Apache在本阶段的主要工作:根据配置文件检查是否允许访问请求的资源。Apache的标准逻辑实现了允许和拒绝指令。mod_authz_host就是利用这个阶段工作的。

5、Authentication阶段 Apache在本阶段的主要工作:按照配置文件设定的策略对用户进行认证,并设定用户名区域。模块可以在这阶段插入钩子,实现一个认证方法。

6、Authorization阶段 Apache在本阶段的主要工作:根据配置文件检查是否允许认证过的用户执行请求的操作。模块可以在这阶段插入钩子,实现一个用户权限管理的方法。

7、MIME Type Checking阶段 Apache在本阶段的主要工作:根据请求资源的MIME类型的相关规则,判定将要使用的内容处理函数。标准模块mod_negotiation和mod_mime实现了这个钩子。

8、FixUp阶段 这是一个通用的阶段,允许模块在内容生成器之前,运行任何必要的处理流程。和Post_Read_Request类似,这是一个能够捕获任何信息的钩子,也是最常使用的钩子。

9、Response阶段 Apache在本阶段的主要工作:生成返回客户端的内容,负责给客户端发送一个恰当的回复。这个阶段是整个处理流程的核心部分。

10、Logging阶段 Apache在本阶段的主要工作:在回复已经发送给客户端之后记录事务。模块可能修改或者替换Apache的标准日志记录。

11、CleanUp阶段 Apache在本阶段的主要工作:清理本次请求事务处理完成之后遗留的环境,比如文件、目录的处理或者Socket的关闭等等,这是Apache一次请求处理的最后一个阶段。

展开
收起

如何巧妙滴隐藏Nginx或Apache以及PHP的版本号的方法小常识

当黑客入侵一台服务器时,首先会”踩点”, 这里的”踩点”,指的是了解服务器中运行的一些服务的详细情况,比如说:版本号,当黑客知道相应服务的版本号后,就可以寻找该服务相应版本的一些漏洞来入侵,攻击,所以我们需要隐藏这些版本号来避免一些不必要的问题我们来测试一下

insoz:~ insoz$ curl -I http://127.0.0.1/phpinfo.phpHTTP/1.1 200 OKServer: nginx/1.5.0Date: Thu, 18 Jun 2015 02:39:32 GMTContent-Type: text/htmlConnection: keep-aliveVary: Accept-EncodingX-Powered-By: PHP/5.3.1可以看到我们的服务器nginx和php版本都暴露了. 下面我们来看隐藏的方法首先来看nginx中隐藏版本号的方法:在nginx配置文件nginx.conf中,加入以下代码server_tokens off;

apache中隐藏版本号的方法:在apache配置文件httpd.conf中,加入以下代码ServerTokens ProdServerSignature Off再来看php中隐藏版本号的方法:在php配置文件php.ini中,加入以下代码expose_php = Off好了,修改完毕重启服务,我们再来测试一下:insoz:~ insoz$ curl -I http://127.0.0.1//phpinfo.phpHTTP/1.1 200 OKServer: nginxDate: Thu, 18 Jun 2015 02:41:47 GMTContent-Type: text/htmlConnection: keep-aliveVary: Accept-Encoding

展开
收起

准备转行IT的人选php还是Java?听听IT老鸟的分析

作为一名IT老鸟,从事IT行业十多年的人看来,这件事情要分两个层面来看。

首先是市场需要什么,然后才是选择的问题。

java工程师依然紧缺

随着国家新基建的加速,移动互联网将迎来第二波浪潮,预计我国java工程师缺口可达42.5万,并且以每年20%左右的速度增长。

根据IDC的统计数字,在所有软件开发类人才的需求中,对Java工程师的需求达到全部需求量的60%~70%。

毫无疑问学习java是快速进入IT领域的敲门砖。

Java应用领域

Java软件工程师就业前景的好坏主要从Java的应用领域来看,Java语言的应用方向主要表现在以下三个方面:

1、大中型的商业应用

包括我们常说的企业级应用(主要指复杂的大企业的软件系统)、各种类型的网站,Java的安全机制以及它的跨平台的优势,使它在分布式系统领域开发中有广泛应用;

2、桌面应用

就是常说的C/S应用,主要用来开发运行于不同的操作系统上的桌面应用程序;

3、移动领域应用

主要表现在消费和嵌入式领域,是指在各种小型设备上的应用,包括手机、PDA、机顶盒、汽车通信设备等。应该说Java软件工程师的就业机会和前景是非常大的。再加上Java软件工程师不仅IT专业企业需要,广大的非IT企业也需要。前景是非常乐观的。

java和php谁更容易上手

这两种语言小黑都算熟练掌握。

从语法层来说,java和php都是c语系。关键字,操作符,以及语句差别不大,都能跨平台,都是基于解释型的语言。

java是强类型,通用语言,可以用于客户端,服务器端等各种环境。而php本身定位服务器语言,并且是弱类型语言。

随着时间的推移,你会发现,原本各种脚本语言越来越向面向对象,面向接口编程,并且逐渐向强类型过度的趋势。

为什么呢?

因为现在的需求越来越复杂了,不是简单打补丁,增加字段就能解决了。各种框架是建立在设计模式,mvc,mvvm等思想理念上的,要求你的语言支持继承,支持多态等等基本设计模式。所以php也在改革,改得越来越像java了。

而且大型程序,强类型有着天然优势,例如编译器错误检查,函数签名自解释,内存使用量小非常多。最重要的,因为用的人多,你获取知识的途径就会更多,碰到问题也会更好解决,随便一搜就行。

所以我的结论:如果你一开始学,还是选java比较适合。

我们达不到乔布斯的成就,但要学习他的精神,希望大家能够坚持自我,早日达成梦想,一起加油!

展开
收起

PHP中“|”和“||”的简单比较

在PHP中“|”和“||”都是OR(或)运算符,那么它们之间有什么区别?下面本篇文章就来带大家认识一下运算符“|”和“||”,对它们进行简单比较,了解它们之间的区别。

运算符“|”

它是一个按位OR运算符,二元运算符;它对变量的位进行操作。如果有两个变量a,b,进行$a | $b;则是将把 $a 和 $b 中任何一个为 1 的位设为 1。

示例:

$a = 3; $b = 10; echo $a | $b; ?>

输出:

说明:

在上面的示例中,给定两个值,a = 3和b = 10;然后将这两个数字转换为二进制数,即a = 0011和b = 1010;最后应用OR(|)运算并计算$a | $b的值。

运算符“||”

这是一个逻辑OR运算符,布尔运算符;它对变量的布尔值进行操作。如果其中任何一个变量的布尔值为true,则$a || $b的值为1。

示例:

$a = 3; $b = 10; echo $a||$b; echo ''; if($a = 3 || $b = 0) echo '1'; else echo '0'; ?>

输出:

说明:

在上面的示例中,给定两个值,a = 3和b =10;因此变量a和变量b的布尔值都为true,则$a||$b的值为1;在if语句中,检查其中一个条件是否为真,因为变量a值被设置为3,布尔为true,因此执行“$a = 3 || $b = 0”的值为1。

以上就是本篇文章的全部内容,希望能对大家的学习有所帮助。更多精彩内容大家可以关注php中文网相关教程栏目!!!

展开
收起