为什么WordPress要求在网络服务器上运行ftp服务器来传输插件?

时间:2011-07-22 作者:Sathyajith Bhat

我问了一个related question 在超级用户上:

系统通过FTP“接收”文件的一个用例是,例如,WordPress插件是通过点击一次的方式安装的,WordPress使用FTP从远程WordPress插件库向本地Linux设备发送文件

更具体地说,此屏幕:

WP asking for ftp info during plugin install

我最初的理解是WordPress将从WordPress插件库传输文件,就像FTP客户端一样。但是further discussions on chat 让我感到困惑的是,为什么WordPress需要web服务器的FTP详细信息?

我错过了什么?

3 个回复
最合适的回答,由SO网友:Milo 整理而成

当您执行需要WordPress写入文件系统的操作时,它会通过写入临时文件来检查是否有权限这样做。如果此检查失败,它将询问FTP详细信息,以便将文件写入服务器。

EDIT

查看wp-admin/includes/file.php, 第843行,用于get_filesystem_method 执行此检查的函数。

SO网友:a9k

这个wp-admin/includes/file.php **get\\u filesystem\\u method()**使用错误的测试来确定是否可以写入文件。第853行:

if ( getmyuid() == @fileowner($temp_file_name) )
使用getmyuid() 对于unix是错误的-相反,应该是posix_getuid(). 问题是getmyuid()将返回脚本文件的所有者,而不是运行脚本的用户。在unix上,这意味着如果文件是由root用户安装的,而Web服务器是以用户www数据的形式运行的,那么即使文件是在测试期间编写的,测试也会失败。

因此,要修复此问题,请将getmyuid()行更改为:

if ( posix_getuid() == @fileowner($temp_file_name) )

SO网友:Sam Wilson

米洛的answer 是正确的。我只是想添加一些关于如何进行检查的详细信息(因为get_filesystem_method() 自2011年以来有所变化)。

首先,您可以通过定义FS_METHOD 在您的wp-config.php 未来\'direct\', \'ssh2\', \'ftpext\'\'ftpsockets\'.

如果未设置此常量,则WP会尝试确定要使用的方法。它通过尝试创建一个名为wp-content/temp-write-test-1434788954 (末尾的数字只是当前时间戳)。如果无法创建此文件,它将使用ssh2, ftpextftpsockets 方法(即需要身份验证凭据的恼人方法)。

如果可以创建文件,WP将继续比较该文件的所有者与wp-admin/includes/file.php. 如果这些都是一样的,那么一切都是好的direct 方法。

<小时>TL;DR: 必须允许web服务器用户写入wp-content/ 成为wp-admin/includes/file.php.

结束