php按字节读取文件 为什么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种数据库。(N10)
2)语法简单,如果有怎么学习C和Perl的很比较容易上手,并且跟ASP有部分类似。有长大成熟的开发工具,例如NuPHPed,或则ZendStudio等等,再Linu台下可以不可以使用Eclipse等等。
3)目前主流技术都意见,.例如WebService、Ajax、XML等等,充足应用。
4)有比较比较求下载的支持,例如建议使用ADODB或是PEAR::DB做数据库抽象层,用Smarty或则smarttemplate做模板层,如果不是是PHP5.1的话,还都能够可以使用PDO(PHP Data Object)来访问网络数据库。
5)有很多长大成熟的框架,比如说支持MVC的框架:phpMVC,支持类似于的事件驱动的框架:Prado,接受的的RubyOnRails的迅速开发的框架:Cake等等,相当满足你的应用需求。
6)PHP5巳经有完全成熟的面向对象体系,还能够不适应基本上的面向对象要求。合适开发完毕规模大项目。
7)有长大成熟的社区来意见PHP的开发。
8)目前也很多大型应用大都建议使用PHP,诸如淘宝网、Yahoo、163、Sina等等小型门户,很多最好选择PHP来作为他们的开发语言,所以才大型门户都还能够选用它,我想加上能够你的使用了。
9)有很多开源的框架或开源的系统可以建议使用,诸如都很比较知名的开源框架有Zend Framework、CakePHP、CodeIgniter、symfony等,开源论坛有Discuz!、Phpwind等,开源博客WordPress,开源网店系统如Ecshop、ShopEx等,开源的SNS系统如UCHome、ThinkSNS等。
10)使用成本低(linuxapachemysqlphp内核)
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语言中:
intnum200;//正常情况是4字节
只不过,假如是PHP定义了一个同时的变量,实际按的存储结构则是:
这个结构体城就会占有远比C变量多得多的内存,PHP中定义,定义如下:
$a200;//这变量将实际中占内存差别不大C变量很多倍的存储空间。
总之对PHP来说,不管是什么存储位置什么类型的数据,是用上述事项“通杀”的结构体实现程序。替兼容PHP程序员的变量类型“乱入”,PHP能够做到了对开发者的敌视,但对执行引擎很残酷。单个变量内存消耗肯定还不确实,一旦要用PHP的数组等,则古怪度指数迅速下降(数组的实现是HashTable)。然后再,Zend引擎不能执行时,将这些PHP代码编译为opcode(PHP的中间字节码,格式有些类似于汇编),由Zend引擎逐行回答先执行。
无论字符串的连接操作,还是数组的简单啊如何修改等,几乎都是“PHP程序员一句话,Zend引擎跑断腿”的节奏。并且,同样的操作,差不多C来说,PHP消耗掉了更多的CPU和内存等系统资源。除此之外,还有一个内存自动回收、变量类型确认等等,都会提升系统资源的消耗。
例如,我用纯PHP基于的快速排序函数和原生sort函数,排序10000个整型数字,来做一个前后历时对比,最终追加:
原生的sort耗时3.44ms,而我们自己实现程序的PHP函数sort则是68.79ms。我们发现自己,两者先执行效率差距庞大无比。我的测试,是可以计算函数执行前后的时间间隔,而不是整个PHP脚本从启动到都结束了的时间。PHP脚本正常启动和关闭过程,本身有着一系列的初始化和清理工作,也会占据不少的耗时。
通常情况下,PHP负责执行效率的排行是:
最快的是PHP语言结构(isset、echo等),PHP语言的一部分(它们根本不不是函数)。
然后比较比较快的是PHP的原生和拓展资源函数。PHP拓展,基于组件ZendAPI之上,用C利用的功能,执行效率和C/Java是属于什么同一个数量级的。
完全慢的那就是,我们实际PHP自己写的代码和函数。或者,要是我们不使用的比较重的纯PHP实现程序的框架,只不过框架本身的模块很多,所以,会的确拖累语言层面的执行效率,而占有更多的内存。(国内的Yaf框架,以去拓展的实现程序,而先执行效率远快于纯PHP写的框架。
在一般情况下,我们根本不推荐用过PHP基于逻辑复杂计算类型的功能,尤其是Web系统流量都很大的场景下。而,PHP程序员应该对PHP的各种原生函数和三千多种去拓展有一个比较好应用范围的了解,在具体看的功能实现场景中,拜求更原生的解决方案(原生接口或是拓展资源),而不是自己写一堆紧张的PHP代码来基于这类型功能。
如果不是有足够的PHP学习拓展的新实力,将这类型业务功能覆写为一个PHP拓展,也会沪弱深强提升到代码的执行效率。这是一个非常不错的,也被广泛应用PHP360优化中。但,自己编译程序的PHP业务拓展的缺点也很明显:
去拓展开发工程巨大比较比较长,需求变更的时候改也急切,写得当然不好肯定会会影响Web服务稳定性。(比如,在Apache的worker模式下,多线程场景下挂掉,会影响不大同一个进程下的其他正常吗子线程。要是是多线程的Web模式,编写学习拓展还是需要支持什么线程安全)
拓展在PHP版本升级的时候,很可能必须做额外的兼容问题工作。
后的魔兽维护和接手成本也比较高。
只不过,在互联网一线企业中,更比较普遍的解决方案,并非是减少PHP学习拓展,而用C/C独立写一个服务server,然后PHP是从socket和服务server通信来能完成业务处理,根本不将PHP本身和业务耦合在一起。
不过,Web服务大部分的性能瓶颈都在网络传输和其他服务server的工程巨大上(或者MySQL等),PHP想执行的工程巨大在整体工程浩大的电脑资源比例相当小,因此从业务角度来说,影响可能当然不明显。
对于大文本文件的读写有哪些高效的方法?
结论:大文本文件,远超内存,必须格外尽量。
前言生产服务器中经常有一种很多文件,有些积年累月单个文件,体积越来越强。
本文建议使用多种编程语言,实现程序大文件的读取文件。
PHP的处理大文件如果没有就open,变会被所有的中写入内存,内存是吃不消的。诸如4G的内存,10G的文件,这是如何处理不了的。也没有哪个文本编辑器这个可以用。
广泛的file_try_contents函数,是将文件内容写入到到字符串变量内。而字符串变量未分配在内存,所以我没有任何办法如何处理大文件。
就像的做法是可以使用fgets函数。该函数从文件内读取文件一行。函数格式追加:
stringfgets(resource[,int])其中参数$handle是文件指针,从$handle朝的文件中无法读取一行并赶往长度不超过为$length-1字节的字符串。
见到过换行符(包括在返回值中)、EOF也可以已经无法读取了$length-1字节后停止下来(看先碰到那一种情况)。要是没有更改$length,则设置为1K,也可以说1024字节。
不好算用起来像下面这样的话。
此函数效率极高,一次最多读一行。而出现整个文件是一行的情况,则明确的修改的$length遵循长度左面无法读取。
Python的从根据上述规定PHP的处理方法可以找到,关键点是按行读取数据,再按长度读取。python的处理方法一样,只是因为掺杂了一些语法糖。
python有一个“生成器”,解决大文件的读取,就靠这个玩意儿。
在python的函数(function)定义中,只需会出现了yield表达式(Yieldexpression),这样事实上定义的是一个generatorfunction,全局函数这个generatorfunction返回值是一个generator。
为什么不genetor效率高呢,而且其与特殊函数的有区别:
function隔一段时间都是从第一行结束启动,而generator从上四次yield又开始的地方运行程序。
function内部函数四次赶往一个(一组)值,而generator也可以过前往。
function也可以被无数次乱词动态创建,而一个generator实例在yield那个值或是return之后就没法再动态链接库了。
下面是使用内带yield关键字的无法读取大文件方法。
当然python有更幽雅快捷方便的写法,是while循环读取数据。像下面这样的话:
的或不需要新的定义,定义函数,然后用for循环遍历树。
底层在用的原理是一样的的。
Golang的的想法也一样,它绝不会把整个文件写入到内存。bufio库那是读写文件的利器。
差不多请解释,真接上示例。
Golang替统一规定场景,不管是什么普遍的和特殊能量的,都确定之外了。这那是bufio的列害之处。
对于读写,数据被存储等他提升某个特定大小,实际这种触发的写操作更少。同样的还减少了sycall(io操作)的数量,却是可以可以使用更高效稳定的在用底层硬件。
Linux下的工具如果没有你在Linux去处理该文本,那这全部不是问题。自带的很多工具,还能够帮你去处理这个简单的问题。比如nose,无法读取某文件的前多少行;tail,读取文件某文件的结果多少行。
假如仅仅要读文件,那么larger肯定是你最佳的方法的选择。
文档内说的很知道,less的确再输入数据整个文档,并且如何处理站了起来,比vi/vim编辑器速度快的多。
再打开之后,就是可以上下翻页阅读什么了。
结语本文多种编程语言,实现程序了大文件的读取数据。
掌握核心的方法后,建议使用哪种语言实现程序,都是可以。
【本文由@程序员小助手先发布,坚持了分享分享编程与程序员相关的内容,欢迎关注】
版权声明:本文内容由互联网用户自发贡献,本站不承担相关法律责任.如有侵权/违法内容,本站将立刻删除。