php的内部函数是否都是用c写的?是否效率永远最高?
任何代码只要写出来,就会具有两面性,即在它解决的问题范围内,它可能是最优的。但是如果超出了这个范围,则不一定。
如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还要慢几倍.
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.3k 阅读✓ 已解决
2 回答781 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答2.3k 阅读
1 回答695 阅读✓ 已解决
是的,是用C写的,毫无置疑
效率没有最高只有更高
每个版本都会在各个方面有所提升,所以没有最高只有更高。安全/效率/速度等只会越来越来高越来越强