1

这很奇怪,有时有效,有时无效。

我已经放置了链接()参数的 var_dumps。

string(35) "/printbox/web/repo/docusearch/5.pdf"
string(82) "/printbox/web/repo/hardlink/Oleaginosa Moreno Hnos. S.A._20130715_000532989552.pdf"

__

A PHP Error was encountered

Severity: Warning

Message: link(): Operation not permitted

Filename: controllers/ct_form_procesar_escaneos.php

Line Number: 178

__

string(35) "/printbox/web/repo/docusearch/6.pdf"
string(77) "/printbox/web/repo/hardlink/MOLINOS RIO DE LA PLATA_20130715_000533396947.pdf" //THIS WORKED !!!

__以上工作(这里没有错误,实际上创建了硬链接)

string(35) "/printbox/web/repo/docusearch/7.pdf"
string(77) "/printbox/web/repo/hardlink/RENOVA TIMBUES VICENTIN_20130715_000533520657.pdf"

__

A PHP Error was encountered

Severity: Warning

Message: link(): Operation not permitted

Filename: controllers/ct_form_procesar_escaneos.php

Line Number: 178

我真的找不到任何模式......当我制作一个脚本来手动测试之前的一个时,也失败了:

<?php 
echo "Hi";
link( '/printbox/web/repo/docusearch/7.pdf', '/printbox/web/repo/hardlink/RENOVA TIMBUES VICENTIN_20130715_000533520657.pdf');
?>

阿帕奇的日志:

[Mon Jul 15 13:41:57 2013] [error] [client 192.168.100.204] PHP Warning:  link(): Operation not permitted in /printbox/web/repo/a.php on line 3

在目标名称中删除 _ 的空格没有帮助。

谢谢!

4

2 回答 2

2

好吧,似乎问题在于它需要对第一个文件(存在的文件)的写权限,我不知道为什么。

于 2013-07-15T18:08:14.837 回答
0

对于我的情况,我发现需要执行以下附加步骤,因为我会定期更新特定的 tarball 以供其他人下载,并且我在 PHP 中为每个 HTTP 客户端创建指向这些 tarball 的单独硬链接,以便 URL 是随机的。换句话说,我在 PHP 中为网站的每个访问者动态创建不同的硬链接。当我从旧操作系统迁移到新操作系统(OpenSuSE 13.1)时,这失败了。这是我的方法。

  1. 使 link() 目标的父目录具有权限 chmod u=rwx,g=rxs,o=rx。这应该在“ls”中显示为“drwxr-sr-x”。在这种情况下,user.group 的所有权是 wwwrun.www。
  2. 使用 chmod u=rw,g=rw,u=r 权限将 tarball 文件上传到服务器。然后这些文件将从父目录继承组所有权“www”。
  3. 在 PHP 中使用 link() 从 user.group=wwwrun.www 拥有的另一个目录到目标文件创建多个硬链接。这是允许的,因为该文件可由组“www”写入,并且组所有权是从父目录继承的。

这种方法的优点是文件可以为普通用户所有,但是“www”组可以修改文件,并且HTTP服务器能够制作硬链接,因为它们是组可写的。由于组所有权继承的“BSD 语义”,上传文件到服务器的用户不需要在 HTTP 服务器的组中。(见人 2 统计。)

于 2014-10-05T03:16:58.817 回答