[PHP-CPP]使用C++来扩展PHP的能力

2022-03-16 奥古斯宏
一个使用C++来开发PHP扩展的开源项目

什么是PHP-CPP?

它是一个C++库,用来开发PHP的扩展.它提供了一个文档丰富且易于使用的类库,可以使用这些类库开发PHP的扩展.也就是说我们可以用C++来开发PHP的扩展了.

为什么要使用PHP-CPP?

使用这个C++库,可以非常享受的开发出一个PHP的扩展,使用它编写的代码简单易懂,并且能为你的软件带来很大的提升.

使用PHP-CPP的特性和原因

1.性能更快

使用C++编写的代码相比PHP的代码来说,非常非常快,在官网给出的一个冒泡排序的例子中,C++的性能是PHP的十倍左右.它能让程序占用更少的CPU,却有更好的响应能力,可以节约我们的硬件投入.

2.相当的简单

一般而言,C和C++的给人的第一印象都是困难的复杂的.但是你只要看一下它的文档你就会感到惊讶.它写起来非常简单,写出的C++代码就像PHP的代码一样简单易读.只要你会写PHP,那么使用PHP-CPP来写C++也会很容易.

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

实际上,PHP的语法和大多数函数名都是从C和C++派生出来的,从PHP到C++就像回家一样.

3.不需要任何Zend引擎的知识背景

有一个不可否认的事实:Zend引擎内部是非常复杂的,Zend的代码是非常混乱的,而且大多数都是没有文档,面对Zend,这是你每天都需要应对的棘手的问题.这个情况让我们轻易地做出选择:不要去做本地扩展.

但是,PHP-CPP分装了这些复杂的东西,提供了一套非常简单易用的C++类库.你可以使用C++写出高效的算法,而且不需要跟Zend打交道,你可以直接编写你的代码,而不用关心PHP的内部构造.

4.丰富的文档和注释的代码

有的人认为一个合格的程序员应该自己阅读和理解源码.PHP-CPP不这么认为,PHP-CPP提供了完整的文档,而且源代码也都提供了注释.

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

如果你需要更底层的信息,你完全可以去阅读源代码.(但是和Zend有关的代码会有点难以理解,不过这是因为Zend本身太复杂了).

5.支持所有的PHP的重要的特性

使用PHP-CPP,你可以像PHP一样轻松地处理变量/数组/函数/对象/类/接口/异常和命名空间,同时也可以使用C++的所有特性,包括线程/闭包/异步编程.

6.这是最快的解决方案了

有很多试图提升PHP的技术,但是无论如何,都不可能快过原生的C/C++的,无论你选择哪个技术,顶多达到原生C/C++的程度,那就不如直接使用PHP-CPP吧.

7.成熟的技术

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

C++是一个成熟的语言,已经有40年的历史, C++ 有一个官方的开放标准,并由一个 C++ 标准委员会控制,该委员会的成员具有良好的业绩.

C++是一种极其稳定、强大、智能和高质量的编程语言。 关于 C++ 的书籍和培训课程的数量也非常多,而这种伟大的 C++ 语言现在也可以用于构建 PHP 扩展。 

8.丰富的扩展生态

C/C++ 是世界上最重要的语言,拥有最多的库。 在您开始使用 C/C++ 编写代码的那一刻,您可以立即访问大量的库。 没有其他语言可以接近 C/C++ 中可用的库的数量。 

9. 使用 C++ 很有趣 

C++ 是一门很棒的语言,它可以让你编写出色的面向对象代码——但同时也让你有能力毁掉一切。 使用 C++ 就像驾驶一辆非常强大的跑车:在正确的人手中它是世界上最好的汽车,但在坏人的手中也是危险的武器。 作为司机 - 你想要这样的车。 作为程序员 - 你会想要 C++。 

10. 它是免费的! 

PHP-CPP 是一种开源技术,您可以免费使用。 如果你不来试一试,那真是疯了.

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

一个现实的问题和他的解决方案

一般如果我们希望加载PHP的扩展,我们需要将它安装到指定位置,并且一旦加载了,这个扩展对这台服务器上所有的网站来说都是共享的.

这就大大限制了使用扩展来做网站业务的开发.但是问题不大,可以使用PHP-CPP提供的dl()特性,动态加载,且可以做到单个网站加载扩展.所以并没有什么问题,毕竟使用的是C++.

冒泡排序的实例

PHP中:

<?php
        function scripted_bubblesort(array $input)
        {

            $count = count($input);

            for ($i = 0; $i < $count; $i++)
            {
                for ($j = 1; $j < $count - $i; $j++)
                {
                    if ($input[$j-1] <= $input[$j]) continue;
                    $temp = $input[$j];
                    $input[$j] = $input[$j-1];
                    $input[$j-1] = $temp;
                }
            }
            // done
            return $input;
        }
    ?>


使用PHP-CPP编写代码:

#include <phpcpp.h>

Php::Value native_bubblesort(Php::Parameters ¶ms)
{
    std::vector<int> input = params[0];

    for (size_t i = 0; i < input.size(); i++)
    {
        for (size_t j = 1; j < input.size() - i; j++)
        {
            if (input[j-1] <= input[j]) continue;
            
            int temp = input[j];
            input[j] = input[j-1];
            input[j-1] = temp;
        }
    }

    return input;
}


extern "C" {

   
    PHPCPP_EXPORT void *get_module() 
    {
        
        static Php::Extension extension("bubblesort", "1.0");

        extension.add("native_bubblesort", native_bubblesort, { 
            Php::ByVal("input", Php::Type::Array)
        });

        return extension;
    }
}

首先你会发现使用PHP-CPP编写扩展的代码并不复杂,他们非常像,然而这几乎是编写PHP扩展需要的全部代码了.

版权声明:本文由phpreturn.com(PHP武器库官网)原创和首发,所有权利归phpreturn(PHP武器库)所有,本站允许任何形式的转载/引用文章,但必须同时注明出处。

然后我们测试一下性能:

<?php

$count = 10000;
$x = array();
for ($i=0; $i<$count; $i++) $x[] = rand(0, 1000000);

$start = microtime(true);
$y = native_bubblesort($x);
$native = microtime(true);
$x = scripted_bubblesort($x);
$scripted = microtime(true);

// show the results
echo("Native:   ".($native - $start)." seconds\n");
echo("Scripted: ".($scripted - $native)." seconds\n");

最后结果:

Native:   0.79793095588684 seconds
Scripted: 8.9202060699463 seconds

C++要快,而且快了几乎十倍.并且C++的写法和PHP很像.

最近浏览
IP用户:52.230.*.*
11 小时前 GPTBot
IP用户:52.230.*.*
11 小时前 GPTBot
IP用户:52.230.*.*
15 小时前 GPTBot
IP用户:52.230.*.*
16 小时前 GPTBot
IP用户:52.230.*.*
16 小时前 GPTBot
IP用户:52.230.*.*
18 小时前 GPTBot
IP用户:52.230.*.*
18 小时前 GPTBot
IP用户:110.154.*.*
19 小时前 Go-http-client
IP用户:54.36.*.*
1 天前 aHrefs Bot
IP用户:139.213.*.*
1 天前 Go-http-client
IP用户:132.145.*.*
2 天前 Grapeshot
IP用户:182.161.*.*
2 天前 CriteoBot
累计浏览次数:2325
评论
点击登录
phpreturn,PHP武器库,专注PHP领域的项目和资讯,收录和介绍PHP相关项目。
最近浏览 点击登录
累计浏览次数:128612
一周浏览次数:2318
今日浏览次数:39

本站所有权利归 phpreturn.com 所有

举报/反馈/投稿邮箱:phpreturn@ulthon.com

鲁ICP备19027671号-2