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

相关文章

C# 读写ini文件操作实现

《C#读写ini文件操作实现》本文主要介绍了C#读写ini文件操作实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧... 目录一、INI文件结构二、读取INI文件中的数据在C#应用程序中,常将INI文件作为配置文件,用于存储应用程序的

Python使用qrcode库实现生成二维码的操作指南

《Python使用qrcode库实现生成二维码的操作指南》二维码是一种广泛使用的二维条码,因其高效的数据存储能力和易于扫描的特点,广泛应用于支付、身份验证、营销推广等领域,Pythonqrcode库是... 目录一、安装 python qrcode 库二、基本使用方法1. 生成简单二维码2. 生成带 Log

Java操作ElasticSearch的实例详解

《Java操作ElasticSearch的实例详解》Elasticsearch是一个分布式的搜索和分析引擎,广泛用于全文搜索、日志分析等场景,本文将介绍如何在Java应用中使用Elastics... 目录简介环境准备1. 安装 Elasticsearch2. 添加依赖连接 Elasticsearch1. 创

Java中的Opencv简介与开发环境部署方法

《Java中的Opencv简介与开发环境部署方法》OpenCV是一个开源的计算机视觉和图像处理库,提供了丰富的图像处理算法和工具,它支持多种图像处理和计算机视觉算法,可以用于物体识别与跟踪、图像分割与... 目录1.Opencv简介Opencv的应用2.Java使用OpenCV进行图像操作opencv安装j

java Stream操作转换方法

《javaStream操作转换方法》文章总结了Java8中流(Stream)API的多种常用方法,包括创建流、过滤、遍历、分组、排序、去重、查找、匹配、转换、归约、打印日志、最大最小值、统计、连接、... 目录流创建1、list 转 map2、filter()过滤3、foreach遍历4、groupingB

Java操作PDF文件实现签订电子合同详细教程

《Java操作PDF文件实现签订电子合同详细教程》:本文主要介绍如何在PDF中加入电子签章与电子签名的过程,包括编写Word文件、生成PDF、为PDF格式做表单、为表单赋值、生成文档以及上传到OB... 目录前言:先看效果:1.编写word文件1.2然后生成PDF格式进行保存1.3我这里是将文件保存到本地后

Python使用Colorama库美化终端输出的操作示例

《Python使用Colorama库美化终端输出的操作示例》在开发命令行工具或调试程序时,我们可能会希望通过颜色来区分重要信息,比如警告、错误、提示等,而Colorama是一个简单易用的Python库... 目录python Colorama 库详解:终端输出美化的神器1. Colorama 是什么?2.

Python视频剪辑合并操作的实现示例

《Python视频剪辑合并操作的实现示例》很多人在创作视频时都需要进行剪辑,本文主要介绍了Python视频剪辑合并操作的实现示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习... 目录介绍安装FFmpegWindowsMACOS安装MoviePy剪切视频合并视频转换视频结论介绍

Windows自动化Python pyautogui RPA操作实现

《Windows自动化PythonpyautoguiRPA操作实现》本文详细介绍了使用Python的pyautogui库进行Windows自动化操作的实现方法,文中通过示例代码介绍的非常详细,对大... 目录依赖包睡眠:鼠标事件:杀死进程:获取所有窗口的名称:显示窗口:根据图片找元素:输入文字:打开应用:依

Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南

《Python使用Pandas库将Excel数据叠加生成新DataFrame的操作指南》在日常数据处理工作中,我们经常需要将不同Excel文档中的数据整合到一个新的DataFrame中,以便进行进一步... 目录一、准备工作二、读取Excel文件三、数据叠加四、处理重复数据(可选)五、保存新DataFram