Php 读取网络驱动器上的文件

Php 读取网络驱动器上的文件,php,networking,Php,Networking,我在Windows服务器上运行Xampp;Apache是作为带有本地帐户的服务运行的。 在此服务器上,网络共享以X:形式装载,并具有特定凭据 我想访问位于X:上的文件并运行以下代码 <?php echo shell_exec("whoami"); fopen('X:\\text.txt',"r"); ?> 我试图运行Apache,不是作为服务,而是直接启动httpd.exe。。。 代码起作用了 我看不出是什么导致服务和应用程序之间的差异以及如何使其工作。使用驱动器号无法做到这一点,

我在Windows服务器上运行Xampp;Apache是作为带有本地帐户的服务运行的。 在此服务器上,网络共享以X:形式装载,并具有特定凭据

我想访问位于X:上的文件并运行以下代码

<?php
echo shell_exec("whoami");
fopen('X:\\text.txt',"r");
?>
我试图运行Apache,不是作为服务,而是直接启动httpd.exe。。。 代码起作用了


我看不出是什么导致服务和应用程序之间的差异以及如何使其工作。

使用驱动器号无法做到这一点,因为网络映射驱动器仅适用于单个用户,因此服务无法使用(即使您为该用户安装)

您可以改为直接使用UNC路径,例如:

fopen('\\\\server\\share\\text.txt', 'r');

但是,请注意,PHP对UNC路径的文件系统访问存在一些问题。一个例子是a,但是
文件\u存在
可写
也存在问题。我没有报告后者,因为您可以从我长期存在的关于
imagettftext
的突出错误中看出,这有什么意义。

您无法使用驱动器号来完成此操作,因为网络映射驱动器仅用于单个用户,因此服务无法使用(即使您为该用户安装)

您可以改为直接使用UNC路径,例如:

fopen('\\\\server\\share\\text.txt', 'r');

但是,请注意,PHP对UNC路径的文件系统访问存在一些问题。一个例子是a,但是
文件\u存在
可写
也存在问题。我没有报告后者,因为您可以从我在
imagettftext
中长期存在的bug中看出,这有什么意义。

对于网络共享,您应该使用UNC名称:“//server/share/dir/file.ext”

如果使用IP或主机名,它应该可以正常工作:

$isFolder = is_dir("\\\\NAS\\Main Disk");
var_dump($isFolder); //TRUE

$isFolder = is_dir("//NAS/Main Disk");
var_dump($isFolder); //TRUE

$isFolder = is_dir("N:/Main Disk");
var_dump($isFolder); //FALSE

对于网络共享,应使用UNC名称:“//server/share/dir/file.ext”

如果使用IP或主机名,它应该可以正常工作:

$isFolder = is_dir("\\\\NAS\\Main Disk");
var_dump($isFolder); //TRUE

$isFolder = is_dir("//NAS/Main Disk");
var_dump($isFolder); //TRUE

$isFolder = is_dir("N:/Main Disk");
var_dump($isFolder); //FALSE

windows网络驱动程序按用户分配。除非您已将该X:drive映射到xampp正在运行的帐户下,否则该驱动器将不可用。您好,谢谢您的回答。我以运行Xampp但使用其他帐户挂载x:的用户身份登录Windows。Windows网络驱动程序是每个用户的。除非您已将该X:drive映射到xampp正在运行的帐户下,否则该驱动器将不可用。您好,谢谢您的回答。我以运行Xampp的用户身份登录Windows,但使用另一个帐户挂载x:。您好,谢谢您的回答。当我使用这种语法时,我得到“无法打开流:无效参数”。当我使用scandir()时,我得到“登录失败:未知用户名或错误密码。(代码:1326)”。我猜,正如您所说,服务无法使用现有凭据。@user1985014它可以访问它,但您必须配置服务以使用正确的帐户。我已经多年没有在Windows上使用Apache了,但是IIS在每个应用程序池中都可以很容易地完成这项工作。因此,如果我不能以有权访问共享的用户身份运行Apache,我会被卡住?@user1985014 Correct。但是没有理由不能更改Apache服务的用户,或者添加新用户来访问共享。您好,谢谢您的回答。当我使用这种语法时,我得到“无法打开流:无效参数”。当我使用scandir()时,我得到“登录失败:未知用户名或错误密码。(代码:1326)”。我猜,正如您所说,服务无法使用现有凭据。@user1985014它可以访问它,但您必须配置服务以使用正确的帐户。我已经多年没有在Windows上使用Apache了,但是IIS在每个应用程序池中都可以很容易地完成这项工作。因此,如果我不能以有权访问共享的用户身份运行Apache,我会被卡住?@user1985014 Correct。但是你没有理由不能更改Apache服务的用户,或者添加一个新用户来访问共享。对我来说,上面的3个例子都不管用,在PHP7.2中,在Win10(NTFS)@userfuser上。没关系,8年后情况可能会变,当你找到解决方案时,你应该在Win10上发布一个答案来帮助其他人使用PHP7.2,这就是为什么我一开始就发布了它——这样一些人(对他们来说它很有用)就会很快意识到,PHP或Win中确实发生了一些变化,而这对他们来说是行不通的。对我来说,在PHP7.2中,在Win10(NTFS)@userfuser上,上面的3个例子都不起作用。没关系,8年后情况可能会改变,当您找到一个解决方案时,您应该在Win10上发布一个答案来帮助其他人使用PHP7.2。当然,这就是为什么我首先发布它的原因——这样一些人(对他们来说它很有用)就会很快意识到,PHP中的某些东西实际上发生了变化,或者成功了,而这对他们不起作用。