加入收藏 | 设为首页 | 会员中心 | 我要投稿 湖南网 (https://www.hunanwang.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 移动互联 > 正文

怎样用 Rust 来为 PHP 助力

发布时间:2019-08-08 03:38:33 所属栏目:移动互联 来源:llgoer
导读:上周,一篇关于《PHP 兼 Zend 连系首创人 Zeev Suraski 公布从 Zend 去职》的文章在中国措施员中炸开了锅。文章中的Zend首创人去职可谓引起轩然大波,各类对PHP不友爱的声音也被转达了出来。固然来自中国的PHP焦点开拓者鸟哥发声,但很多措施员对PHP的立场
副问题[/!--empirenews.page--]

 怎样用 Rust 来为 PHP 助力

上周,一篇关于《PHP 兼 Zend 连系首创人 Zeev Suraski 公布从 Zend 去职》的文章在中国措施员中炸开了锅。文章中的Zend首创人去职可谓引起轩然大波,各类对PHP不友爱的声音也被转达了出来。固然来自中国的PHP焦点开拓者鸟哥发声,但很多措施员对PHP的立场并不是很乐观。

作为我在Web规模的入门说话,对PHP的感情如同初恋一样平常柔美。但陪伴着近几年来各人对PHP各类奚落、嘲讽,加上新说话Go、Rust、Javascript等强势崛起。好像让“我是一名PHP措施员”变得底气很不敷。来历于Web、光辉于Web、受限于Web,不得不说,这让剧本说话PHP陷入了逆境,由于Web已经不再是谁人靠渲染网页的PC期间,固然今朝有Swoole这样优越的异步方案,但也很难让我对PHP提起足够的乐趣。

Rust作为近几年来慢慢风行的新兴说话,依附安详、高效、靠得住,开始进入了人们的视野。周末,重拾起了PHP,想看看是否可以或许在PHP和Rust之间擦出一点焚烧花。虽然,只是出于小我私人乐趣做的一些尝试,这并不能为两个优越的说话带来什么改变。但我想,至少可以或许让各人对PHP和Rust有更多的相识。

PHP7.4中的FFI

早先,PHP7.4中的新特征FFI引起我很大的乐趣,由于在许多说话中已经拥有了这样的特征,譬喻:Python、NodeJS、Ruby等,PHP初次的引入,让我认为PHP团队正在朝着这方面举办全力。

我起首回收Rust编写了一个Fibonacci斐波那契数列,这里实现了一个简朴的计较函数,我将他导出为动态链接库,以供PHP的FFI挪用。

  1. #[no_mangle] 
  2. pub extern fn fib(n: i32) -> i32 { 
  3.   return match n { 
  4.     1 | 2 => 1, 
  5.     n => fib(n - 1) + fib(n - 2) 
  6.   } 

编写完成后,我实行在PHP的FFI中举办挪用,为了想比拟下机能,我同时编写了一个PHP的函数:

  1. // 一个PHP的fib函数 
  2. function fib($n) { 
  3.     if ($n === 1 || $n === 2) { 
  4.         return 1; 
  5.     } else { 
  6.         return fib($n-1) + fib($n-2); 
  7.     }     

接下来,我在PHP中挪用他们,为了可以或许看出机能差别,我将挪用1000000次:

  1. // release模式 
  2. $ffiRelease = FFI::cdef( 
  3.     "int32_t fib(int32_t n);", 
  4.     "r2p-fib/target/release/libr2pfib.$libExtension"); 
  5.  
  6. $time_start = microtime(true); 
  7. for ($i=0; $i < 10000000; $i++) {  
  8.     $v = $ffiRelease->fib(12); 
  9.  
  10. echo '[Rust]Release执行时刻:' . (microtime(true) - $time_start).PHP_EOL; 

从测试功效来看,Rust的FFI功效是让人惊喜的。

PHP的计较耗时30秒以上,Rust仅仅用了6秒。

当我为此欣喜若狂的时辰,我又实行了下PHP的FFI挪用天生字符串,在PHP中是相同这样一个要领:

  1. function text_generate($num) { 
  2.     $result = "💣"; 
  3.     $result .= str_repeat("na ",$num); 
  4.     $result .= "Batman! 💣"; 
  5.     return $result; 

功效Rust因为在PHP的FFI中间字符串转换的消费,机能并没有到达预想那样。

PHP扩展挪用Rust动态库

由于第一个操纵,让我想到了FFI在多次挪用机能消费是很大的,这时我想实此刻PHP扩展中来挪用Rust动态库。

同时为了比拟,我编写一个C的Fib函数举办较量。

我建设了一个名为rust的PHP扩展,完成了关于我们上面编写的Rust函数的挪用。

  1. ZEND_BEGIN_ARG_INFO(arginfo_rust_fib, 0) 
  2.     ZEND_ARG_INFO(0, number) 
  3. ZEND_END_ARG_INFO() 
  4.  
  5. /* {{{ int rust_fib( [ int $var ] ) 
  6.  */ 
  7. PHP_FUNCTION(rust_fib) 
  8.     zend_long number = 0; 
  9.     zend_long result = 0; 
  10.     ZEND_PARSE_PARAMETERS_START(0, 1) 
  11.         Z_PARAM_OPTIONAL 
  12.         Z_PARAM_LONG(number) 
  13.     ZEND_PARSE_PARAMETERS_END(); 
  14.  
  15.     if (number == 0) { 
  16.         RETURN_LONG(result); 
  17.     } else { 
  18.         result = fib(number); 
  19.         RETURN_LONG(result); 
  20.     } 
  21. /* }}}*/ 

功效同样让我惊喜,没有了FFI,它确实晋升了20%阁下的机能。但很明明,它的实现伟大度更高了。

回收Rust编写PHP扩展

(编辑:湖南网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

热点阅读