| Ванька ( @ 2009-04-08 19:11:00 |
| Entry tags: | development |
Symlinks & php feature
Обнаружил интересную особенность при работе с симлинками, пока воспроизвел только в php: если по ходу выполнения скрипта меняется симлинк, то fopen его не подхватывает, и работает со ссылкой на старый файл. Примечтаельно, что аналогичные инструкции на C работают, как и ожидалось. Код под катом.
UPD: проблема решена, нужно использовать clearstatcache().
$ mkdir dir1 dir2; echo null1 > dir1/file; echo null2 >dir2/file
$ php -r " system('rm -f link');
system('ln -s dir1 link');
echo readlink('./link').PHP_EOL;
file_put_contents('./link/file', 'line1'.PHP_EOL);
system('rm -f link');
system('ln -s dir2 link');
echo readlink('./link').PHP_EOL;
file_put_contents('./link/file', 'line2'.PHP_EOL);
"
dir1
dir2
$
$ cat dir1/file ; cat dir2/file
line2
null2
А ожидаем:
line1
line2
UPD: Код на C, который приводит к ожидаемому результату:
int main()
{
int fd;
system("rm -f link");
system("ln -s dir1 link");
fd = fopen("./link/file", "wb");
fputs("line1\n", fd);
fclose(fd);
system("rm -f link");
system("ln -s dir2 link");
fd = fopen("./link/file", "wb");
fputs("line2\n", fd);
fclose(fd);
return 0;
}