PHP文件\u放置\u内容未截断CIFS装载中的文件

PHP文件\u放置\u内容未截断CIFS装载中的文件,php,fwrite,cifs,Php,Fwrite,Cifs,我有一个奇怪的问题,PHP的文件\u put\u contents()和fwrite()(在使用fopen('filename','w');打开文件句柄后)函数没有按照PHP文档为fwrite()所述截断目标文件。该文件位于Seagate BlackArmor NAS设备上,该设备使用CIFS安装在Linux服务器(Ubuntu 10.04)上,如下所示: mount-t cifs-o默认值,凭证=/etc/smbpass/demo.smbpass,uid=1005,gid=1005,dir\u

我有一个奇怪的问题,PHP的
文件\u put\u contents()
fwrite()
(在使用
fopen('filename','w');
打开文件句柄后)函数没有按照PHP文档为
fwrite()
所述截断目标文件。该文件位于Seagate BlackArmor NAS设备上,该设备使用CIFS安装在Linux服务器(Ubuntu 10.04)上,如下所示:

mount-t cifs-o默认值,凭证=/etc/smbpass/demo.smbpass,uid=1005,gid=1005,dir\u mode=0770,file\u mod=0660//xxx.xxx.xxx.xxx/demo/files/var/www/mysite/src/files/

例如:

myfile.txt的内容:
这是一个IGFATTPANDAON目录,它将在街上运行

使用以下代码运行PHP脚本:
文件内容('myfile.txt','blah')

myfile.txt的内容:
Blahisabigfat Pandaon下大街

文件的预期内容显然是
之类的
,但事实并非如此


有什么想法吗?

由于您的挂载标志,该文件不可读/写

mount-t cifs-o默认值,credentials=/etc/smbpass/demo.smbpass,uid=1005,gid=1005,dir\u mode=0770,file\u mod=0660//xxx.xxx.xxx.xxx/demo/files/var/www/mysite/src/files/


如果您是通过web服务器运行此文件,它将没有访问该文件的权限,因为它是以其他用户的身份运行的。您可以使用is_writable('myfile.txt')来判断是否是这种情况。

我在自己的samba设置(带有samba 3.5.6的Debian 6 x64)上出现了完全相同的症状。我最终将其缩小为以下选项,从而导致完全相同的行为:

large readwrite=no

当改为设置为
yes
时(或删除,因为默认设置为yes),问题就消失了

针对Debain和上游Samba提交的bug报告:


file\u put\u contents()
不需要文件句柄,将其与
fopen()
/
fwrite()
一起使用毫无意义。你能展示你的全部代码吗?另外,如果您想完全覆盖该文件,您可以在开始之前将其覆盖。很抱歉,我的意思是,
fopen()
仅在我尝试使用
fwrite()
时才使用。在尝试
file\u put\u contents()
时根本没有使用它,我考虑过使用
unlink()
,但宁愿避免使用它,因为这意味着更改代码而不是试图解决一个可能基于操作系统的问题。哦,对了,不用担心,也许你应该稍微重新表述一下这个问题。在这种情况下,我会说
unlink();ftruncate($fp,0);倒带($fp);fwrite($fp,'that');fclose($fp)
非常有趣的是,
ftruncate()
然后
revind()
没有效果,即与之前相同的结果。使用
unlink()
删除文件,然后写入文件确实有效。在shell中是否会发生同样的情况?(echo blah>myfile.txt)
它作为不同的用户运行
——不一定。此外,他还设置了组上的写入位,因此,如果web服务器用户在所有者组中,它仍然可以工作。我怀疑这是在转移视线,因为如果仔细观察(我花了一段时间才正确地看到),写入操作正在成功,前4个字节会被更改,但剩余的字节不会被截断。这不是一个完全愚蠢/错误的答案,所以我不会投反对票。我尝试将权限分别更改为0777和0666,但没有效果。该文件在这两种情况下都是可写的,但没有被正确截断。@DaveRandom是正确的-我没有注意到指示该文件实际正在编写的行(这个/那个)中的细微变化。我已经更改了测试用例,希望现在它更可见;)