24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!
Открываем, лочим, обрезаем размер до нуля, пишем в file.txt строку "lalala", отправляем скрипт повисеть 5000 секунд.
Пишем второй:
$t = file_get_contents('file.txt'); var_dump($t);
Сопсно. Читаем содержимое файла и выводим его на экран.
Итак. Запускаем первый, он делает запись в файл и пока он висит - запускаем второй. Что происходит? var_dump() выводит на экран строку - "lalala" и правильно делает. А правильно он делает потом, что запускаем мы все это дело на линуксе. Проделываем ту же операцию на винде - var_dump() выводит пустую строку, несмотря на то, что "lalala" точно записалось.
Вопрос: ПОЧЕМУ БЛЯДЬ ТАК? И как фиксить? Долбоебы с советами - сделать по другому - идут нахуй.
>>197190679 (OP) На пыне не писал. Как вариант, на линухе у тебя отключена буферизация, а на винде она есть. Попробуй "lalala\n", или как там лайн-фиды ставятся мимо си-программись
>>197191372 при том что на винде и лине по разному работает. Причем тут кодировка? Чтобы ни было в файле (а в него пишет) - оно бы хоть крякозябрами вывелось.
>>197191373 А че дает перенос строки? Ща попробую. Бля надо опять виртуалку с виндой запускать.
Кстати. Если убить первый скрипт, то тогда второй читает нормально
>>197192745 ты бы ниче и не посоветовал т.к. ты из тех, кто пишет ЧТО МОЖНА ПА ДРУГОМУ, а когда обсирается просто линяет из треда. Так что уебуй. Хуй тебе в рот
>>197191621 Когда ты пишешь каким-нибудь write/print/etc, то при записи строки из нескольких символов, чтобы не дергать ядро sys call'ами на запись каждого символа из строки, существует буфер, который либо создается самой функцией, либо - автоматически самой системой. В этом буфере будут накапливаться символы, которые при "выплескивании" буфера лишь один раз дернут ядро sys call'ом на запись блока символов. В общем, буферизация позволяет существенно повысить скорость записи огромных массивов данных в файлы. То есть в твоем случае "lalala" пишется не сразу в файл, а в промежуточный буфер, который временно создается в ОЗУ. Затем тебе надо "выплеснуть" содержимое буфера в файл. Например, в си для этого, есть функция fflush(); Также буферы умеют сами "флашить" свое содержимое. Есть line buffered буферы, а есть fully buffered буферы. Line buffered автоматически флашат все свое содержимое при встрече line feed символа, или когда они становятся full. Fully buffered - только тогда, когда становятся full. Также обычно система принудительно флашит все буферы при закрытии файла, данные на запись для которого были буферизированы. Еще в системе можно принудительно отключить буферизацию. Есть несколько вариантов: спец. команды в коде/запуск исполняемого файла со спец. ключом/etc. В общем, у тебя есть потенциально четыре варианта в зависимости от реализации буферизации в текущей системе (псевдокод): 1) fopen...; fwrite...; fclose...; sleep; 2) fopen...; fwrite...; fflush...; sleep...; 3) fopen...; fwrite...; с символом "\n" в конце sleep...; 4) отключение буферизации fopen...; fwrite...; sleep...;
>>197193150 1 - теряется сам смысл скрипта = не подходит 2 и 3 не работают. Попробовал. 4 - хз как отключить, но тоже не нравится, я не хочу, чтобы для использования скрипта надо было человеку объяснять чтобы он плясал с бубном
>>197193426 Во время sleep, если открыть файл, куда записывается "lalala", то оно там будет? Если да, значит, мое предположение с буферизацией неправильное. Но я лишь сказал, что это "как вариант" лишь одна из возможных проблем
забава в том, что и после fclose - пустая строка. Т.е. не может получить содержимое до тех пор пока первый скрипт не вырубить. Чет мне кажется какаят борода с пхп.ини. Покурю и пожалуй попробую линуксовый туда кинуть
>>197195678 Хотя бы не через ноду сделал. Это уже радует. Но если серьезно - что тебе мешает написать эти 5-10 строчек на предназначеном для этого языке? Почему именно пыху нужно использовать как скриптопарашу?
>>197196533 Почему именно через пыху? Если не ошибаюсь, в пыху можно подключать библиотеки. Пишешь на C/++, на линуксе компилируешь в .o, на винде в .dll, дальше через свою любимую пыху подключаешься и охуеваешь от скорости работы. Или ты говнокодер, который кроме скриптов на пыхе ни во что не может?
>>197190679 (OP) Sup, bro! В твоей задаче слишком много неизвестных: 1. Windows и Linux по разному обрабатывают множественные обращения к файлам (скорее всего) ; 2. Windows установлена на NTFS(если на FAT то у меня для тебя плохие новости - у тебя ошибка в генетическом коде) , а Linux на EXT[234]. Файловая система может обрабатывать множественный доступ к файлам по разному. Попробуй в качестве экскри эксперимента подмонтировать на Linux флешку с NTFS и писать файл туда. Пы. Сы. Сорян за сажу - не могу в ведроиде ее отключить. Запрашиваю тактический бамп.
>Note: >flock() uses mandatory locking instead of advisory locking on Windows. Mandatory locking is also supported on Linux and System V based operating systems via the usual mechanism supported by the fcntl() system call: that is, if the file in question has the setgid permission bit set and the group execution bit cleared. On Linux, the file system will also need to be mounted with the mand option for this to work.
У тебя скорее всего flock на линуксе просто не работает. Попробуй во втором скрипте перед чтением что-то туда ещё дописать.
>>197200559 Хм. Да, ты же писал, что блокнотом открывается нормально. Это похоже действительно на какие-то отличия в настройках самого пхп на разных системах. Я с ним незнаком поэтому идей нет никаких.
Но кстати, вопрос, зачем оставлять лок на файле? Обычно, когда работают с разделяемыми ресурсами, то перед чтением или записью лочат мьютекс и после нужной операции освобождают. Твой же пример первого скрипта работать будет нормально только если нигде другого лока нет, т.к. ты используешь неблокирующий вызов лока. Т.е. если он не удастся скрипт вс1 равно будет писать в файл.
>>197201391 Хотя не, это бред, это же дефолтные значения, он и так с ними работает. Просто промелькнула идея, что эта функция не с тем офсетом работает.
>>197190679 (OP) Есть какая-то похожая параша связанная с блокировкой доступа к файлам в приложениях .net core, запускаемых под виндой и под линухом. Сталкивался давненько. Так, чисто для справки.
>>197202337 Необходимо чтобы первая копия записала данные в файл. Вторая копия, должна увидеть что файл залочен и вырубиться, при этом ей не обязательно уметь читать и писать в файл.
Но технически может быть третий скрипт, который должен уметь прочитать данный в файле, какраз в то время, когда запущена первая копия.
Я могу сделать еще один файл или поменять логику и т.д. Но мне это не подходит, я предпочту отказаться от винды
>>197202553 Почему не нравится вариант со вторым файлом? Отдельный локфайл (пидфайл в /var/run) кстати достаточно распространенная тема для никсов. Если ты на лиуксе можешь прямо сейчас глянуть содержимое этого каталога.
Кстати на него же нужно будет ориентироваться и твоему третьему скрипту, иначе возмжна ситуация, что он заглянет проверить основной файл в середине записи. Ну тут объёмов зависит конечно, может и не стрельнуть.
>>197201534 Вывод только один - виндовый блокнот - это кривое поделие, написанное через настолько одно место, что оно кладет хуй на все блокировки ресурсов. Не удивлюсь, еслион выходит из Ring3 или читает файлы каким-нибудь прямым обращением к диску, а то и есть решето, через которое можно запустить произвольный код банально специальным .txt файлом.
>>197203300 Для линукса не нужен 2й файл. С одним получается сделать же.
Для винды надо два. Но там куча еще всякого функционала опирающегося на этот файл, даже если все переделать, то управлять потом этим всем будет намного сложнее, а я хочу чтобы было проще.
>>197204661 Да он просто из подкорки читает напрямую, нахуй. Какая копия, ты ебанулся? Это же блокнот. К тому же как сделать копию файла, который не читается стандартными способами, м, Эллиот?
I didnt expect that I can write in the middle of nowhere. I thought that I would write at the beginning of the file but the first 4 bytes were filled automatically with NULLs followed by "56":
В програмаче никого нет и никто нихуя не знает, поэтому спрошу тут.
Итак. Пишем простой скрипт:
$f = fopen('file.txt', 'cb');
flock($f, LOCK_EX|LOCK_NB);
ftruncate($f, 0);
fwrite($f, 'lalala');
sleep(5000);
Открываем, лочим, обрезаем размер до нуля, пишем в file.txt строку "lalala", отправляем скрипт повисеть 5000 секунд.
Пишем второй:
$t = file_get_contents('file.txt');
var_dump($t);
Сопсно. Читаем содержимое файла и выводим его на экран.
Итак. Запускаем первый, он делает запись в файл и пока он висит - запускаем второй. Что происходит? var_dump() выводит на экран строку - "lalala" и правильно делает. А правильно он делает потом, что запускаем мы все это дело на линуксе. Проделываем ту же операцию на винде - var_dump() выводит пустую строку, несмотря на то, что "lalala" точно записалось.
Вопрос: ПОЧЕМУ БЛЯДЬ ТАК? И как фиксить? Долбоебы с советами - сделать по другому - идут нахуй.
буду бампать пока не получу ответ