[TOC]

### 第一步 生成扩展demo Runing起来

#### 生成扩展demo

> 我们以php-7.4.1版本为例。

进入 cd php-7.4.1/ext 此目录,有一个名为 ext_skel.php。我们用此脚本生在扩展demo步骤如下

```

./ext_skel.php --ext gwalker

```

这样就在 ext目录下生成 gwalker扩展目录,目录内容如下:

```

[root@gw gwalker]# ls

config.m4 config.w32 gwalker.c php_gwalker.h tests

```

接下来进行编译,安装到php扩展中

```

[root@gw gwalker]# phpize

Configuring for:

PHP Api Version: 20131106

Zend Module Api No: 20131226

Zend Extension Api No: 220131226

```

```

./configure --with-php-config=/data/php/bin/php-config

make && make install

```

```

修改php.ini 把生成的so加关联到扩展中去

extension=/data/php/lib/php/extensions/debug-non-zts-20190902/gwalker.so

```

这样就把gwalker扩展加到php环境中去了。可以通过cli命令验证查看

```

./php -m | grep gwalker

gwalker

```

也可以重新启动php-fpm(或php内置web服务),通过浏览器验证

```

函数功能如下:

>求解 a*x^2 + b*x +c = 0;

>如果a为0则降级为一元一次方程求解。否则有无解的话返回布尔false,一个解返回数组[x],两个解返回数组[x1,x2]

#### 编码求解函数 getSolutionOVQE

> 注 OVQE 为Quadratic equation of one variable

```c

PHP_FUNCTION(getSolutionOVQE)

{

double a = 0;

double b = 0;

double c = 0;

// 定义x1,x2用来保放一元二次方程的两个解

double x1 = 0;

double x2 = 0;

// detal 记录 b^2 - 4ac的值

double detal = 0;

// =========参数接收处理阶段 begin ===============

ZEND_PARSE_PARAMETERS_START(2, 3) //接收参数,最少两个参数,最多3个参数

Z_PARAM_DOUBLE(a) // 接收第一参数,赋a

Z_PARAM_DOUBLE(b) // 接收第二参数,赋b

Z_PARAM_OPTIONAL // 表示后面的参数为选填项

Z_PARAM_DOUBLE(c) // 接收第二参数,赋c

ZEND_PARSE_PARAMETERS_END();

// =========参数接收处理阶段 end ===============

// 如果a与b两个系统数都为0,则返回false

if (a == 0 && b == 0)

{

RETURN_FALSE;

}

// 扩展开发通过return_value这个变量设置方法的返回值

array_init(return_value);

// 如果a=0 ,则降级为一元一次方程求解

if (a == 0)

{

x1 = -1 * (c/b);

add_index_double(return_value, 0, x1);

return;

}

detal = pow(b, 2) - 4 * a * c;

if (detal == 0)

{

x1 = (-b + sqrt(detal)) / (2 * a);

add_index_double(return_value, 0, x1);

return;

}

else if (detal > 0)

{

x1 = (-b + sqrt(detal)) / (2 * a);

x2 = (-b - sqrt(detal)) / (2 * a);

add_index_double(return_value, 0, x1);

add_index_double(return_value, 1, x2);

return;

}

// 都不符合是返回false

RETURN_FALSE;

}

```

##### 注册 getSolutionOVQE 函数

```c

static const zend_function_entry gwalker_functions[] = {

PHP_FE(gwalker_test1, arginfo_gwalker_test1)

PHP_FE(gwalker_test2, arginfo_gwalker_test2)

PHP_FE(getSolutionOVQE, NULL)

PHP_FE_END

};

```

#### 重新编译,测试

```

make && make install

```

```php

';

var_dump($v);

$h = getSolutionOVQE(1,2,1);

var_dump($h);

$h = getSolutionOVQE(1,-7,12);

var_dump($h);

$h = getSolutionOVQE(5,7,1);

var_dump($h);

$h = getSolutionOVQE(0,0,0);

var_dump($h);

$h = getSolutionOVQE(2,1,20);

var_dump($h);

$h = getSolutionOVQE(90,100,25);

var_dump($h);

$h = getSolutionOVQE(0,100,25);

var_dump($h);

exit;

```

输出如下:

```

array(1) {

[0]=>

float(-2)

}

array(1) {

[0]=>

float(-1)

}

array(2) {

[0]=>

float(4)

[1]=>

float(3)

}

array(2) {

[0]=>

float(-0.16148351928655)

[1]=>

float(-1.2385164807135)

}

bool(false)

bool(false)

array(2) {

[0]=>

float(-0.37987346332398)

[1]=>

float(-0.73123764778713)

}

array(1) {

[0]=>

float(-0.25)

}

```

#### 附php代码版求一元二次方程

```php

function php_getSolutionOVQE($a,$b,$c=0){

$x1=0;

$x2=0;

$detal=0;

if($a==0 && $b==0){

return false;

}

if($a==0){

$x1 = -1 * ($c/$b);

return [$x1];

}

$detal = pow($b,2) - 4*$a*$c;

if($detal == 0){

$x1 = (-1*$b + sqrt($detal)) / (2 * $a);

return [$x1];

}else if($detal > 0){

$x1 = (-1*$b + sqrt($detal)) / (2 * $a);

$x2 = (-1*$b - sqrt($detal)) / (2 * $a);

return [$x1,$x2];

}

return false;

}

```

#### 性能比较

现在分别进行100万次的一元二次方程求解。看下所用耗时

c扩展版如下(执行5次,用时记录如下):

```

use time : 0.993971824646 s

use time : 0.99442791938782 s

use time : 0.99134087562561 s

use time : 0.99235987663269 s

use time : 0.99243712425232 s

```

php代码版如下(执行5次,用时记录如下):

```

use time : 2.2686109542847 s

use time : 2.2673828601837 s

use time : 2.2710490226746 s

use time : 2.3082909584045 s

use time : 2.2692041397095 s

```

观察结果性能提升了2.2倍

**性能测试代码如下:**

> c扩展版

```

';

for($i = 1;$i<=1000000;$i++){

$a = $i+2;

$b = $i*3;

$c = $i+6;

$re = getSolutionOVQE($a,$b,$c);

//var_dump($re);

}

$end_time = microtime(true);

echo 'use time : '.($end_time-$start_time).' s';

exit;

```

> php代码版

```php

0){

$x1 = (-1*$b + sqrt($detal)) / (2 * $a);

$x2 = (-1*$b - sqrt($detal)) / (2 * $a);

return [$x1,$x2];

}

return false;

}

$start_time = microtime(true);

echo '';

for($i = 1;$i<=1000000;$i++){

$a = $i+2;

$b = $i*3;

$c = $i+6;

$re = php_getSolutionOVQE($a,$b,$c);

//var_dump($re);

}

$end_time = microtime(true);

echo 'use time : '.($end_time-$start_time).' s';

exit;

```

#### 代码地址

[https://github.com/gongwalker/getSolutionOVQE](https://github.com/gongwalker/getSolutionOVQE)

php 的一元二次方程_php扩展 求解一元二次方程相关推荐

  1. python自定义类求解一元二次方程_Python实现求解一元二次方程的方法示例

    本文实例讲述了Python实现求解一元二次方程的方法.分享给大家供大家参考,具体如下: 1. 引入math包 2. 定义返回的对象 3. 判断b*b-4ac的大小 具体计算代码如下: # -*- co ...

  2. python解一元二次方程步骤-Python实现求解一元二次方程的方法示例

    Python实现求解一元二次方程的方法示例 本文实例讲述了Python实现求解一元二次方程的方法.分享给大家供大家参考,具体如下: 1. 引入math包 2. 定义返回的对象 3. 判断b*b-4ac ...

  3. java 输入 方程,用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a、b及c从命令行做参数输入 java...

    题目: 用java 编写一程序,求解一元二次方程:aX2+bX+c=0.参数a.b及c从命令行做参数输入 java 答案参考: 以下程序在jdk5.0测试通过 import java.util.Sca ...

  4. 一元二次方程python脚本_Python实现求解一元二次方程的方法示例

    本文实例讲述了Python实现求解一元二次方程的方法.分享给大家供大家参考,具体如下: 1. 引入math包 2. 定义返回的对象 3. 判断b*b-4ac的大小 具体计算代码如下: # -*- co ...

  5. Python案例:四种方式编程求解一元二次方程

    文章目录 一.一元二方程求解公式 二.编程求解一元二次方程 1.直接求解一元二次方程 2.编写一元二次方程求解函数 3.编写一元二次方程类求解 (1)求实数解 (2)求复数解 4.利用sympy的so ...

  6. 利用C++求解一元二次方程

    题目:求解一元二次方程:ax²+bx+c=0 的解,其中a=1,b=-3,c=2. 分析:大家都知道一元二次方程的解有三种情况,即考虑Δ=(b²-4ac)的算术平方根,当Δ>0时,方程有两个不相 ...

  7. 【中学】求解一元二次方程

    [中学]求解一元二次方程 初中的小明已经开始学习求解一元二次方程了,下面让我们来教计算机如何求解.输入 a,b,c ,求一元二次方程 ax²+bx+c=0 的根. 包括复数根 输入: 假设 a,b,c ...

  8. C语言(求解一元二次方程的根)

    以下程序均在Visual C++6.0中运行成功 例:求方程2x^2-3x-6=0的根 #include <stdio.h> #include <math.h> void ma ...

  9. 11. 求解一元二次方程

    初中的小明已经开始学习求解一元二次方程了,下面让我们来教计算机如何求解.输入 a,b,c ,求一元二次方程 ax²+bx+c=0 的根. 输入: 假设 a,b,c均int. 输出: 要求输出的根为 d ...

  10. c++ 求解一元二次方程 全面考虑实根和虚根的情况

    题目 求解一元二次方程. 一元二次方程的定义为: ax2+bx+c=0 (1)如果b2 -4ac>0,方程有两个不同的实根,分别是: (2)如果b2 -4ac< 0,方程没有实根,但有虚根 ...

最新文章

  1. ECLIPSE 如何导入文件?
  2. AU3学习案例----------考勤机手工补卡
  3. 字段定义_两大高招逐浪CMS中定义省地市县三级字段显示方式
  4. HOOK技术-满足我们程序的偷窥欲
  5. Android --- RecyclerView 水平滑动时,一个 item 一个 item 的滑动,禁止滑动到一半停止
  6. easy ui 使用总结
  7. jmeter3.3—插件管理器的安装
  8. 飞鱼科技游戏开发岗面试经验
  9. linux查看ko信息,linux 查看信息命令
  10. CCO x Hologres:实时数仓高可用架构再次升级,双11大规模落地
  11. Android逆向笔记-使用Android Killer修改包名Android系统安装相同应用
  12. java上拉变量_「小程序JAVA实战」小程序页面的上拉下拉刷新(50)
  13. Qt 子窗体嵌入父窗体
  14. java 英语简历模板下载 百度云_java软件工程师英文简历模板下载
  15. 吉林公主岭玉米丰收将成定局
  16. wetool个人版_淘客干货:用了3年的wetool也没能幸免
  17. QT编程错误解决——error: no matching function for call to
  18. 在哪里计算机的cpu显卡硬盘,电脑硬件升级攻略 CPU/内存/显卡/固态硬盘该如何选择?...
  19. 【科创人南京行】西祠胡同创始人“响马”刘琥:一生寻找精神绿林,减区块链也许是正确方向...
  20. php本地浏览器调试,php浏览器端调试输出方法

热门文章

  1. 铃木敏文《零售的哲学》品读之对产品经理和程序员的现实意义 下篇
  2. 移动中兴服务器地址,一中国移动宽带各地dns服务器地址.doc
  3. Mann-Whitney 统计量
  4. 在计算机中1 KB等于多少字节,字节、kb、MB、GB 等单位怎么换算的?1M等于多少kb,1g等于多少kb?...
  5. luogu3191 [HNOI2007]紧急疏散EVACUATE
  6. 【2G模组Air202开发】使用LuatTools下载Luat底层Lod及编写第一个程序:流水灯
  7. C语言入门练习— —累乘
  8. ftp服务器批量下载文件(方式二)
  9. c语言无法定位程序输入点 于动态链接库,无法定位程序输入点于动态链接库?解决方法步骤...
  10. Ubuntu 14.04 引导修复(Boot Repair)(双系统修复一)