一个使用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++也会很容易.
实际上,PHP的语法和大多数函数名都是从C和C++派生出来的,从PHP到C++就像回家一样.
3.不需要任何Zend引擎的知识背景
有一个不可否认的事实:Zend引擎内部是非常复杂的,Zend的代码是非常混乱的,而且大多数都是没有文档,面对Zend,这是你每天都需要应对的棘手的问题.这个情况让我们轻易地做出选择:不要去做本地扩展.
但是,PHP-CPP分装了这些复杂的东西,提供了一套非常简单易用的C++类库.你可以使用C++写出高效的算法,而且不需要跟Zend打交道,你可以直接编写你的代码,而不用关心PHP的内部构造.
4.丰富的文档和注释的代码
有的人认为一个合格的程序员应该自己阅读和理解源码.PHP-CPP不这么认为,PHP-CPP提供了完整的文档,而且源代码也都提供了注释.
如果你需要更底层的信息,你完全可以去阅读源代码.(但是和Zend有关的代码会有点难以理解,不过这是因为Zend本身太复杂了).
5.支持所有的PHP的重要的特性
使用PHP-CPP,你可以像PHP一样轻松地处理变量/数组/函数/对象/类/接口/异常和命名空间,同时也可以使用C++的所有特性,包括线程/闭包/异步编程.
6.这是最快的解决方案了
有很多试图提升PHP的技术,但是无论如何,都不可能快过原生的C/C++的,无论你选择哪个技术,顶多达到原生C/C++的程度,那就不如直接使用PHP-CPP吧.
7.成熟的技术
C++是一个成熟的语言,已经有40年的历史, C++ 有一个官方的开放标准,并由一个 C++ 标准委员会控制,该委员会的成员具有良好的业绩.
C++是一种极其稳定、强大、智能和高质量的编程语言。 关于 C++ 的书籍和培训课程的数量也非常多,而这种伟大的 C++ 语言现在也可以用于构建 PHP 扩展。
8.丰富的扩展生态
C/C++ 是世界上最重要的语言,拥有最多的库。 在您开始使用 C/C++ 编写代码的那一刻,您可以立即访问大量的库。 没有其他语言可以接近 C/C++ 中可用的库的数量。
9. 使用 C++ 很有趣
C++ 是一门很棒的语言,它可以让你编写出色的面向对象代码——但同时也让你有能力毁掉一切。 使用 C++ 就像驾驶一辆非常强大的跑车:在正确的人手中它是世界上最好的汽车,但在坏人的手中也是危险的武器。 作为司机 - 你想要这样的车。 作为程序员 - 你会想要 C++。
10. 它是免费的!
PHP-CPP 是一种开源技术,您可以免费使用。 如果你不来试一试,那真是疯了.
一个现实的问题和他的解决方案
一般如果我们希望加载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扩展需要的全部代码了.
然后我们测试一下性能:
<?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很像.