PHP7扩展开发之流操作

2024-09-08 14:08
文章标签 操作 开发 扩展 php7 之流

本文主要是介绍PHP7扩展开发之流操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

前言

啥是流操作?简单来讲就是对一些文件,网络的IO操作。PHP已经把这些IO操作,封装成流操作。这节,我们将使用PHP扩展实现一个目录遍历的功能。PHP示例代码如下:

<?php
function list_dir($dir) {if (is_dir($dir) === false) {return;}   $dh = opendir($dir);if ($dh == false) {return;}   while (($file = readdir($dh)) !== false) {if(is_dir($dir."/".$file) && $file != "." && $file != "..") {list_dir($dir."/".$file);} else if ($file != "." && $file != "..") {echo $dir."/".$file."\n";}   }   closedir($dh);
}list_dir("/Users/canglong/dev/test/gc");
?>

执行后输出内容是:

/Users/canglong/dev/test/gc/blog/www.bo56.com
/Users/canglong/dev/test/gc/www.bo56.com

我们将在扩展中list_dir方法。

代码

基础代码

这个扩展,我们将在say扩展上增加list_dir方法代码。say扩展相关代码大家请看这篇博文。PHP7扩展开发之hello word 文中已经详细介绍了如何创建一个扩展和提供了源码下载。

代码实现

第一步,先引入头文件:

#include "ext/standard/php_filestat.h"

第二步,实现list_dir函数
list_dir函数的代码如下:

void list_dir(const char *dir);PHP_FUNCTION(list_dir)
{char *dir;size_t dir_len;#ifndef FAST_ZPP/* Get function parameters and do error-checking. */if (zend_parse_parameters(ZEND_NUM_ARGS(), "s", &dir, &dir_len) == FAILURE) {return;}
#elseZEND_PARSE_PARAMETERS_START(1, 1)Z_PARAM_PATH(dir, dir_len)ZEND_PARSE_PARAMETERS_END();
#endifphp_stat(dir, (php_stat_len) dir_len, FS_IS_DIR, return_value);if (Z_TYPE_P(return_value) == IS_FALSE) {RETURN_NULL();}list_dir(dir);RETURN_NULL();
}void list_dir(const char *dir)
{php_stream *stream;int options = REPORT_ERRORS;php_stream_dirent entry;int path_len;char path[MAXPATHLEN];zend_stat_t st;stream = php_stream_opendir(dir, options, NULL);if (!stream) {return;}while(php_stream_readdir(stream, &entry)) {if ((path_len = snprintf(path, sizeof(path), "%s/%s", dir, entry.d_name)) 小于 0) {break;}if (zend_stat(path, &st) != -1 && S_ISDIR(st.st_mode) && strcmp(entry.d_name, ".") != 0&& strcmp(entry.d_name, "..") != 0) {list_dir(path);} else if (strcmp(entry.d_name, ".") != 0 && strcmp(entry.d_name, "..") != 0) {PUTS(path);PUTS("\n");}}php_stream_closedir(stream);
}

代码解读

首先说下路径状态的判断。
php_stat函数是PHP中is_dir函数在实现的时候,使用的一个函数。具体代码参见ext/standard/filestat.c文件的FileFunction宏方法。在1092行附近。这个函数是判断一个路径的状态。如,是否是文件夹等。一般在扩展实现的时候,不建议使用。这里只是为了演示,才使用的。

zend_stat宏方法。也是实现判断一个路径的状态。推荐在扩展中使用。如果调用有问题,会返回-1。

PHP把一些IO操作都封装成了流操作。这些流操作都声明在main/php_streams.h文件中。下面我们说下,我们用到的流操作函数。

php_stream_opendir函数是用于打开一个目录。
* 第一个参数:路径
* 第二个参数:选项。控制一些函数调用行为。定义在main/php_streams.h中。多个选项可以使用异或操作。如 int options = IGNORE_PATH | REPORT_ERRORS;

php_stream_readdir读取目录流。
* 第一个参数:上面函数打开的stream流
* 第二个参数:php_stream_dirent 用于存储当前读取的信息。

php_stream_closedir关闭目录流。参数是之前打开的流。

源码下载

tar.gz格式下载
zip格式下载

原文链接:PHP7扩展开发之流操作

这篇关于PHP7扩展开发之流操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1148322

相关文章

Python中pywin32 常用窗口操作的实现

《Python中pywin32常用窗口操作的实现》本文主要介绍了Python中pywin32常用窗口操作的实现,pywin32主要的作用是供Python开发者快速调用WindowsAPI的一个... 目录获取窗口句柄获取最前端窗口句柄获取指定坐标处的窗口根据窗口的完整标题匹配获取句柄根据窗口的类别匹配获取句

Python位移操作和位运算的实现示例

《Python位移操作和位运算的实现示例》本文主要介绍了Python位移操作和位运算的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一... 目录1. 位移操作1.1 左移操作 (<<)1.2 右移操作 (>>)注意事项:2. 位运算2.1

Go语言开发实现查询IP信息的MCP服务器

《Go语言开发实现查询IP信息的MCP服务器》随着MCP的快速普及和广泛应用,MCP服务器也层出不穷,本文将详细介绍如何在Go语言中使用go-mcp库来开发一个查询IP信息的MCP... 目录前言mcp-ip-geo 服务器目录结构说明查询 IP 信息功能实现工具实现工具管理查询单个 IP 信息工具的实现服

Python ZIP文件操作技巧详解

《PythonZIP文件操作技巧详解》在数据处理和系统开发中,ZIP文件操作是开发者必须掌握的核心技能,Python标准库提供的zipfile模块以简洁的API和跨平台特性,成为处理ZIP文件的首选... 目录一、ZIP文件操作基础三板斧1.1 创建压缩包1.2 解压操作1.3 文件遍历与信息获取二、进阶技

Java中字符串转时间与时间转字符串的操作详解

《Java中字符串转时间与时间转字符串的操作详解》Java的java.time包提供了强大的日期和时间处理功能,通过DateTimeFormatter可以轻松地在日期时间对象和字符串之间进行转换,下面... 目录一、字符串转时间(一)使用预定义格式(二)自定义格式二、时间转字符串(一)使用预定义格式(二)自

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

使用Python开发一个带EPUB转换功能的Markdown编辑器

《使用Python开发一个带EPUB转换功能的Markdown编辑器》Markdown因其简单易用和强大的格式支持,成为了写作者、开发者及内容创作者的首选格式,本文将通过Python开发一个Markd... 目录应用概览代码结构与核心组件1. 初始化与布局 (__init__)2. 工具栏 (setup_t

Python 中的 with open文件操作的最佳实践

《Python中的withopen文件操作的最佳实践》在Python中,withopen()提供了一个简洁而安全的方式来处理文件操作,它不仅能确保文件在操作完成后自动关闭,还能处理文件操作中的异... 目录什么是 with open()?为什么使用 with open()?使用 with open() 进行

Spring Shell 命令行实现交互式Shell应用开发

《SpringShell命令行实现交互式Shell应用开发》本文主要介绍了SpringShell命令行实现交互式Shell应用开发,能够帮助开发者快速构建功能丰富的命令行应用程序,具有一定的参考价... 目录引言一、Spring Shell概述二、创建命令类三、命令参数处理四、命令分组与帮助系统五、自定义S

Linux ls命令操作详解

《Linuxls命令操作详解》通过ls命令,我们可以查看指定目录下的文件和子目录,并结合不同的选项获取详细的文件信息,如权限、大小、修改时间等,:本文主要介绍Linuxls命令详解,需要的朋友可... 目录1. 命令简介2. 命令的基本语法和用法2.1 语法格式2.2 使用示例2.2.1 列出当前目录下的文