ホームページ  >  記事  >  バックエンド開発  >  インタビュアー: PHP 拡張の実装方法をいくつか挙げて、そのパフォーマンスを比較してください。

インタビュアー: PHP 拡張の実装方法をいくつか挙げて、そのパフォーマンスを比較してください。

藏色散人
藏色散人転載
2022-03-28 13:55:595334ブラウズ

PHP 拡張機能のいくつかの実装方法について

1.php ネイティブ拡張機能の開発 C 言語、メモ: [ext_skel.php] スクリプト作成

2.zephir

3.php-cpp

#4.php-x

5.cgo

    ##カプセル化 zendapi モード
  • #CGO は C と GO コードをネストし、GO を使用して PHP 拡張スケルトンや GO
  • の特定の実装などをコンパイルします。 。 。上記の方法に限定されるものではありません。

[zephir、cgo、PHP Enable JIT] の 4 つのモードに焦点を当て、フィボナッチ数列の計算パフォーマンスを使用してランニング効果を確認します。

zephir コード生成拡張機能

//Main 类
final class Zimuge
{
  public static function calcFibonacci(int i){
      if (i < 2) {
          return i;
      }
      return self::calcFibonacci(i - 1) + self::calcFibonacci(i - 2);
  }
编译安装
zephir build

cgo コード生成拡張機能

package main
/*
#ifdef HAVE_CONFIG_H
#include "config.h"
#endif
#include "php.h"
#include "php_ini.h"
#include "ext/standard/info.h"
static int le_go2php;
PHP_MINIT_FUNCTION(go2php)
{
    return SUCCESS;
}
PHP_MSHUTDOWN_FUNCTION(go2php)
{
    return SUCCESS;
}
PHP_RINIT_FUNCTION(go2php)
{
    return SUCCESS;
}
PHP_RSHUTDOWN_FUNCTION(go2php)
{
    return SUCCESS;
}
PHP_MINFO_FUNCTION(go2php)
{
    php_info_print_table_start();
    php_info_print_table_header(2, "go2php support", "enabled");
    php_info_print_table_end();
}
PHP_FUNCTION(go2php_print)
{
    zend_long a,b;
    ZEND_PARSE_PARAMETERS_START(1, 1)
        Z_PARAM_LONG(a)
    ZEND_PARSE_PARAMETERS_END();
    b = calcFib(a);
    RETURN_LONG(b);
}
ZEND_BEGIN_ARG_INFO(null, 0)
ZEND_END_ARG_INFO()
const zend_function_entry go2php_functions[] = {
    PHP_FE(go2php_print, null)
    PHP_FE_END
};
zend_module_entry go2php_module_entry = {
    STANDARD_MODULE_HEADER,
    "go2php",
    go2php_functions,
    PHP_MINIT(go2php),
    PHP_MSHUTDOWN(go2php),
    PHP_RINIT(go2php),
    PHP_RSHUTDOWN(go2php),
    PHP_MINFO(go2php),
    "0.1.0",
    STANDARD_MODULE_PROPERTIES
};
#ifdef COMPILE_DL_GO2PHP
ZEND_GET_MODULE(go2php)
#endif
*/
import "C"
func main() {}
package main
import "C"
//export calcFib
func calcFib(i int) int {
    if i < 2 {
        return i
    }
    return calcFib(i-1)+calcFib(i-2)
}

コンパイルとリンク

CGO_CFLAGS="-g \
-I`/root/download/php8/bin/php-config --include-dir` \
-I`/root/download/php8/bin/php-config --include-dir`/main \
-I`/root/download/php8/bin/php-config --include-dir`/TSRM \
-I`/root/download/php8/bin/php-config --include-dir`/Zend \
-I`/root/download/php8/bin/php-config --include-dir`/ext \
-I`/root/download/php8/bin/php-config --include-dir`/ext/date/lib \
-DHAVE_CONFIG_H" CGO_LDFLAGS="-Wl,--export-dynamic -Wl,--unresolved-symbols=ignore-all" go build -p 1 -gcflags "-l" -buildmode=c-shared -o go2php.so

PHP スクリプト コードのテスト

<?php
const COUNT = 30;
function calcFibonacci(int $i): int {
    if ($i < 2) {
        return $i;
    }
    return calcFibonacci($i - 1) + calcFibonacci($i - 2);
}
// CGO 速度
$startTime = microtime(true);
for($i = 1; $i <= COUNT; $i++) {
    if($i != COUNT) {
        go2php_print($i);
    }else {
        echo go2php_print($i)."\n";
    }
}
$time = microtime(true) - $startTime;
echo "CGO: {$time} 秒\n";
//zephir 速度
$startTime = microtime(true);
for($i = 1; $i <= COUNT; $i++) {
    if($i != COUNT) {
        Lsz\Zimuge::calcFibonacci($i);
    }else {
        echo Lsz\Zimuge::calcFibonacci($i)."\n";
    }
}
$time = microtime(true) - $startTime;
echo "zephir: {$time} 秒\n";
// PHP JIT 速度
$startTime = microtime(true);
for($i = 1; $i <= COUNT; $i++) {
    if($i != COUNT) {
        calcFibonacci($i);
    }else {
        echo calcFibonacci($i)."\n";
    }
}
$time = microtime(true) - $startTime;
echo "PHP: {$time} 秒\n";

PHP JIT を使用しないテスト

php test.php
->执行结果取一个平均
832040
CGO: 0.059875011444092 秒
832040
zephir: 8.5679790973663 秒
832040
PHP: 0.75995492935181 秒

PHP JIT を使用しないテスト

php -dopcache.enable_cli=1 -dopcache.jit_buffer_size=100M test.php 
->执行结果取一个平均
832040
CGO: 0.046900987625122 秒
832040
zephir: 5.5882248878479 秒
832040
PHP: 0.10621190071106 秒

cgo と zephir によってコンパイルされた so ファイルは、php.ini を通じてインポートされます

テストを実行するにはスクリプトが正しく読み込まれていることを確認する必要があります。

コマンド php -m または php --ri xx.so を実行して確認します。

[PHP Modules]
Core
ctype
curl
date
dom
FFI
fileinfo
filter
gd
go2php
hash
iconv
json
libxml
lsz
mbstring
mysqlnd
openssl
pcre
PDO
pdo_mysql
pdo_sqlite
Phar
posix
redis
Reflection
session
SimpleXML
SPL
sqlite3
standard
swoole
tokenizer
xml
xmlreader
xmlwriter
yaf
Zend OPcache
zephir_parser
zimuge
[Zend Modules]
Zend OPcache

PHP バージョンを使用する

php -v
PHP 8.1.3 (cli) (built: Feb 27 2022 19:40:08) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.1.3, Copyright (c) Zend Technologies
    with Zend OPcache v8.1.3, Copyright (c), by Zend Technologies

結論:

JIT は PHP のパフォーマンスを向上させることができます。

Go を学びたいが PHP を諦めたくない場合は、CGO をプレイできます。

zephir コンピューティングのパフォーマンスはあまり良くありませんが、PHP 拡張機能の作成は比較的簡単に実装できます。

推奨学習: 「

PHP ビデオ チュートリアル

以上がインタビュアー: PHP 拡張の実装方法をいくつか挙げて、そのパフォーマンスを比較してください。の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はlearnku.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。