使用C创建php扩展

2023-05-16

使用C创建php扩展

优点:

1.提高运行效率。

2.降低php复杂度,可以直接调用扩展方法实现功能。

3.方便与第三方库交互。


缺点:

1.开发比php复杂。

2.可维护性降低。

3.开发周期变长。php开发,发现问题后,只要修复问题,即可见到效果。如果使用扩展,修复后需要重新编译,重启服务,才能见到效果。


首先,假定需要实现一个方法:将url字符串转换成超链接

php实现方法:

<?php

function strtolink($url, $name='', $openwin=0){
    $name = $name==''? $url : $name;
    $openwin = $openwin==1? ' target="_blank" ' : '';
    return '<a href="'.$url.'" '.$openwin.'>'.$name.'</a>';
}

echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog', 1);

?>

现在使用C来做这个方法的扩展,开发php扩展需要使用ext_skel工具包,此工具包在php安装包的 /ext/ 中,例如:php-5.3.15/ext/ext_skel

1.创建 skel 文件,保存为 strtolink.skel

string strtolink(string url, string name, int openwin)

2.创建扩展框架

./ext_skel --extname=strtolink --proto=strtolink.skel
cd strtolink

3.修改配置文件 config.m4

将这10,11,12三行前面的 dnl 去掉
dnl PHP_ARG_WITH(strtolink, for strtolink support,
dnl Make sure that the comment is aligned:
dnl [  --with-strtolink             Include strtolink support])

即修改为:
PHP_ARG_WITH(strtolink, for strtolink support,
Make sure that the comment is aligned:
[  --with-strtolink             Include strtolink support])

4.实现功能,修改strtolink.c,将PHP_FUNCTION(strtolink)这个方法修改为:

PHP_FUNCTION(strtolink)
{
        char *url = NULL;
        char *name = NULL;
        int argc = ZEND_NUM_ARGS();
        int url_len;
        int name_len;
        long openwin = 0;
        char *opentag;
        char *result;

        if (zend_parse_parameters(argc TSRMLS_CC, "s|sl", &url, &url_len, &name, &name_len, &openwin) == FAILURE)
                return;

        if (name == NULL || strlen(name)==0){
                name = url;
        }

        if (openwin == 1){
                opentag = " target=\"_blank\" ";
        }else{
                opentag = "";
        }

        url_len = spprintf(&result, 0, "<a href=\"%s\" %s>%s</a>", url, opentag, name);

        RETURN_STRINGL(result, url_len, 0);

        php_error(E_WARNING, "strtolink: not yet implemented");
}

5.编译扩展

phpize
sudo ./configure
sudo make
sudo make test

make 如果出现 error: ‘PHP_FE_END’ undeclared here (not in a function)

使用下面语句可解决,之后再重新编译

sed -i 's|PHP_FE_END|{NULL,NULL,NULL}|' ./strtolink.c  
sed -i 's|ZEND_MOD_END|{NULL,NULL,NULL}|' ./strtolink.c 

成功后在strtolink/modules 下找到strtolink.so 文件


6.添加扩展

将strtolink.so 复制到 php 扩展目录,可以通过phpinfo的 extension_dir 查看扩展目录位置

sudo cp strtolink.so /usr/lib/php5/20090626/strtolink.so

修改php.ini ,在最后添加 extension="strtolink.so"

重启动apache,phpinfo中会见到新扩展 strtolink



7.使用扩展

用回之前的php,只是把strtolink function 去掉便可。此方法已在扩展实现,可直接调用。

<?php

echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog', 1)."\r\n";
echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog', 0)."\r\n";
echo strtolink('http://blog.csdn.net/fdipzone', 'fdipzone blog')."\r\n";
echo strtolink('http://blog.csdn.net/fdipzone', '', 1)."\r\n";
echo strtolink('http://blog.csdn.net/fdipzone', '')."\r\n";
echo strtolink('http://blog.csdn.net/fdipzone', NULL, NULL)."\r\n";

?>
输出:

<a href="http://blog.csdn.net/fdipzone"  target="_blank" >fdipzone blog</a>
<a href="http://blog.csdn.net/fdipzone" >fdipzone blog</a>
<a href="http://blog.csdn.net/fdipzone" >fdipzone blog</a>
<a href="http://blog.csdn.net/fdipzone"  target="_blank" >http://blog.csdn.net/fdipzone</a>
<a href="http://blog.csdn.net/fdipzone" >http://blog.csdn.net/fdipzone</a>
<a href="http://blog.csdn.net/fdipzone" >http://blog.csdn.net/fdipzone</a>


本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用C创建php扩展 的相关文章

  • 显式删除会话cookie会产生什么影响?

    我使用 php session 来维护用户的会话 Session 在登录后创建 在注销或超时后销毁 我需要管理面板中的一个选项来强制注销任何用户 如果他在网站上处于活动状态 我怎样才能做到这一点 我正在考虑删除临时会话文件 这应该有效地破坏
  • 谷歌日历手表过期时间超过1个月怎么办?

    我将我的 CRM 系统与 Google 日历同步 为此 我要求push notifications从我的用户 Google 日历到我的系统 我已经成功创建了手表 并将过期时间设置为2030年 但是当我收到手表事件的响应时 它显示手表的过期时
  • 如何在 Carbon Laravel 中添加日期和另一个日期?

    在我的 laravel 项目中 我想将日期时间增加到前一个日期时间 这是我的代码 expire order 0 gt expire date new Carbon now gt addMonths 6 这两行的结果是 2018 01 28
  • 如何在数据列表 HTML PHP 中设置选择

    您好我想知道是否有一种方法可以在数据列表中设置选定的值 我想要这样的东西
  • 如何使用配置文件 (.ebextensions) 在 AWS Elastic Beanstalk 上安装 PHP IMAP 扩展?

    有谁知道如何使用配置文件 ebextensions 在 AWS Elastic Beanstalk 上安装和启用 PHP IMAP 扩展 我使用的是 64 位 Amazon Linux 2017 03 v2 4 0 运行 PHP 7 0 1
  • PHP 正则表达式匹配字符串的最后一次出现

    我的字符串是 text1 A373R12345 我想找到该字符串最后出现的非数字数字 所以我使用这个正则表达式 0 9 然后我得到这个结果 1 A373 2 12345 但我的预期结果是 1 A373R 它有 R 2 12345 另一个例子
  • MySQL 和 PHP 参数 1 作为资源

    好吧 当我运行下面提到的代码时 PHP 向我抛出此错误 在日志中 Error mysql num rows 期望参数 1 为资源 第 10 行 place 中给出的字符串 9 11号线 queryFP SELECT FROM db coun
  • PHP:将多字节字符串(单词)拆分为单独的字符

    尝试使用 mb split 将这个字符串 主楼怎么走 分割成单独的字符 我需要一个数组 但没有成功 有什么建议吗 谢谢你 例如 尝试使用带有 u 选项的正则表达式 chars preg split u string 1 PREG SPLIT
  • 使用 phpdocx 下载损坏的 .docx

    我有一个项目 我们使用 phpdocx pro 在模板中生成 docx 文件 我可以很容易地将数据输入到模板中 但是当下载文件并在 MS Word 2010 中打开时 程序报告无法打开文件 因为内容存在问题 详细信息是 文件已损坏 并且无法
  • PHP 的脚手架 [关闭]

    Closed 这个问题是无关 help closed questions 目前不接受答案 PHP 中有什么东西可以像 Rails 一样创建基本的脚手架吗 编辑 我需要一些东西来快速原型化 一些框架比如Symfony http www sym
  • PHP DOM - 剥离 span 标签,保留其内容

    我希望采用如下标记 span class test Some text that is strong bolded strong and contains a a href link a span 并在 PHP 中找到剥离跨度的最佳方法 剩
  • Laravel 从 API 响应中删除标头值

    Laravel 应用程序版本 5 6 我希望从 API 响应中显示的 Cache Control 标头中删除 private 值 我有一个中间件添加 无缓存 和 无存储 值 response next request response gt
  • yii2 中的自动完成

    在 Yii2 中 我希望当用户开始输入时 我的输入字段之一能够自动完成 下面是我的代码 它使用Jui Autocomplete 这是行不通的 当我打印我的数组时 我就像 Array 1 gt abc 2 gt xyz 4 gt pqr
  • 带 url 参数的 Laravel post 路由

    我面临着幼虫路由的大墙 我似乎找不到解决方案 我在视图模板中有此表单
  • 如何使用 jQuery Ajax 将 PHP 数组值传递到另一个文件?

    这是我的代码
  • PHP 脚本不断执行 mmap/munmap

    我的 PHP 脚本包含一个循环 它只不过是回显和取消引用指针 如 tab othertab i gt 中的内容 直到昨天 这个脚本开始变得非常慢 比以前慢了 50 倍 之前 它一直运行良好 使用 strace 后 我发现 90 的情况下 脚
  • php oracle客户端oci8安装出现什么问题

    我尝试了安装 PHP Oracle 客户端的所有过程 1 我安装了客户端版本8和32位 2 我在php ini中取消了oci的注释 3 重新启动Wamp 4 不确定是否真的安装 但我在 php ini 中得到了引用 5 但仍然无法连接 泰汉
  • 使用 yum 和 pear 安装 php-soap 均失败

    我正在尝试在 Centos 6 4 服务器上安装 PHP 的 SOAP 扩展 我对包管理器 从 CLI 安装包并在 PHP 中配置它们相当不熟悉 我相当有能力管理 php ini 和其他 PHP 配置文件 soap ini 等 我尝试使用以
  • PHP条件,如果当前页面,则链接突出显示[关闭]

    这个问题不太可能对任何未来的访客有帮助 它只与一个较小的地理区域 一个特定的时间点或一个非常狭窄的情况相关 通常不适用于全世界的互联网受众 为了帮助使这个问题更广泛地适用 访问帮助中心 help reopen questions 我有一个带
  • 通过 Sparkpost 发送 iCal 邀请

    我正在尝试使用 SparkPost 通过电子邮件以附件形式发送日历邀请 但收到电子邮件后邀请不会打开 我使用两个文件 calendarinvite php 来创建邀请 使用 Sendemail php 来发送电子邮件 calendarinv

随机推荐

  • VC中TRACE()的用法,终于学会了点皮毛,好累!

    个人总结 xff1a 最近看网络编程是碰到了TRACE语句 xff0c 不知道在哪里输出 xff0c 查了一晚上资料也没找出来 xff0c 今天终于在CSDN上找到了 xff0c 真是个高地方啊 xff0c 方法如下 xff1a 1 在MF
  • php Cookies 操作类

    Cookies 操作类 功能 xff1a 1 保存 xff0c 读取 xff0c 更新 xff0c 清除cookies数据 2 可设置前缀 3 强制超时控制 4 cookies数据可以是字符串 xff0c 数组 xff0c 对象等 Cook
  • php 密码生成类

    php 密码生成类 功能 xff1a 1 可设定密码长度 2 可设定要生成的密码个数 xff0c 批量生成 3 可以指定密码的规则 xff0c 字母 xff0c 数字 xff0c 特殊字符等 GeneratePassword class p
  • php main 与 iframe 相互通讯类(同域/跨域)

    main 与 iframe 相互通讯类 之前写过一篇 iframe与主框架跨域相互访问方法 介绍了main与iframe相互通讯的原理 不了解原理的可以先看看 今天把main与iframe相互通讯的方法封装成类 主要有两个文件 JS Fra
  • php 异步调用方法

    php 异步调用方法 客户端与服务器端是通过HTTP协议进行连接通讯 xff0c 客户端发起请求 xff0c 服务器端接收到请求后执行处理 xff0c 并返回处理结果 有时服务器需要执行很耗时的操作 xff0c 这个操作的结果并不需要返回给
  • php 根据url自动生成缩略图,并处理高并发问题

    服务器生成缩略图的时机一般分为两种 xff1a 1 上传文件时生成 优点 xff1a 上传时就已经生成需要的缩略图 xff0c 读取时不需要再判断 xff0c 减少cpu运算 缺点 xff1a 当缩略图尺寸变化时或新增尺寸时 xff0c 需
  • MemcacheQ 安装与使用

    MemcacheQ 是一个基于 MemcacheDB 的消息队列服务器 官网地址 xff1a http memcachedb org memcacheq 特点 xff1a 1 简单易用 2 处理速度快 3 可创建多条队列 4 并发性能高 5
  • 深入Mysql字符集设置

    基本概念 字符 Character 是指人类语言中最小的表义符号 例如 A 39 B 39 等 xff1b 给定一系列字符 xff0c 对每个字符赋予一个数值 xff0c 用数值来代表对应的字符 xff0c 这一数值就是字符的编码 Enco
  • Rsync 安装与使用

    Rsync 是一个远程数据同步工具 xff0c 可以通过 LAN WAN 快速同步多台主机间的文件 Rsync 使用 34 Rsync演算法 34 来使本地和远程两个主机之间的文件同步 这个算法只传送两个文件的不同部分 xff0c 而不是每
  • php 字符串压缩方法比较

    php 提供的字符串压缩方法有 1 gzcompress Compress a string This function compress the given string using the ZLIB data format 2 gzen
  • php 生成短网址

    php 生成短网址 原理 xff1a 1 将原网址做crc32校验 xff0c 得到校验码 2 使用sprintf 39 u 39 将校验码转为无符号数字 3 对无符号数字进行求余62操作 xff08 大小写字母 43 数字等于62位 xf
  • debian7安装和配置小经验

    好久没碰linux了 xff0c 这回 捡 了台电脑测试玩 xff0c 发现过去的基本都忘记了 xff0c 拳不离手 曲不离口 xff0c 古人诚吾不欺 linux版本选择我比较熟悉debian xff0c 因为debian装包好方便 xf
  • ApacheBench 测试性能并使用GnuPlot绘制图表

    Apache Bench 是web性能测试工具 xff0c 功能强大 但输出的结果只是数字形式 xff0c 不容易看到数据的变化 因此 xff0c GnuPlot 的强大绘制功能正好可以弥补Apache Bench这方面的不足 关于Apac
  • VM ubuntu ping unknow host 解决方法

    例如网关地址为 xff1a 192 168 1 1 route add default gw 192 168 1 1 sudo vim etc resolv conf 在 etc resolv conf 中加入 Generated by N
  • apache日志分析及系统cpu,内存,负载情况监控

    1 根据Apache Log xff0c 获取当天秒并发数最多的记录 tail 10000 demo fdipzone com access log 2014 01 16 01 cut d 34 34 f 2 awk 39 print 1
  • Apache 搭建HTTPS Virtual Host

    Apache 搭建HTTPS Virtual Host 1 创建SSL证书 首先需要安装openssl xff0c linux系统默认已安装 xff0c 如没有则用以下命令安装 xff1a sudo apt get install open
  • MongoDB 主从同步设置

    MongoDB 主从同步设置 关于MongoDB的安装及启动参数说明可以参考我之前转载的 Ubuntu安装MongoDB 与 Mongodb启动命令mongod参数说明 主从设置 Master xff1a 192 168 111 103 P
  • php Timer 页面运行时间监测类

    php Timer 页面运行时间监测类 xff0c 可按不同key监测不同的运行时间 Timer class php lt php Timer class 计算页面运行时间 可按不同key计算不同的运行时间 Date 2014 02 28
  • C 使用异或(xor)加密/解密文件

    C 使用异或 XOR 加密 解密文件 之前写过一篇 php 使用异或 xff08 XOR xff09 加密 解密文件 xff0c 但php执行的速度很慢 xff0c 因此这次使用C重写 xff0c 速度有很大的提高 xor encrypt
  • 使用C创建php扩展

    使用C创建php扩展 优点 xff1a 1 提高运行效率 2 降低php复杂度 xff0c 可以直接调用扩展方法实现功能 3 方便与第三方库交互 缺点 xff1a 1 开发比php复杂 2 可维护性降低 3 开发周期变长 php开发 xff