В тред призываются бог ПэХэПэ, который объяснит мне что за хуйня?В програмаче никого нет и никто нихуя не знает, поэтому спрошу тут.Итак. Пишем простой скрипт:$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" точно записалось.Вопрос: ПОЧЕМУ БЛЯДЬ ТАК? И как фиксить? Долбоебы с советами - сделать по другому - идут нахуй.буду бампать пока не получу ответ
>>197190679 (OP)При чём здесь линух или винда?php одинаковой версии и там, и там?Кодировка текстового файла какая в обоих случаях?
>>197190679 (OP)На пыне не писал. Как вариант, на линухе у тебя отключена буферизация, а на винде она есть. Попробуй "lalala\n", или как там лайн-фиды ставятсямимо си-программись
>>197191372при том что на винде и лине по разному работает. Причем тут кодировка? Чтобы ни было в файле (а в него пишет) - оно бы хоть крякозябрами вывелось.>>197191373А че дает перенос строки? Ща попробую. Бля надо опять виртуалку с виндой запускать.Кстати. Если убить первый скрипт, то тогда второй читает нормально
включи display_errors во втором скриптене срабатывает file_get_contents, на винде нельзя читать файл открытый другим процессом
>>197192745ты бы ниче и не посоветовал т.к. ты из тех, кто пишет ЧТО МОЖНА ПА ДРУГОМУ, а когда обсирается просто линяет из треда. Так что уебуй. Хуй тебе в рот
>>197192795>посоветовал т.к. ты из тех, кто пишет ЧТО МОЖНА ПА ДРУГОМУ, а когда обсирается просто линяет из треда. Так что уебуй. Хуй тебе в рот.А тебе буфер кэша в залупу, агрящийся хуесос
>>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...;
>>1971931501 - теряется сам смысл скрипта = не подходит2 и 3 не работают. Попробовал.4 - хз как отключить, но тоже не нравится, я не хочу, чтобы для использования скрипта надо было человеку объяснять чтобы он плясал с бубном
>>197193426Во время sleep, если открыть файл, куда записывается "lalala", то оно там будет? Если да, значит, мое предположение с буферизацией неправильное. Но я лишь сказал, что это "как вариант" лишь одна из возможных проблем
забава в том, что и после fclose - пустая строка. Т.е. не может получить содержимое до тех пор пока первый скрипт не вырубить. Чет мне кажется какаят борода с пхп.ини. Покурю и пожалуй попробую линуксовый туда кинуть
>>197190679 (OP)> $f = fopen('file.txt', 'cb');> flock($f, LOCK_EX|LOCK_NB);> ftruncate($f, 0);> fwrite($f, 'lalala');fflush($f);> sleep(5000);Должно помочь.
>>197195004А нахуя ему вообще читать и редактировать файлы через пыху? Даже в чистом C это не так убого выглядит, и будет без проблем работать.
>>197195678Хотя бы не через ноду сделал. Это уже радует. Но если серьезно - что тебе мешает написать эти 5-10 строчек на предназначеном для этого языке? Почему именно пыху нужно использовать как скриптопарашу?
>>197195927Мне надо сделать либу для пыхи, которую можно былобы юзать на винде и линупсе. Очевидно, что либа для пыхи должна быть написана на пыхе
>>197196533Почему именно через пыху? Если не ошибаюсь, в пыху можно подключать библиотеки. Пишешь на C/++, на линуксе компилируешь в .o, на винде в .dll, дальше через свою любимую пыху подключаешься и охуеваешь от скорости работы. Или ты говнокодер, который кроме скриптов на пыхе ни во что не может?
php_test>type file.txtThe process cannot access the file because another process has locked a portion of the file.вот чо пишет под виндой в терминалеа нотепадом открываетсякакаято магия нотепада блеать
>>197190679 (OP)Sup, bro! В твоей задаче слишком много неизвестных:1. Windows и Linux по разному обрабатывают множественные обращения к файлам (скорее всего) ;2. Windows установлена на NTFS(если на FAT то у меня для тебя плохие новости - у тебя ошибка в генетическом коде) , а Linux на EXT[234]. Файловая система может обрабатывать множественный доступ к файлам по разному.Попробуй в качестве экскри эксперимента подмонтировать на Linux флешку с NTFS и писать файл туда.Пы. Сы. Сорян за сажу - не могу в ведроиде ее отключить. Запрашиваю тактический бамп.
https://www.php.net/manual/en/function.flock.php>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 равно будет писать в файл.
>>197201168Пишут, что саблайм тоже не читает. Т.е. это какаято внутренняя магия встроенного блокнота.>зачем оставлять лок на файле?чтобы предотвратить запуск второй копии скрипта
>>197201391Хотя не, это бред, это же дефолтные значения, он и так с ними работает. Просто промелькнула идея, что эта функция не с тем офсетом работает.
>>197190679 (OP)Есть какая-то похожая параша связанная с блокировкой доступа к файлам в приложениях .net core, запускаемых под виндой и под линухом. Сталкивался давненько.Так, чисто для справки.
>>197201401проверил нотепадом++, консолью (type), да хромом тем же. короче никто фаел не открывает кроме нотепада.
Лол забавная тема. А тебе в этот файл обязательно писать? Или ты туда хотел красивый статус выводить?
>>197201401> чтобы предотвратить запуск второй копии скриптану так вот же так можно например$fp = fopen("file.txt", "r+");if (flock($fp, LOCK_EX|LOCK_NB)) { echo "Lock acquired, another process do no run"; flock($fp, LOCK_UN); // снимаем блокировку} else { echo "Cannot acquire lock, seems another process run!";}fclose($fp);
>>197202243> чтобы предотвратить запуск второй копии скриптатак надо предотвратить запуск второй копии? или перехватить доступ к файлу?
у тебя скрипт дёргается по крону или еще както, и если предыдущий вызов еще не отработал, то надо предотвратить запуск второй копии параллельно?
>>197202337Необходимо чтобы первая копия записала данные в файл.Вторая копия, должна увидеть что файл залочен и вырубиться, при этом ей не обязательно уметь читать и писать в файл.Но технически может быть третий скрипт, который должен уметь прочитать данный в файле, какраз в то время, когда запущена первая копия.Я могу сделать еще один файл или поменять логику и т.д. Но мне это не подходит, я предпочту отказаться от винды
Расскажите ему >>197202553 о мьютексах уже наконец, а то он уже от б-гомерзкого высера мелкософта отказаться готов
>>197202958>Долбоебы с советами - сделать по другому - идут нахуй.уж сорян, но поэтому я и не пишу обычно о том, что хочу сделать
>>197202553Почему не нравится вариант со вторым файлом? Отдельный локфайл (пидфайл в /var/run) кстати достаточно распространенная тема для никсов. Если ты на лиуксе можешь прямо сейчас глянуть содержимое этого каталога.
Кстати на него же нужно будет ориентироваться и твоему третьему скрипту, иначе возмжна ситуация, что он заглянет проверить основной файл в середине записи. Ну тут объёмов зависит конечно, может и не стрельнуть.
>>197201534Вывод только один - виндовый блокнот - это кривое поделие, написанное через настолько одно место, что оно кладет хуй на все блокировки ресурсов. Не удивлюсь, еслион выходит из Ring3 или читает файлы каким-нибудь прямым обращением к диску, а то и есть решето, через которое можно запустить произвольный код банально специальным .txt файлом.
>>197203300Для линукса не нужен 2й файл. С одним получается сделать же.Для винды надо два. Но там куча еще всякого функционала опирающегося на этот файл, даже если все переделать, то управлять потом этим всем будет намного сложнее, а я хочу чтобы было проще.
Проверь сначала что дефолтный блокнот работает напрямую с файлом, он может его копию делать и работать с ней.
>>197204661Да он просто из подкорки читает напрямую, нахуй. Какая копия, ты ебанулся? Это же блокнот. К тому же как сделать копию файла, который не читается стандартными способами, м, Эллиот?
>>197190679 (OP)Какой дебил в 2019 занимается низкоуровневой работой с файлами на пхп? Тебе дали мускул в конце концов. Там тоже свои нюансы, кстати.
https://www.php.net/manual/en/function.ftruncate.php#80250Writing after ftruncateI 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":<?php$str1 = 1234;$str2 = 56;$datei = "test.txt";$dh = fopen($datei,"w");fwrite($dh, $str1);fclose($dh);$dh = fopen ($datei,"r+");echo "content: ".fread($dh, filesize($datei))."<br>";echo "pointer after fread at: ".ftell($dh)."<br>";ftruncate($dh, 0);echo "pointer after truncate at: ".ftell($dh)."<br>";fwrite($dh, $str2);echo "pointer after fwrite at: ".ftell($dh)."<br>";rewind($dh);echo "pointer after rewind at: ".ftell($dh)."<br>";$str = fread($dh, 6);echo "content: $str<br>in ASCII: ";for($i = 0; $i < 6; $i++)echo ord($str{$i})."-";fclose($dh);/ OUTPUT: content: 1234 pointer after fread at: 4 pointer after truncate at: 4 pointer after fwrite at: 6 pointer after rewind at: 0 content: 56 in ASCII: 0-0-0-0-53-54/?>So not only ftruncate is filling an empty file up with NULLs as in the note before. Fread is filling leading space with NULLs too.