• PHP扩展浅谈

    这篇文章主要讲述php扩展开发,给想要尝试php扩展开发的同胞一个入口.需要一定的C语言及ZEND引擎了解 环境 Mac OS 10.13.2 源码php7.1.1 php环境php7.1.18 gcc 4.9 g++ 4.9 ./configure –with=php-config = /usr/local/Cellar/php@7.1/7.1.18_1/bin/php-config 为什么要写PHP扩展? 第一个理由是:PHP需要支持一项她还未支持的技术。这通常包括包裹一些现成的C函数库,以便提供PHP接口。例如,如果一个叫FooBase的数据库已推出市场,你需要建立一个PHP扩展帮助你从PHP里调用FooBase的C函数库。这个工作可能仅由一个人完成,然后被整个PHP社区共享(如果你愿意的话)。 第二个不是很普遍的理由是:你需要从性能或功能的原因考虑来编写一些商业逻辑。 怎么开发PHP扩展? 这个问题我在开始的时候一直摸不到头脑,边学习C语言边看PHP源码,虽然看不太懂,也是去网上查资料,硬着头皮看,在看zend引擎的时候很迷茫,因为网上没有很好的zend API函数文档可看,只能猜.更不要说扩展了 现在好了,鸟哥给出了如何用C/C++开发php扩展http://www.laruence.com/2009/04/28/719.html 原来官方直接给出了扩展搭建骨架供我们使用 查看https://renxinqiang.github.io/recursion/2018/09/10/php-config.html 了解源码及扩展源码 使用官方提供的扩展骨架开发 先上原理 这个是鸟哥博客的扩展原理图,使用文件来创建扩展骨架. 下面是--extname创建扩展骨架 下载php源码(和自己php环境一致版本) 进到源码 ext/文件里 ./ext_skel --extname=lovephp cd lovephp 修改config.m4文件,将PHP_ARG_WITH往下两行前面的dnl去掉 phpize 检测环境 ./configure --with-php-config=自己php环境的php-config 配置处理 make && make install 编译这个扩展 找到当前php环境ini添加.so文件,lovephp.so文件在module中 extension=lovephp.so 测试...


  • PHP源码配置文件解读

    这篇文章主要讲述php源码文件结构及配置文件的相关语言或技术 首先我们先从官网下载一个源码包 http://www.php.net/downloads.php 官网的地址,随便下载个7.1.1的版本玩 下载完tar解压下或者鼠标双击下 先看下目录结构 . ├── TSRM // zend和php相关线程安全管理目录 ├── Zend // 引擎相关内容,宏定义等 ├── build // 编译相关配置文件 ├── ext // 扩展库,例如curl,mysql等. /ext/standor包含标准扩展,例:array ├── main // 主要声明或者头文件,宏定义 ├── pear // 扩展应用目录,安装pear的核心文件等 ├── sapi // 接口服务,例cli,fpm,cli,cgi,apache的so模块等 ├── scripts // linux的工具配置文件,例phpize,php-config ├── tests // 测试集 └── win32 // windows编译时有关的脚本 简单介绍完目录结构我们需要编译php文件 configure是编译文件最主要的配置文件...


  • php56 xhprof性能测试扩展

    环境信息 OS 10.13 PHP 5.6.* php56-xhprof扩展 graphviz 2.40.1服务 homebrew工具 nginx nginx 解析目录/www 安装homebrew /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” 基于ruby开发的包管理工具 类似于linux的rpm,yum软件包管理工具 安装php56 安装php56环境是使用xhprof前提条件 请查看https://renxinqiang.github.io/recursion/2018/03/10/php-evn.html 安装php56-xhprof扩展 brew install php56-xhprof brew info php56-xhprof 查看安装目录,后面有用 配置php.ini php配置文件brew安装一般在/usr/local/etc/php/5.6/php.ini 加入xhprof扩展输入目录 [xhprof] xhprof.output_dir=/www/xhprof 重启php brew services restart php56 查看是否生效 php -m | grep xhprof 安装graphviz服务 这是保证在xhprof分析完程序后生成图片的服务,可视化查看程序慢的地方,后面会有例子 brew...


  • php56 nginx apache mysql环境搭建

    删除自带php和Apache http://zhidao.baidu.com/question/1446936138160793220.html 安装homebrew /usr/bin/ruby -e “$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)” 基于ruby开发的包管理工具 类似于linux的rpm,yum软件包管理工具 PHP 先安装 brew 可以去brew.sh官网安装 安装brew的php扩展 brew update brew tap homebrew/dupes brew tap homebrew/php brew tap josegonzalez/homebrew-php 全部执行完毕之后 查看php56的所有模块 执行 brew options php56 如果出现报错 Error: Formulae found in multiple taps: homebrew/php/php56-redis josegonzalez/php/php56-redis Please use the fully-qualified name e.g. homebrew/php/php56-redis to refer...


  • 递归加判断执行逻辑!

    代码展示 <?php function p($i, $n){ return ($i < $n && printf("%d\n", $i) && !p($i + 1, $n)) || printf("%d\n", $i); } p(1,5); ?> 代码分析 这段代码要分析的话可以简化一下,分析p(1, 2),首先 1 < 2 根据左值运算规则,会执行 第一个printf(),会输出1, 然后递归调用 p(2, 2), 递归中 2 < 2 不成立,执行第二个printf(), 会输出2, 由于printf执行后返回一个不为0的数字,所以递归p(2, 2) 的结果为真,取反后为假,所以第一次中的 i < N && printf() && !p(2,...