使用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扩展 的相关文章

  • 从数据库填充复选框

    我有两个表 第一个由与名称关联的 id 组成 1 汽车 2 火车 3 普通 ETC 第二个表由两个字段 user id 和第一个表中的 id 组成 例如 1 1 2 1 3 当用户转到该页面时 我试图重新填充选定的复选框 首先 您查询数据库
  • 从支付网关重定向回时用户会话丢失

    我已将 Cyber source 配置为我的支付网关 我能够导航到 cybersource 并进行付款 并能够成功重定向回该网站 我也可以取消付款并重定向回我的网站 我收到来自支付网关的响应 但是 用户在从支付网关重定向回来时会被注销 我正
  • 保存多对多关系,同步/附加不存在?

    我有以下两个多对多关系的模型 use Illuminate Database Eloquent Model class Permission extends Model The database table used by the mode
  • 如何在laravel中注册后自动登录

    我在 laravel 中注册用户时遇到问题 user假设是包含所有数组元素的数组 同时自动登录以下代码结果false 数据库中保存的密码是hash make password user id this gt user model gt ad
  • 一种无需 JavaScript 即可在 PHP 中确定浏览器宽度的方法?

    首先有吗 或者我必须使用javascript 我希望能够更改使用的 CSS 因此 frex 我可以为移动设备或其他设备加载较小的字体 不幸的是 仅使用 PHP 无法检测用户分辨率 如果您使用 Javascript 则可以在 cookie 中
  • 使用 PHP/linux 将文件合并为单个 PDF

    我正在研究如何将多个 PDF 合并为一个 PDF 我正在寻找一个图书馆可靠且坚固尽可能 最好有一个库可以保留书签 鬼脚本 http pages cs wisc edu ghost 可以在保存书签的位置进行连接 但我遇到了麻烦 在一种情况下它
  • 如何在 PHP 的 HTML 页面中显示错误消息?

    我有以下登录表单 login php 其中要求输入用户名和密码
  • 如何在 JavaScript 中创建服务器端进度指示器?

    我想在我的网站中创建一个部分 用户可以在其中进行一些简单的操作update纽扣 这些中的每一个update按钮将发送到服务器 并在幕后进行长时间的处理 当服务器处理数据时 我希望用户有某种进度指示器 例如进度条或文本百分比 我使用 jQue
  • 将 cookie 设置为在当天结束时过期

    我想设置一个 cookie 并让它在一天结束时过期 这有效 但 24 小时后过期 setcookie route upgrade voted true time 86400 这不起作用 setcookie route upgrade vot
  • 使用 PHP glob 列出 FTP 服务器上的文件不起作用

    我使用此代码来访问目录 location files pictures glob location png 我想使用 FTP 访问远程路径 location opendir ftp user password host name files
  • 使用值填充的 Symfony2 自定义字段类型

    这是先前问题的后续问题Symfony2 自定义表单类型或扩展 https stackoverflow com questions 24079288 symfony2 custom form type or extension 我正在尝试为订
  • 使用 XPATH(和 PHP)从样式属性中选择背景 url

    我只想从此背景图像样式属性中选择 url 这可以通过 XPATH 实现吗 a href http www test com style background image none test a 我有类似的东西 url xpath gt qu
  • Facebook PHP-SDK 页面刷新后似乎丢失了 userID

    我似乎登录工作正常 我可以登录 接受应用程序 第一次 然后显示用户信息 例如姓名 图片 等 然而 当我刷新页面时 userid 又回到 0 我必须再次登录 我不确定问题是什么 我必须在每次页面加载时重新启动它还是什么 我不知道 我会发布一些
  • Facebook API sdk 4.0 - 将照片发布到 Facebook

    我正在尝试创建一个应用程序 用户可以在其中浏览照片并将其从计算机提交到 Facebook 为此 他们首先必须将照片上传到服务器 然后使用 Facebook 请求将此图像发布到 Facebook 我正在使用多部分 表单数据 这就是我到目前为止
  • 通过互联网IP地址从一台计算机访问xampp到另一台计算机

    我试图从另一台计算机访问我的 xampp 它显示为禁止错误 然后我在 google 上搜索答案 因为他们告诉在 apache 文件夹中的 httpd conf 文件中更改一些设置 如下所示 Order Deny Allow Deny fro
  • 如何在 Windows 上安装 Zend 框架

    安装 Zend Framework 就是这么简单 是的 对 好吧 我正在写一本初学者的书 有一件不太详细的事情是最重要的部分 安装该死的东西 浏览了几个小时的快速入门指南后 它只说 下载 Zend 添加包含目录 bla bla 然后就完成了
  • 带倒计时的php循环

    假设我从 400 开始计数器 我将如何执行一个向后运行直到 0 的 foreach 循环 伪代码 i 400 foreach SOMETHING do stuff i for i 400 i gt 0 i do stuff 其他方法 i 4
  • 一次从多个表中删除行

    我正在尝试将 2 个查询合并为一个这样的查询 result db gt query DELETE FROM menu WHERE name new or die db gt error result db gt query DELETE F
  • 使用会话 php 创建 cookie?

    我使用会话来登录我网站中的用户 问题是 我想让用户remember密码 因此关闭 打开浏览器后他们不需要再次登录 我需要使用 cookie 和 session 来实现它吗 my code user POST user pass POST p
  • 如何从日期中查找该月的最后一天?

    如何在 PHP 中获取该月的最后一天 Given a date 2009 11 23 我要2009 11 30 并给出 a date 2009 12 23 我要2009年12月31日 t返回给定日期所在月份的天数 请参阅的文档date ht

随机推荐

  • 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