除了代码上传之外,在某些业务场景中,比如在云做事还不是非常盛行的年代,每每我们会把图片、大文件这些素材存放到一台单独的有着大容量硬盘的做事器上。
这时,在后台上传这些文件的时候,我们就须要利用 FTP 的功能将业务做事器上传的文件再通过 FTP 做事传输到文件做事器中,这便是在业务环境下 FTP 最范例的运用。

在 PHP 中,FTP 扩展是包含在源码中的,也便是说,我们在编译的时候直接加上 --with-ftp 就可以了,非常地方便。
如果编译的时候没有安装的话,后期在源码包中直接找到 FTP 目录扩展安装就可以了。

连接 FTP 做事器

首先我们来看一下如果连接 FTP 做事,在这里我们利用虚拟机搭建了一台 FTP 做事器,然后从本地连接。

PHPchdir一路进修PHP中的FTP操作 Vue.js

$conn = ftp_connect("192.168.56.102");ftp_login($conn, 'testftp', '123456');$pwdInfo = ftp_pwd($conn);$dirInfo = ftp_nlist($conn, $pwdInfo);print_r($pwdInfo); // /home/testftpprint_r($dirInfo);// Array// (// )ftp_close($conn);

通过 ftp_connect() 就可以拿到一个 FTP 连接句柄,然后利用 ftp_login() 进行登录。
登录之后就算是正式地连接成功了。
这时我们就可以通过 ftp_pwd() 看到我们登录帐号的目录情形,也可以通过 ftp_nlist() 看到目录中的内容。
当前我们还没有上传任何东西,目录里面还是空的。
ftp_close() 用于关闭一个 FTP 连接句柄。

操作目录

在上传文件之前,我们先看下如何操作目录,也便是目录的创建、删除之类的操作。

$conn = ftp_connect("192.168.56.102");ftp_login($conn, 'testftp', '123456');ftp_mkdir($conn, 'www');ftp_mkdir($conn, 'www1');ftp_mkdir($conn, 'www2');ftp_rename($conn, 'www1', 'www11');ftp_rmdir($conn, 'www2');print_r(ftp_nlist($conn, $pwdInfo));// Array// (// [0] => /home/testftp/www// [1] => /home/testftp/www11// )

通过 ftp_mkdir() 可以创建目录,ftp_rename() 用于改名,这个函数不但是针对目录,也可以对文件进行改名操作。
ftp_rmdir() 便是删除目录的操作。

在这段测试代码中,我们创建了 3 个目录,然后对个中一个目录改名,并删一个目录。
末了通过 ftp_nlist() 查看当前用户目录下的内容。

上传文件

目录操作之后便是文件干系的操作,这里我们分开来说,先看一下上传文件的操作。

ftp_put($conn, '1.php', './1.学习一个PHP中用于检测危险函数的扩展Taint.php');ftp_chdir($conn, 'www');ftp_put($conn, '2.php', './2.一起学习PHP中的DS数据构造扩展(一).php');ftp_cdup($conn);ftp_put($conn, 'www11/3.php', './3.一起学习PHP中的DS数据构造扩展(二).php');ftp_rename($conn, 'www/2.php', 'www/22.php');print_r(ftp_rawlist($conn, '.'));// Array// (// [0] => -rw-r--r-- 1 1003 1003 1785 Feb 24 01:09 1.php// [1] => drwxr-xr-x 2 1003 1003 20 Feb 24 01:09 www// [2] => drwxr-xr-x 2 1003 1003 6 Feb 24 00:51 www1// [3] => drwxr-xr-x 2 1003 1003 19 Feb 24 00:50 www11// )print_r(ftp_rawlist($conn, 'www'));// Array// (// [0] => -rw-r--r-- 1 1003 1003 10538 Feb 24 01:09 22.php// )print_r(ftp_rawlist($conn, 'www11'));// Array// (// [0] => -rw-r--r-- 1 1003 1003 1534 Feb 24 01:09 3.php// )

ftp_put() 用于文件的上传,我们须要定义上传之后的文件名,如果只是一个文件名的话,那么这个文件就会上传到当前目录下,也便是我们登录之后的 /home/testftp 这个用户目录。
我们可以利用 ftp_chdir() 进入某个指定的目录之后上传,利用 ftp_cdup() 返回上级目录。
同时,我们也可以直接在文件名加入路径信息,这样就不用进入某个详细的目录,而是直接将文件上传到指定的目录中。

ftp_rawlist() 是另一种显示目录内部文件和目录信息的函数,它展示的内容和操作系统中的 ls -l 命令比较像,也便是显示的内容更加详细丰富一些。
同样地,在这里我们也演示了通过 ftp_rename() 函数来修正文件的名称。

文件干系信息及下载文件

文件上传了之后,我们也可以通过一些函数来查看文件的信息。

echo ftp_mdtm($conn, 'www11/3.php'), PHP_EOL; // 1614128689echo ftp_size($conn, 'www/22.php'), PHP_EOL; // 10538echo ftp_systype($conn), PHP_EOL; // UNIX

这里便是大略的通过这三个函数看一下文件的上传韶光、大小信息。
ftp_systype() 函数查看的是 FTP 做事器的操作系统信息。

ftp_get($conn, '222.php', 'www/22.php');// ./222.phpftp_delete($conn, 'www11/3.php');print_r(ftp_rawlist($conn, 'www11'));// Array// (// )

下载文件直策应用 ftp_get() 方法就可以了,同样我们也可以定义下载之后的文件名。
其实在大部分情形下,不管是上传还是下载,我们都不用去修正文件名,保持原有的文件名会更加方便我们之后的操作。

ftp_delete() 用于删除 FTP 做事器上的某个文件,这个也不须要过多地阐明了。

总结

通过上面这些函数,实在一些基本的 FTP 操作也就完成了,当然,在文档中还有更多的函数这里没有阐明解释,不过也并不是特殊主要的函数。
有兴趣的同学可以自己辞官方查看干系的函数解释。
FTP 做事虽然现在可能利用的会少一些,但在很多场景下它还是非常方便的,以是大家多少要理解节制一些。

测试代码:

https://github.com/zhangyue0503/dev-blog/blob/master/php/2021/02/source/6.一起学习PHP中的FTP操作.php

参考文档:

https://www.php.net/manual/zh/book.ftp.php