php的内部函数是否全部是用c写的,是否效率最高?

php的内部函数是否都是用c写的?是否效率永远最高?

阅读 6k
7 个回答
  • 是的,是用C写的,毫无置疑

  • 效率没有最高只有更高

每个版本都会在各个方面有所提升,所以没有最高只有更高。安全/效率/速度等只会越来越来高越来越强

1、当然啦,PHP底层都是用c写的
2、效率高不高是相对的,比如PHP5.x 和PHP7.x 肯定PHP7.X的效率比PHP5.X要高许多

是不是全是C, 你下份源代码看看就知道了.
千万不要误会用C语言写的程序效率都会高.. 这得看人的..

php的底层是C

没错,现在PHP7效率已经很高了,以后会更牛X.

任何代码只要写出来,就会具有两面性,即在它解决的问题范围内,它可能是最优的。但是如果超出了这个范围,则不一定。

如json_decode函数,是c写的没错,解析普通json速度飞快,但是如果解析的是上百G的json,除非内存也几百g,不然是跑不出来的,会遇到内存瓶颈。

但是,有一些算法能用sax的方式解析json,就算解析几百G的json,对内存的消耗是极小的。

PHP源代码的几个重要目录:
php-src/Zend(引擎) 9.2MB
php-src/sapi(cli/cgi/apache2handler/fpm) 3.1MB
php-src/ext(扩展) 108MB

PHP底层可以分为3个部分:
Zend引擎,SAPI和ext扩展库函数,这些引擎/服务/库函数都由C实现.

1.PHP7致力于在内存模型上优化Zend引擎,从而提高Zend引擎执行PHP代码的性能并减少内存占用,ext扩展需要适配新引擎.

2.SAPI(Server API)可以理解为PHP的运行方式.
http://php.net/php_sapi_name
echo PHP_SAPI;
echo php_sapi_name();
PHP的几种SAPI:
php(cli,cli-server)
php-cgi(cgi-fcgi)
php-fpm(fpm-fcgi)
libphp7.so/php7apache2_4.dll(apache2handler)

cli全称command line interface,像Swoole和WorkerMan这些PHP网络服务,就是以cli后台守护进程运行.

cli-server是PHP内置的C实现的单进程HTTP服务器,可用于开发和测试,以及部署在资源有限的嵌入式设备上(树莓派/手机),配合PHP内置的SQLite引擎,可以提供比较完备的数据库驱动的Web开发平台.个人就打包了PHPDroid这么一个东西,用来在Android上提供PHP服务,iOS上则有一个DraftCode的应用.

php-cgi就是传统的CGI程序,可以用来处理经过Web请求的PHP脚本,可以拿到前端服务器传过来的$_SERVER/$_COOKIE等这些信息.比如Apache的mod_fcgid以及IIS的PHP Manager都是用来调用和管理php-cgi进程的.

php-fpm是一个自主管理子进程的FastCGI服务,经常配合Nginx使用,Nginx只需把请求反向代理fastcgi_pass给php-fpm的子进程处理即可,php-fpm每个子进程都内置了PHP解释器,并不会去调用php-cli或者php-cgi.

3.PHP内置的库函数以及加入的第三方PECL库函数也都是C实现并在运行时随PHP-FPM进程载入内存常驻并全局可用的.

上面所说的PHP的各个功能都由C实现,所以有种看法认为:
PHP其实就是C实现的Web框架,是C实现的一种专门针对Web开发优化的胶水语言.
对比其他一些脚本语言,比如Python,Ruby,Node,它们的Web服务器大多都是用自己实现,比如Python的HTTP服务器Gunicorn,Ruby的Unicorn,类似上面提到PHP里的Swoole和WorkerMan.

C实现的库函数生成的是机器码,性能基础整体上肯定要优于依赖虚拟机或者解释器运行的代码.
很多编程语言的虚拟机都有JIT功能,就是在运行时花点时间把热点代码编译成机器码来跑,从而提升性能.
但JIT不是万金油,对于计算密集的场景,热点代码很好找,JIT的确有优势.
但在Web应用上,我们更多涉及到的是:
网络I/O(Firefox->Nginx->PHP-FPM->Redis/MySQL)
磁盘I/O(读写数据库,读写文件)
动态的弱类型的数组操作(用过的都应该知道PHP数组是处理业务逻辑的利器)
而上面提到的这些,JIT能提供的帮助并不大,这也是为什么PHP7把注意力集中在改善Zend引擎内存模型上,而不是JIT上,虽然PHP官方已经做出了一个概念验证版本的Zend-JIT.这也是为什么PHP7(无JIT)在单纯的计算性能测试bench.php上输给了有JIT的HHVM,而在真实应用WordPress测试上却不落下风的原因.

最后看看PHP7开启JIT支持下bench.php计算性能的测试对比.
可以看到,涉及到PHP最常用的hash关联数组的循环测试时,Zend-JIT的效果并不明显.
Resin(JVM)的Quercus,DotNet的Phalanger甚至比没有JIT的PHP-5.6还要慢几倍.
080739_1UgC_561214.png

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题