面试官:列举几种PHP拓展的实现手段及其性能比较?

PHP 扩展的几种实现手段:1.php 原生扩展开发 c 语言;2.zephir;3.php-cpp;4.php-x;5.cgo。

关于 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 开启 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 引入进来

执行测试脚本需要保证so正确读取进来。

命令 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 扩展实现起来比较简单。

如何用composer开发自己的php扩展包

转载2019-11-18 17:08:123096 + php学习QQ群:609135716下面由composer使用教程栏目给大家介绍用composer开发自己的php扩展包的方法,希望对需要的朋友有所帮助!

面试官:列举几种PHP拓展的实现手段及其性能比较?

php零基础到就业直播视频课:进入学习程序员必备接口测试调试工具:立即使用

composer 是PHP用来管理依赖关系的工具

详情可以阅读:https://www.phpcomposer.com/

安装 见 https://www.phpcomposer.com/

开发流程

初始化自己的扩展包 composer init

$ composer init
Welcome to the Composer config generator

This command will guide you through creating your composer.json config.
Package name (<vendor>/<name>) [administrator/self_composer]: victor/composer-self //包名称-不能大写,否则无效
Description []: composer-self package //描述
Author [victor24680 <490319148@qq.com>, n to skip]://作者
Minimum Stability []: dev //最小稳定版本
Package Type (e.g. library, project, metapackage, composer-plugin) []: library //类型
License []: MIT
Define your dependencies.
Would you like to define your dependencies (require) interactively [yes]? n //是否定义依赖关系
Would you like to define your dev dependencies (require-dev) interactively [yes]? n
{
"name": "victor/composer-self",
"description": "This is a composer-send package",
"type": "victor",
"license": "MIT",
"authors": [
{
"name": "victor24680",
"email": "490319148@qq.com"
}
],
"minimum-stability": "dev",
"require": {}
}
Do you confirm generation [yes]? yes

修改自己包的依赖关系,修改内容如下

{
"name": "victor/sendtool-package",
"description": "sendtool package",
"type": "victor",
"license": "MIT",
"authors": [
{
"name": "victor24680",
"email": "490319148@qq.com"
}
],
"minimum-stability": "dev",
"require": {
"php": ">=5.6" //php版本要求
},
"autoload": {
"psr-4": { //加载规范
"App\\": "src/App",
"Contract\\": "src/Contract"
}
}
}

编写好源码 见:https://github.com/victor24680/self-composer/tree/master/src

安装测试 composer install

$ composer install
Loading composer repositories with package information
Updating dependencies (including require-dev)
Content-Length mismatch, received 37487 bytes out of the expected 2005372
http://packagist.org could not be fully loaded, package information was loaded from the local cache and may be out of date
Nothing to install or update
Writing lock file
Generating autoload files

GitHub上创建composer-self仓库

git init
git add .
git commit -m "初始自己的组件库"
git remote add origin https://github.com/victor24680/self-composer.git
git push origin master

Packagist 上提交自己的github创建的composer-self仓库地址

注册地址:https://packagist.org/,提交成功之后,就可以开始下面的测试

测试 ,A目录代表项目根目录

创建一个A目录,然后在项目根目录下执行:composer require victor24680/self-composer dev-master

$ composer require victor24680/self-composer dev-master
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Package operations: 1 install, 0 updates, 0 removals
– Installing victor24680/self-composer (dev-master 0935c75): Cloning 0935c75eda from cache
Writing lock file
Generating autoload files
<?php
#项目根目录/index.php
include "vendor/autoload.php";
use App\CommonInfo;
use App\Zn;
$app=new CommonInfo(new Zn());
echo $app->msg('小明','隔壁老王在偷吃!!!');
//输出:【站内消息】发送给:小明|发送内容:【普通消息】隔壁老王在偷吃!!!

至此,一个完整的自己的composer组件包,开发完成。

以上就是如何用composer开发自己的php扩展包的详细内容,更多请关注钦钦技术栈其它相关文章!

转载至:php中文网【www.php.cn】

版权声明:本文(即:原文链接:https://www.qin1qin.com/catagory/24430/)内容由互联网用户自发投稿贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 630367839@qq.com 举报,一经查实,本站将立刻删除。

(0)
上一篇 2022年9月21日 下午3:02
下一篇 2022年9月21日 下午3:02
软件定制开发公司

相关阅读

发表回复

登录后才能评论
通知:禁止投稿所有关于虚拟货币,币圈类相关文章,发现立即永久封锁账户ID!