Со ссылкой на: https://stackoverflow.com/questions/12211629/php-file-put-contents-not-truncating-file-in-cifs-mount
У нас есть устройство Seagate BlackArmor NAS, которое смонтировано на нашем сервере Ubuntu 10.04 следующим образом:
mount -t cifs -o defaults,credentials=/etc/smbpass/demo.smbpass,uid=1005,gid=1005,dir_mode=0770,file_mod=0660 //xxx.xxx.xxx.xxx/demo/files /var/www/mysite/src/files/
Кажется, что любая операция, которая должна обрезать файлы и затем вставлять содержимое в эти файлы на NAS, заканчивается заменой только первых нескольких байтов файла (вплоть до длины нового содержимого), а затем остальной части предыдущего "старый" контент все еще находится в файле.
Например:
Содержимое thisisabigfatpandaonwheelsgoingdownthestreet
myfile.txt: эта команда может отправлять сообщения на колеса.
Запустите сценарий PHP с кодом: file_put_contents('myfile.txt', 'blah');
Содержимое myfile.txt: blahisabigfatpandaonwheelsgoingdownthestreet
Ожидаемое содержимое файла, очевидно, blah
, но это не так.
Использование PHP fwrite()
после создания дескриптора файла с помощью fopen('filename', 'w');
имеет тот же эффект. ftruncate()
также не работает должным образом. Использование команды оболочки, такой как echo -n "blah" > myfile.txt
дает тот же эффект (вот откуда я знаю, что это не специфичная для PHP проблема).
В настоящее время мой единственный обходной путь - удалить файлы, а затем создать их с нуля, но я бы предпочел не менять код в моем приложении, если это возможно (мы только недавно начали использовать устройство NAS). Я бы предпочел применить решение к проблеме, которая кажется связанной с ОС / монтированием.
Есть идеи?