怎么限制php并发,为什么php不适合做计算密集型业务?
PHP即“超文本预处理器”,是一种通用开源脚本语言。PHP是在服务器端执行的脚本语言,与C语言类似,是常用的网站编程语言。PHP独特的语法混合了C、Java、Perl以及 PHP 自创的语法。利于学习,使用广泛,主要适用于Web开发领域。
1.优点:开源 免费性 快捷性 [程序开发快,运行快,技术本身学习快]
1)跨平台,性能优越,跟Linux/Unix结合别跟Windows结合性能强45%,并且和很多免费的平台结合非常省钱,比如LAMP(Linux /Apache/Mysql/PHP)或者FAMP(FreeBSD/Apache/Mysql/PHP)结合,或者数据应用够大可以考虑换 PostgreSQL或者Oracle,支持N种数据库。(N >= 10)
2)语法简单,如果有学习C和Perl的很容易上手,并且跟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来作为他们的开发语言,所以大型门户都能够选用它,我想足够能够你的使用了。
9)有很多开源的框架或开源的系统可以使用,比如比较知名的开源框架有Zend Framework、CakePHP、CodeIgniter、symfony等,开源论坛有Discuz!、Phpwind等,开源博客 WordPress,开源网店系统如Ecshop、ShopEx等,开源的SNS系统如UCHome、ThinkSNS等。
10)使用成本低 (linux apache mysql php内核)
2.缺点
1)函数命名不规范 驼峰法和下滑线,传参位置不一 你知道的
2)单线程 ; PHP本身,一直以来php就是个单进程的程序;虽然php的pthreads扩展早就有了。但是它不够稳定,运行运行着就会莫名其妙的自己挂掉;php的扩展都是C写的,这也就意味着任何一个扩展出现线程竞争资源控制问题都能让整个挂掉
3)核心异步网络不支持(当然在linux只有同步非阻塞网络模型)。却少了这个使得很难开发一个能够承受大并发的网络应用。传统的网络模型和io都阻塞的。这样基本的编程的做法就是一个进程(或者线程)响应一个用户链接请求。因此无法完成像实时网游那样需要成千上万网络连接的任务。尽管php也有Libevent、eio扩展对此算是某种程度上面的弥补,但是感觉都不是那么完善
4)只支持web开发,不方便做 .exe文件,不方便做桌面应用程序. 不方便做手机程序.
5)不适合做爬虫、自动运行脚本.科学运算项目,这语言基本构架就不适合,虽然有很多方法实现。
6)后期维护困难。后期提速空间局限性较大。
在对PHP有一个大致的认识以后,我们来了解一下为什么说PHP慢?
PHP的慢是相对于C/C++级别的语言来说,事实上,PHP语言最初的设计,就不是用来解决计算密集型的应用场景。我们可以这样粗略理解为,PHP为了提升开发效率,而牺牲了执行效率。
我们知道PHP一个很大的特点,就是弱类型特性,也就是说,我可以随意定义一个变量,然后给它随意赋值为各种类型的数据。以一个int整型数字为例子,在C语言中:
int num = 200; // 通常是4字节
但是,如果是PHP定义了一个同样的变量,实际对应的存储结构则是:
这个结构体将会占据远比C变量多得多的内存,PHP中定义方式如下:
$a = 200; //这变量将实际占用对比C变量很多倍的存储空间。
其实对PHP来说,无论存储什么类型的数据,都是用上述“通杀”的结构体实现。为了兼容PHP程序员的变量类型“乱入”,PHP做到了对开发者的友好,但是对执行引擎很残酷。单个变量内存消耗可能还不明显,一旦用到PHP的数组等,则复杂度指数上升(数组的实现是HashTable)。然后,Zend引擎执行时,将这些PHP代码编译为opcode(PHP的中间字节码,格式有点类似于汇编),由Zend引擎逐行解释执行。
无论是字符串的连接操作,还是数组的简单修改等,几乎都是“PHP程序员一句话,Zend引擎跑断腿”的节奏。因此,同样的操作,对比C来说,PHP消耗了更多的CPU和内存等系统资源。除此之外,还有内存自动回收、变量类型判断等等,都会增加系统资源的消耗。
例如,我用纯PHP实现的快速排序函数和原生sort函数,排序10000个整型数字,来做一个耗时对比,结果如下:
原生的sort耗时3.44 ms,而我们自己实现的PHP函数sort则是68.79 ms。我们发现,两者执行效率差距巨大。我的测试方式,是计算函数执行前后的时间间隔,而不是整个PHP脚本从启动到结束的时间。PHP脚本启动和关闭过程,本身有着一系列的初始化和清理工作,也会占据不少的耗时。
通常情况下,PHP执行效率的排行是:
最快的是PHP语言结构(isset、echo等),PHP语言的一部分(它们根本不是函数)。
然后比较快的就是PHP的原生和拓展函数。PHP拓展,基于Zend API之上,用C实现的功能,执行效率和C /Java是属于同一个数量级的。
真正慢的就是,我们通过PHP自己写的代码和函数。例如,假如我们使用的比较重的纯PHP实现的框架,因为框架本身的模块很多,所以,会明显拖累语言层面的执行效率,同时占据更多的内存。(国内的Yaf框架,以拓展的方式实现,因此执行效率远快于纯PHP写的框架。
在一般情况下,我们并不推荐用过PHP实现逻辑复杂计算类型的功能,尤其是Web系统流量比较大的场景下。因此,PHP程序员应该对PHP的各种原生函数和各类拓展有一个比较广泛的了解,在具体的功能实现场景中,寻求更原生的解决方案(原生接口或者拓展),而不是自己写一堆复杂的PHP代码来实现这类型功能。
如果有足够的PHP拓展开发实力,将这类型业务功能重写为一个PHP拓展,也会大幅提升代码的执行效率。这是一个非常不错的方式,也被广泛应用PHP优化中。但是,自己编写的PHP业务拓展的缺点也很明显:
拓展开发耗时比较长,需求变更的时候修改也复杂,写得不好可能会影响Web服务稳定性。(例如,在Apache的worker模式下,多线程场景下挂掉,会影响同一个进程下的其他正常子线程。如果是多线程的Web模式,编写拓展还需要支持线程安全)
拓展在PHP版本升级的时候,可能需要做额外的兼容工作。
人员变动后的维护和接手成本也比较高。
实际上,在互联网一线企业中,更常见的解决方案,并非增加PHP拓展,而用C/C 独立写一个服务server,然后PHP通过socket和服务server通信来完成业务处理,并不将PHP本身和业务耦合在一起。
不过,Web服务大部分的性能瓶颈都在网络传输和其他服务server的耗时上(例如MySQL等),PHP执行的耗时在整体耗时的占用比例非常小,所以从业务角度来说,影响可能并不明显。
33岁的PHP程序员?
你好,我是只说代码的大饼,很高兴回答你这问。
这个问题我分两个方面来给你分析下:
一:让你学.net有更深层的含义吗?
1.公司觉得你年龄大了,薪水可能又比其他刚毕业不久的高。
2.你所在的这个工作岗位可替代性高。
结合这两点,公司表面上让你学.net这门语言是为了让你自己打退堂鼓(离职)。
二:公司真的是让你学.net新项目或者老项目需要你维护。
即使你年龄33了,但是公司觉得你各方面优秀(业务能力、沟通能力。。。),即使新项目打算换.net开发了,也不愿意放弃你这个优秀的PHP程序员。
如果真是这样,我觉得你还是应该用一两个星期学习,肯定能上手做项目了。要相信自己,勇往直前。
不管公司是真的让你学.net这门语言还是背后有辞退你的原因,我觉得还是学习下也无所谓。
为啥无所谓呢?
因为33岁了,肯定写代码也写了7到9年左右了吧,编程思想肯定是培养出来了,公司要做的业务肯定也是熟悉了,学习下.net肯定是小意思(仅限于做业务功能),所以先学,不管结果怎样,反正没有什么损失,现在一般做开发的一般都会用两门以上的语言吧。
回答完毕,谢谢。我是只说代码的大饼。喜欢的点个赞或者关注下,谢谢!
php文件锁防止并发原理是什么?
PHP对于商品抢购等并发场景下,可能会出现超卖的现象,这时就需要解决并发所带来的这些问题了。在PHP语言中并没有原生的提供并发的解决方案,因此就需要借助其他方式来实现并发控制。
方案一:使用文件锁排它锁;方案二:使用MySQL数据库提供的悲观锁;方案三:使用队列;方案四:使用Redis/Memcached;下面讲一下文件锁
flock函数用于获取文件的锁,这个锁同时只能被一个线程获取到,其它没有获取到锁的线程要么阻塞,要么获取失败。flock()函数锁定或释放文件 若成功,则返回 true。若失败,则返回 falseflock($fp,lock,block); block 若设置为true 则当进行锁定时阻挡其他进程LOCK_SH 建立共享锁定。多个进程可同时对同一个文件作共享锁定。 LOCK_EX 建立互斥锁定。一个文件同时只有一个互斥锁定。 LOCK_UN 解除文件锁定状态。 LOCK_NB 无法建立锁定时,不阻断。通常与LOCK_SH或LOCK_EX 做OR(|)组合。PHP高并发基本都要使用Redis/Memcached、悲观乐观锁,大型项目可使用Swoole去完成!为了大家能够顺利进阶中高级程序员、架构师,我为大家准备了一套精品福利!
分享tp,laravel,Swoole,Swoft微服务等教程,各种大牛都是3-8年PHP开发者,每天还有12年的架构师做讲解,助你进阶中高级PHP程序员,增值涨薪!需要可关注本号,并且发送私信:PHP 这里没有代码块操作,具体实现方式没有写进去,有秒杀高并发的疑惑、遇到瓶颈期、想进阶中高级的PHPer可发私信:PHP在学习PHP进阶高并发、秒杀的过程中难免会遇到困难,有问题可按照上面操作、或者留言给我!!!
Java跟PHP选择哪个好些?
网站的全栈开发,个人建议使用Java会比较好点,我们来做个整体对比,题主可以自己去选择:
Java做全栈开发的优劣势优势
Java从开始火到现在已经这么多年了,从最开始就是用来做web应用程序的开发,到现在主要的功能还是做web应用程序的开。但是相对于以前来说已经有了很多技术跟新出来,特别是对于web应用程序来说多了很多很多的特别完整的解决方案。对于性能这块这么多年的积累也是有很多自己的解决方案,对于安全性来说那也绝对是其它从事web应用开发的语言是无法比拟的。并且到现在Java对于web应用程序的支持包括新的技术还在持续更新中,并且基本都还是开源的,这意味着对于很多程序员来说我们可以查看到别人更加优秀的代码来提升自己的能力。劣势随着python的火起来,对于很多做Java开发的程序员来说确实有所打击,甚至有了一句:"生命短暂,我用python"。确实对于程序员开发来说Java开发起来会稍微复杂许多,因为许多解决方案需要靠我们自己去处理里面的内容。也就是说我们要实现的功能需要用比较多的代码来完成。但是习惯就好。PHP做全栈开发的优劣势优势
同样的php是专为web应用程序而生的,它的产生只为做网站,但是国内一般常用php做小型电商以及社区类网站,也有一些大型的网站,但是近几年来确实越来越少了。php是解释性的脚本语言,对于一些并发效率上是有很大的优势。并且php也经历了很多个年头了,在解决方案的沉淀上也是有很多的。并且php学习起来要比其它语言简单,并且周期也不会很长。劣势因为php是解释性脚本语言所以对于安全性来说,肯定是有点问题的。并且php只专注于web程序所以对于所谓的跨平台等问题其实也是一个劣势。从成本角度来说确实如果在招聘网上去搜索Java和php,你们会发现Java开发的工资普遍来看肯定是高于php开发岗位的。但是就Java和php的市场招聘员工上来说是比php要便宜的,因为在中国市场Java的初级开发人员已经处于快饱和状态了。但是php因为只专注于一个领域,并且学习起来周期短,导致没有Java的发展前景要好,这也导致从事php开发的人员要比Java少很多,所以招聘一个合适的员工,可能Java还有得挑,但是php可能还要慢慢的找。
从程序的维护和开发角度来看,其实Java的成本也要比php低。大家想想的安全性相对于来说要Java低,那么对于我们来说如果出现安全性问题对一个程序来说是很致命的。再者Java的人员可能会多余php,那么懂php的稍微要少很多,做维护可以让Java开发去做,但是php人员本来就少,这样使用起来人力成本也会升高。
从技术角度来看在我们的刚开始接触Java就知道Java是一个跨平台语言,那么针对于跨平台来说php是很难做到的,对于不同的平台如果每个都需要开发一个对应的程序,说实话这个真的很不划算。在就是技术层面的受众上Java也是完全高于php,因为还是php只专注于一个领域。
相对于两个语言的细节比较,答主还是推荐使用Java,跨平台,安全性等问题来说确实会更加适合一点。
以上是答主自己的观点,如果有更好看法的小伙伴可以在下方评论区留言给我,或者点个赞,加个关注我们一起慢慢探讨探讨。
PHP实现百万级高并发的一些方法思路?
提到高并发,就没有办法绕开I/O复用,长连接、协程等话题
接下来讲解下用PHP7+Swoole为什么能实现高并发、协程等
Swoole采用 多线程Reactor+多进程Worker,因为reactor基于epoll,所以每个reactor可以处理无数个连接请求。如此,swoole就轻松的处理了高并发。
基于上面的Swoole结构图,我们看到swoole的worker进程有2种类型:一种是 普通的worker进程,一种是 task worker进程。
worker进程是用来处理普通的耗时不是太长的请求;task worker进程用来处理耗时较长的请求,比如数据库的I/O操作。
高并发、秒杀、分布式等都是PHP进阶中高级架构师必学技术,为了解决大家的难题,我准备了一套中高级进阶学习教程还可加入大牛学习圈子,分享tp,laravel,swoole,swoft微服务等教程,各种大牛都是3-8年PHP开发者,每天还有12年的架构师做讲解,助你进阶中高级PHP程序员,增值涨薪!需要可关注本号,并且发送私信关键词:PHP