不允许使用link()操作

时间:2013-07-15 16:44:26

标签: php hardlink

这很奇怪,有时是有效的,有时也不行。

我把link()的参数放在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');
?>

Apache的日志:

[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

在目标名称中为_区分空格没有帮助。

谢谢!

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:0)

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

  1. 使link()目标的父目录具有权限chmod u = rwx,g = rxs,o = rx。这应该出现在&#34; ls&#34; as&#34; drwxr-sr-x&#34;。在这种情况下,user.group所有权是wwwrun.www。
  2. 使用权限chmod u = rw,g = rw,u = r将tarball文件上传到服务器。然后这些文件将继承组所有权&#34; www&#34;来自父目录。
  3. 在PHP中使用link()从user.group = wwwrun.www拥有的另一个目录创建多个硬链接到目标文件。这是允许的,因为该文件可以按组&#34; www&#34;编写,并且组所有权是从父目录继承的。
  4. 这种方法的优点是文件可以由普通用户拥有,但是&#34; www&#34; group可以修改文件,HTTP服务器可以创建硬链接,因为它们是组可写的。将文件上传到服务器的用户不需要在HTTP服务器组中,因为&#34; BSD语义&#34;组所有权继承。 (参见man 2 stat。)