php 数据类型io,PHP回顾之IO

PHP回顾系列目录

无论哪种编程语言,IO操作都值得好好学习和理解。由于PHP简单的特性,不少人对此毫无概念也能写出可用的代码。本文总结PHP开发中几个常见的IO场景并介绍对应的操作,希望能帮助PHP开发人员加深对IO的理解。后续文章中将介绍隐藏在简单之下的本质:流。

本文介绍的场景包括:读写文件、命令行输入输出、与远程网址交互。废话少说,直接开始吧!

读写文件

文件的读写是最常规的IO操作。打开文件、读写内容、关闭文件,一气呵成,没什么尿点。一个典型的读取文件内容例子:

function getFileContent(string $filename) : ?string

{

if (!is_file($filename)) {

return null;

}

$fd = fopen($filename, "rb");

$content = fread($fd, filesize($filename);

fclose($fd);

return $content;

}

读写文件So easy! 要想对文件操作玩得更高端点,至少需要熟练使用这些API:

file_exists/is_file/filesize/fileperms等获取文件信息的辅助函数;

fopen:打开文件,获取文件句柄,第二个参数(arwcbx)的含义要弄清楚;

flock:获取文件锁,可用其实现进程互斥锁;

fread/fgets/fscanf等获取文件内容的函数;

fwrite/fputs/fputcsv/ftruncate等写入内容函数;

feof/ftell/fseek/rewind等操作文件指针位置的函数;

fclose: 关闭文件,释放资源。

注意本节中的文件指是 本地文件,对于远程文件,上述函数是否起作用取决于协议是否提供支持。例如fread/fwrite可以操作http://协议的资源,但stat/filesize等函数不能正常工作。可参考官网的“协议和包装器” 查看非本地普通文件时可用的函数信息。

命令行输入和输出

PHP主要用于web开发,命令行应用也比较常见,比如定时任务的脚本。命令行模式下,有不少与web开发不同的地方,比如可以使用多进程/线程(web中的curl_multiple不算),没有运行时间限制等。

命令行时php_sapi_name返回值为cli,标准输入输出均指向终端(可用ll /proc/进程号/fd查看)。PHP定义了三个句柄常量:

STDIN: 标准输入,只读,等同于用fopen打开"php://stdin";

STDOUT: 标准输出,只写,等同于用fopen打开"php://stdout";

STDERR: 标准错误输出,只写,等同于fopen打开"php://stderr"。

注意标准输入对应"php://stdin"而非"php://input",虽然这两者行为在命令行模式下几乎一致(区别可参考本人之前的文章php://output和php://stdout的区别)。

操作三个读写通道,对应的函数是fread/fgetc/fscanf/fwrite/fputc/fputs等。PHP会在脚本执行完毕后关闭三个流,无需用户手动关闭。下面用代码简要展示用法:

function prompt(string $message) : string

{

fwrite(STDOUT, $message);

// fgets会把换行符也读入,可用rtrim过滤掉

return rtrim(fgets(STDIN));

}

function println(string $message) : void

{

fputs(STDOUT, $message . PHP_EOL);

}

function error(string $message) : void

{

fputs(STDERR, $message . PHP_EOL);

}

$value = prompt("input your value:");

if ($value !== "") {

println("your input: $value");

} else {

error("invalid value!");

}

命令行模式时"php://output"链接到标准输出,所以echo/print/var_dump等输出函数可正常使用。要交互式的从命令行获取输入,则需要用到fread/fgets等文件读取函数。

常量PHP_EOL是预定义的跨平台换行符,EOL是end of line的缩写,不是end of life~

与远程网址交互

从网页获取内容,cURL拓展绝对值得大提特提。如果你熟悉curl命令,对其功能的强大应该有所了解,那么应该对使用PHP中的CURL系列函数会得心应手。

与远程网址交互是一个请求和响应的过程,其中细节可参考本人之前的文章:PHP回顾之web请求和PHP回顾之web响应,也可参考HTTP协议的权威文档。使用CURL与远程web服务器的交互流程如下:

初始化CURL句柄

设置请求信息:请求URL、头部信息、cookie、正文等;

发送请求

获取执行结果

关闭CURL句柄,释放资源

CURL简单好用,缺点是请求的设置参数繁杂难记。

实践中推荐以类Java的HttpClient库形式与远程服务器交互。HttpClient类库将请求、响应、传输等概念抽出来,完全面向对象,更语义化,使用其能更好促进对HTTP协议的理解,缺点是代码相对繁琐。PHP有不少类似的HTTP请求库,以下使用Yii2中的yii2-httpclient类库展示使用示例:

use yii\httpclient\Client;

use yii\httpclient\Response;

$url = "https://tlanyan.me";

$data = [

"key1" => "value1",

"key2" => "value2",

];

$response = (new Client())->createRequest()

->setMethod("POST")

->setFormat(Client::FORMAT_JSON)

->setUrl($url)

->setData($data)

->send();

if ($response->isOk) {

$response->setFormat(Client::FORMAT_JSON);

// 获取解析后的数据

$data = $response->data;

....

}

使用fopen/fsocketopen等函数也能实现与远程服务器的交互,这部分内容放在后续的流中阐述。

file_get_contents

上文废话了半天,还没说到PHP中获取内容的神器:file_get_contents函数。该函数是PHP读取内容当之无愧的神器,不管是常规文件、php://、http://、还是标准输入等,file_get_contents一句话搞定。相较于Java等语言中的client/connection/stream等一堆代码,file_get_contents体现了PHP简单实用的设计哲学。

想必PHP开发常用该函数,就用几个简单的示例结束本文(注意代码中POST请求网页已经涉及到了流的内容)。

// 读取普通文件

file_get_contents("/etc/passwd");

// 获取web请求的原始正文,可获取json/xml等数据格式的原始内容,也可获得上传文件的内容,注意该返回可能唯二进制

// 以json/xml数据格式交互时,推荐使用此方法而非通过$GLOBALS['HTTP_RAW_POST_DATA']获取,$HTTP_RAW_POST_DATA在PHP 7.2中已被移除

file_get_contents("php://input");

// 获取网址内容,可取代curl

file_get_contents('https://tlanyan.me');

// 传入context对象,可实现post请求

$contextOptions = [

"http" => [

"method" => "POST",

"ignore_errors" => true,

"content" => "username=tlanyan",

"header" => "Content-type: application/x-www-form-urlencoded",

"user_agent" => "MySpider/1.0",

],

"ssl" => [

"verify_peer" => false,

],

];

$context = stream_context_create($contextOptions);

file_get_contents("https://tlanyan.me", false, $context);

// cli模式下从标准输入读取数据,此时换行符也被当做输入的一部分,要以ctrl+d作为结束输入的标志

file_get_contents(STDIN);

// 写入文件内容

file_put_contents("foo.txt", "Test function call\n", FILE_APPEND);

参考

感谢阅读,感谢指正!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: _io.textiowrapper是Python中的一个数据类型,它是一个文本I/O流的包装器。它可以将字节流转换为文本流,并提供了一些文本I/O操作的方法,如读取、入、追加等。它通常用于处理文本文件、网络套接字等。 ### 回答2: _io.textiowrapper是Python中的一个数据类型,它是对字节流和Unicode编码之间进行转换的一个抽象概念。它实际上是通过Python内置的open()函数打开文件返回的结果,是一种文本IO类型,与二进制IO类型相对应。 在Python中,文本IO是基于Unicode的字符流,可以使用文本模式打开,然后对其进行读操作。文本IO通常用于处理包含文本数据的文件,如.txt文件、.csv文件、.html文件等。而二进制IO则是基于字节流的,通常用于处理二进制数据,如图片文件、音频文件、视频文件等。 _io.textiowrapper的特点是可以封装底层的二进制IO对象,从而实现将二进制数据流转换为Unicode字符串,或将Unicode字符串转换为二进制数据流。这种转换是通过编码和解码操作完成的。在读取文本数据时,Python会默认使用系统的默认编码方式。在入文本数据时,如果未指定编码方式,则Python会默认使用UTF-8编码。 除了打开文件进行读操作,_io.textiowrapper还可以用于标准输入输出流的处理,也可以用于网络连接中读数据。此外,它还提供了一些快捷方法来访问和修改文件中的内容,例如read()、write()、seek()、tell()等等。 综上所述,_io.textiowrapper是Python中用于处理文本IO的一种数据类型,它具有非常方便的操作方式和灵活性,常用于读取和入文本文件,以及处理标准输入输出流和网络连接中的数据。 ### 回答3: _io.textiowrapper是Python中用于文本I/O缓冲的一种数据类型。它是以文本模式打开文件所创建的对象。在文本模式下,文件以Unicode编码进行读。 _io.textiowrapper主要是通过缓冲和编码处理来提升文本I/O性能,并且也提供了一些有用的方法。 其中,缓冲机制可以将多个入操作集中起来,一次性进行入,从而减少I/O次数和提高性能。同时,缓冲机制还可保证多个线程对同一个文件进行入时,不会发生矛盾或冲突。 编码处理则是将不同的字符集和编码(如ASCII、Unicode等)转换为Python中的内部编码,以方便程序进行处理。 除了常规的读操作外,_io.textiowrapper还提供了一些额外的操作,例如: 1. seek(offset, whence=None):此方法用于移动文件句柄到指定位置。 2. tell():此方法返回当前文件句柄所在的位置。 3. readline(size=-1):此方法从文件中读取一行数据。 4. writelines(lines):此方法向文件入多行数据。 总之,_io.textiowrapper是Python中非常重要的I/O数据类型之一,它可以以文本模式打开文件并进行读操作,同时还提供了缓冲和编码处理等实用功能。开发者在进行文本I/O操作时可使用此类型,以提高程序性能和效率。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值