我们通过在每个windows机器的共享本地目录中编辑我们的工作文件来开发基于php的web应用程序。然后(linux)暂存服务器挂载我们的共享驱动器,并在子域下为它们提供服务。例如,joe.work.com将提供Joe的工作目录。然后我们通过编辑hosts文件来访问我们自己的暂存站点,将子域指向暂存服务器…所有这些都很有效!
我们现在遇到了一个问题,PHP似乎没有权限将上传的文件从tmp目录移动到挂载目录(实际上是共享的windows驱动器…?)。
windows机器上的工作目录被设置为允许每个人读写,我试着把777放在staging机器的挂载目录上,但我仍然得到拒绝的权限。
共享驱动器,例如,''joes_machine'joes_working_dir
挂载到暂存服务器上的/var/mnt/joe
。上传的文件需要移动到/images/common
虽然在这个例子中稍微简化了一些,但我没有做任何花哨的代码:
$working_directory = '/var/mnt/joe';
$image_directory = '/images/common/';
$full_filename = $working_directory . $image_directory . $filename;
if(move_uploaded_file($_FILES['photo']['tmp_name'], $full_filename))
// do some other stuff
我的错误当然是:
Message: move_uploaded_file(/var/mnt/joe/images/common/resulting_filename.jpg):
failed to open stream: Permission denied
Message: move_uploaded_file(): Unable to move '/tmp/phpjsEfBc' to
'/var/mnt/joe/images/common/resulting_filename.jpg'
我对linux和PHP通过网络挂载的windows共享驱动器的文件权限有什么不理解?我似乎找不到挂电话的地方!
一旦我们进入生产环境,我们将不再使用模式,但是如果有一个简单的解决方案能够在我们当前的开发环境中继续使用,那将是理想的!
翻看了几个小时后,我终于找到了我错过的东西。问题是所提供的凭据不能按预期写入挂载的目录。我能够解决这个问题的方法是编辑mount命令,如下所示:
mount -t cifs //shared/directory /mount/target
-o rw,username=connectionuser,password=password,uid=48
因此,username
和password
是用于连接到驱动器的windows凭据,但是uid
指定apache运行的暂存服务器上的本地用户的唯一标识符,以便它可以写入挂载的目录。
以前,我没有指定本地用户的uid,所以当apache试图写入挂载的目录时,它试图使用Windows凭证(不能在'本地'驱动器上写入)
希望这是有帮助的!