PHP-CPP官方文档中文版 – 输出(output)与错误(error)

输出与错误你可以使用C++中常规的流类库,比如一些常规的操作符 << 和特殊的功能 std::endl。然而,并不推荐使用'std::out'和'std::err'。当PHP以Web服务模块运行的时候,使用'std::out'的输出信息会直接输出到当初启动PHP的进程的终端中。在生产环境中,这种终端不是活跃状态的,所以任何以'std::out'发送出去的信息都会被丢掉。因此,在以Web模块方式运行的扩展中,使用'std::out'是无法进行的(no-go)。但是,尽管PHP将以命令行脚本(Cli script)的方式('std::out'可以正常使用),仍然不建议你直接使用'std::out'。使用'std::out'会被所有的已经在PHP用户脚本中定义的输出机制忽略(output handler)。可以利用PHP-CPP库中提供的'Php::out' stream包来取而代之。这个'Php... Read More

PHP-CPP官方文档中文版 – PHP如何加载扩展

也许你知道,在类unix系统中,原生的PHP扩展需要编译成.so文件,而在Windows系统中,会编译成.dll文件,编译之后,全局php.ini文件会包含着系统中可用的扩展列表。也就是说,创建一个扩展并让PHP加载的话,需要生成一个.so或者.dll文件,然后更新PHP配置文件。启动函数get_module(在讲述如何创建你自己的扩展之前,我们先来看看PHP是如何加载扩展的。当PHP启动时,它会从配置目录下加载*.ini配置文件,并且读取配置文件中类似"extension=name.so"的每一行,相应地打开每一个库调用其中的"get_module()"方法。因此,每一个扩展(你的扩展也不例外)库都需要定义且实现”get_module()"函数。这个函数会在PHP加载扩展库后调用(and thus way before pageviews are handled),然后需要返回一个内存... Read More

PHP-CPP官方文档中文版 – 你的第一个扩展

当你创建自己的PHP-CPP扩展时,同样你不得不编译和部署它。一个正常的PHP脚本仅仅需要拷贝到Web服务上即可部署,但是部署一个扩展需要花费一些精力:你需要一个Makefile文件,一个用于扩展的php.ini文件,当然还有一个实现扩展业务的*.cpp文件。为了让你清楚这些步骤,我们已经创建了一个几乎为空的扩展,但包含了所有这些必须的文件。它包含了一个Makefile文件,配置文件和一个已经实现get_module()调用的主函数文件main.cpp。这些会帮助你快速的开始扩展开发。[code lang="cpp"EmptyExtension.ziEmptyExtension.tar.g[/codeMakefil上述的EmptyExtension文件中包含了一个详尽描述编译器的Makefile文件。为了满足你的扩展,你需要(简单地)修改下Makefile文件。其中最重要的修改地... Read More

PHP-CPP官方文档中文版 – 如何安装PHP-CPP

在使用PHP-CPP来构建自己飞快的、原生的PHP扩展时,首先你不得不在系统上安装PHP-CPP库。幸运的是,对于我们来说(那些使用Linux或者Apple环境的人),这就是小菜一碟。然而,如果你使用的是其他系统,那么你只能靠自己了(you are left on your own)。因为我们(指的是PHP-CPP的开发者),仅使用Linux系统。所以,这也没有任何理由来说明为什么这些库不应该运行在其他平台的言论,仅仅是因为它是由纯C++代码写的。因此,如果你在使用其他的系统,同时一直在设法编译它,那么请告知我们。我们来更新这些安装文档,并包含一些其他平台。下载安装的第一件事是下载源码。你既可以从我们的下载页面下载最新的发布版本,也可以从GitHub中下载最新的开发者版本(work-in-progress)。为了获取最新的GitHub版本,运行如下行的命令$ git clone http... Read More

PHP底层的运行机制与原理

PHP说简单,但是要精通也不是一件简单的事。我们除了会使用之外,还得知道它底层的工作原理。PHP是一种适用于web开发的动态语言。具体点说,就是一个用C语言实现包含大量组件的软件框架。更狭义点看,可以把它认为是一个强大的UI框架。了解PHP底层实现的目的是什么?动态语言要像用好首先得了解它,内存管理、框架模型值得我们借鉴,通过扩展开发实现更多更强大的功能,优化我们程序的性能。1. PHP的设计理念及特点多进程模型:由于PHP是多进程模型,不同请求间互不干涉,这样保证了一个请求挂掉不会对全盘服务造成影响,当然,随着时代发展,PHP也早已支持多线程模型。弱类型语言:和C/C++、Java、C#等语言不同,PHP是一门弱类型语言。一个变量的类型并不是一开始就确定不变,运行中才会确定并可能发生隐式或显式的类型转换,这种机制的灵活性在web开发中非常方便、高效,具体会在后面PHP变量中详述。引擎(Zend)+组件(ext)的模式降低内部耦合。... Read More

基于 libgit2 C 语言库的 php-git 扩展 fix bug 辛酸史

前言这是一篇极其没有节(nei)操(rong)的文章。除非你真的无聊,请不要阅读,否则后果自负正文最近,在忙活微博话题组的日构建工具。工具主要的功能并不算复杂。。。写着写着,外面雨过天晴,居然还放起爆竹了,什么鬼。构建工具的主要功能正如介绍中所述的那样,提取产品、测试等基本信息、提取版本库(git)信息、检查(编译)源文件、自动部署项目与发送邮件等。在提取git库信息时,相对于之前利用shell_exec PHP原生函数提取svn信息的方式,打算利用扩展来提取信息。一来更规范、更有效率(微乎其微),二来专业。缺点是相对而言部署环境麻烦,因为需要安装git扩展到当前php运行环境中来。但是,万万没想到官方推荐的php-git扩展库开发版本已有3年没有维护了。索性用吧,又能怎样。。。安装还算顺利,由于公司开发机没有cmake,yum源也不可用,懒得配置,直接download一套源码。cd /root/down/php-gi... Read More

PHP 扩展开发利器之 PHP-CPP 库官方中文文档

如果对PHP-CPP感兴趣并期望看到中文版,拜托给Github的PHP-CPP-Document库点个赞,你的star我的动力。这段时间对PHP扩展开发比较热衷,起初先趟了一遍(半遍吧)用Zend引擎来开发扩展的方式(http://www.walu.cc/phpbook/preface.md),可是问题来了。正如PHP官方所说的那样,”Zend的好处就是定义了很多宏,可惜坏处是宏真是太多了”。未知的东西是可怕的,也是困难的。所以相对比较起来,这个用纯C++的库来说(PHP-CPP),对于C++开发者真是轻车熟路。翻译内容目前托管到了GitHub上,后续会陆续更新到本博,对PHP-CPP扩展感兴趣或者对于翻译感兴趣的朋友,请多指正目录注:本博的内容旧于下文给出的Github内容,有兴趣的读者建议到Github总阅读。PHP-CPP库有着丰富的文档。下面左侧的菜单中说明了如何在你的服务器中安... Read More

PHP 扩展开发入门 PHP-CPP 篇(未完待续)

在你使用PHP来解决一些事情的时候,可能会考虑亲手开发一个PHP扩展。以下是我能想到的驱使我开发PHP扩展的几点理由扩展PHP的功能在某些非常特殊的使用场景(比如数学,统计和几何等等)。相比于用纯PHP代码实现,提高PHP的性能和效率。利用自身之前掌握的另一种编程语言(对我来说是C++)来进行快速的开发。当谈论到选择建立PHP扩展的工具时,我们自然会想到两个不同的方法使用更接近PHP语法的工具,比如Zephir。使用更接近C/C++语法的工具,比如下文会提到的PHP-CPP。个人而言,选择第二种方式更为简单:C/C++是我入门编程的第一门语言,因此我一直觉得使用C/C++写一些更底层的模块更轻松些。PHP-CPP的官方网站也给出了一些为什么这么做的理由。安装与配置PHP-CPP发展迅速。在写这篇文章的时候,已经发布了0.9.1版本(两天前发布了0.9.0版本)。据文档描述,“为了迎接下... Read More

关于“如何开发 PHP 扩展”的学习小结

近期,工作上的业务并不是很忙。做了大半年的业务逻辑,尽管在PHP编码习惯和技巧上有所进步,初步熟悉了在高并发下Redis和Memcache缓存的使用和注意事项。但,应该借此闲暇时间探索下PHP底层的一些原理。这样,才是会有质的提升,写出更好的代码。正如那句话“PHP取得成功的一个主要原因之一是她拥有大量的可用扩展”,那就从PHP扩展入手了解下。在此之前,大家肯定都了解“PHP是C写的”。于是打开了PHP的源码,列出跟目录列表如下图(有亮点~ 怎么单位的女同事都没了。。)PHP(5.6.4)跟目录列表看到了熟悉的以后缀.c结尾的源文件。如图,有个名为“Zend”的文件夹很重要,这个就是PHP的核心。于是在网上搜到了两个若干PHP扩展的教程http://www.laruence.com/2009/04/28/719.htmhttp://www.walu.cc/phpboo起初,耐心的看... Read More

提高 PHP 编程效率你得这么做

用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围的字符串中搜寻变量,单引号则 不会,注意:只有echo能这么做,它是一种可以把多个字符串当作参数的“函数”(译注:PHP手册中说echo是语言结构,不是真正的函数,故把函数加 上了双引号)。1、如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍。2、$row[’id’] 的速度是$row[id]的7倍。3、echo 比 print 快,并且使用echo的多重参数(译注:指用逗号而不是句点)代替字符串连接,比如echo $str1,$str2。4、在执行for循环之前确定最大循环数,不要每循环一次都计算最大值,最好运用foreach代替。5、注销那些不用的变量尤其是大数组,以便释放内存。6、尽量避免使用__get,__set,__autoload。7、require_once()代价昂贵。... Read More

PHP 中 9 大缓存技术总结

1、全页面静态化缓存也就是将页面全部生成html静态页面,用户访问时直接访问的静态页面,而不会去走php服务器解析的流程。此种方式,在CMS系统中比较常见,比如dedecms;一种比较常用的实现方式是用输出缓存Ob_start(******要运行的代码******$content = Ob_get_contents();****将缓存内容写入html文件****Ob_end_clean();2、页面部分缓存该种方式,是将一个页面中不经常变的部分进行静态缓存,而经常变化的块不缓存,最后组装在一起显示;可以使用类似于ob_get_contents的方式实现,也可以利用类似ESI之类的页面片段缓存策略,使其用来做动态页面中相对静态的片段部分的缓存(ESI技术,请baidu,此处不详讲)。该种方式可以用于如商城中的商品页;3、数据缓存顾名思义,就是缓存数据的一种方式;比如,商城中的某个商品... Read More

PHP Redis 扩展操作类

PHP语言Redis扩展类DEMO[code lang="php"class MyRedis private $redis;/** @param string $hos* @param int $pos*public function __construct($host = '10.102.1.8', $port = 6379) $this->redis = new Redis$this->redis->connect($host, $port);return $this->red/** 设置值 构建一个字符串* @param string $key KEY名称* @param string $value 设置值* @param int $timeOut 时间 0表示无过期时间*public function set($key, $value, $ti... Read More

PHP 数组函数 array_diff()、array_merge() 与数组操作符 +

array_diff()函数是以值为判断依据,比如[code lang="php"use Libs\Helper;include '../vendor/autoload.php';$a = array 0 => '1761 => '1192 => '4183 => '1554 => '638);$b = array(1760, 9999, '8999');Helper::p(array_diff($a, $b));Helper::p(array_diff($b, $a));[/code输出[code lang="php"Arra[1] => 1[2] => 4[3] => 1[4] => 6Arra[1] => 9[2] => 8[/code同样,array_merge函数也是以值为判断依据进行合并... Read More

利用 xhprof(PHP)扩展进行 WEB 性能分析

最近工作有些小忙,经常加班,偶尔还会通宵。但最终热门微博“混合流”顺利地全量上线了。可是,从性能角度来说,还是有不少的提升空间的。下面说下利用xhprof来进行WEB性能的分析。安装xhprof扩展官方的文档胜过一切 => http://php.net/xhpro注意:如果想利用xhprof绘图,那么需要将系统默认禁用函数打开。[code lang="php";disable_functions = phpinfo,system,exec,shell_exec,passthru,proc_close,show_sourc[/code部署xhprof的运行环境经过上面的配置,在你跑过项目后,xhprof会输出一份报告文件。不过,这份文件的内容是被序列化的数组。所以,需要搭建一个能够读取该数据文件的WEB环境。这里给一份xhprof环境的代码:http://pan.baidu.co... Read More