Сохранен 91
https://2ch.hk/b/res/197190679.html
24 декабря Архивач восстановлен после серьёзной аварии. К сожалению, значительная часть сохранённых изображений и видео была потеряна. Подробности случившегося. Мы призываем всех неравнодушных помочь нам с восстановлением утраченного контента!

В тред призываются бог ПэХэПэ, который объяснит

 Аноним 28/05/19 Втр 19:26:31 #1 №197190679 
phpPNG3.webp
В тред призываются бог ПэХэПэ, который объяснит мне что за хуйня?

В програмаче никого нет и никто нихуя не знает, поэтому спрошу тут.

Итак. Пишем простой скрипт:

$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" точно записалось.

Вопрос: ПОЧЕМУ БЛЯДЬ ТАК? И как фиксить? Долбоебы с советами - сделать по другому - идут нахуй.

буду бампать пока не получу ответ
Аноним 28/05/19 Втр 19:27:57 #2 №197190771 
Потому что гладиолус
Аноним 28/05/19 Втр 19:29:48 #3 №197190888 
бамп
Аноним 28/05/19 Втр 19:35:24 #4 №197191201 
бамп
Аноним 28/05/19 Втр 19:38:48 #5 №197191372 
>>197190679 (OP)
При чём здесь линух или винда?
php одинаковой версии и там, и там?
Кодировка текстового файла какая в обоих случаях?
Аноним 28/05/19 Втр 19:38:50 #6 №197191373 
>>197190679 (OP)
На пыне не писал. Как вариант, на линухе у тебя отключена буферизация, а на винде она есть. Попробуй "lalala\n", или как там лайн-фиды ставятся
мимо си-программись
Аноним 28/05/19 Втр 19:43:59 #7 №197191621 
>>197191372
при том что на винде и лине по разному работает. Причем тут кодировка? Чтобы ни было в файле (а в него пишет) - оно бы хоть крякозябрами вывелось.

>>197191373
А че дает перенос строки? Ща попробую. Бля надо опять виртуалку с виндой запускать.

Кстати. Если убить первый скрипт, то тогда второй читает нормально
Аноним 28/05/19 Втр 19:45:38 #8 №197191704 
>>197191372
и да версия 7.3 и там и там
Аноним 28/05/19 Втр 19:49:41 #9 №197191904 
>>197191621
fclose($file) перед sleep
Аноним 28/05/19 Втр 19:50:38 #10 №197191951 
>>197191904
мне надо чтобы файл продолжал быть залоченым покуда sleep
Аноним 28/05/19 Втр 19:50:53 #11 №197191962 
А количество одновременных потоков?
Аноним 28/05/19 Втр 19:51:47 #12 №197192007 
>>197191962
шо блядь
Аноним 28/05/19 Втр 19:53:08 #13 №197192064 
>>197191951
Зачем?
Аноним 28/05/19 Втр 19:58:37 #14 №197192353 
включи display_errors во втором скрипте

не срабатывает file_get_contents, на винде нельзя читать файл открытый другим процессом
Аноним 28/05/19 Втр 19:59:37 #15 №197192399 
>>197192064
ебет?
Аноним 28/05/19 Втр 20:00:33 #16 №197192455 
>>197192353
хуле я его блокнотом могу открыть и прочитать тогда? Или я туплю?
Аноним 28/05/19 Втр 20:01:22 #17 №197192498 
>>197192455
да хуй знает может и я туплю
сари ворнинги
Аноним 28/05/19 Втр 20:03:00 #18 №197192605 
>>197191373
перенос строки не помог
Аноним 28/05/19 Втр 20:05:17 #19 №197192745 
>>197192399
А, ну раз так, тогда сам ебись с этой хуйнёй для даунов
Аноним 28/05/19 Втр 20:06:16 #20 №197192795 
>>197192745
ты бы ниче и не посоветовал т.к. ты из тех, кто пишет ЧТО МОЖНА ПА ДРУГОМУ, а когда обсирается просто линяет из треда. Так что уебуй. Хуй тебе в рот
Аноним 28/05/19 Втр 20:06:47 #21 №197192823 
походу про твою проблему
https://tqdev.com/2018-locking-file-cache-php
Аноним 28/05/19 Втр 20:07:37 #22 №197192872 
>>197192795
>посоветовал т.к. ты из тех, кто пишет ЧТО МОЖНА ПА ДРУГОМУ, а когда обсирается просто линяет из треда. Так что уебуй. Хуй тебе в рот.

А тебе буфер кэша в залупу, агрящийся хуесос
Аноним 28/05/19 Втр 20:07:38 #23 №197192874 
блокировки эти ваще ебаный матан какойто
Аноним 28/05/19 Втр 20:08:56 #24 №197192937 
>>197192498
error_reporting = E_ALL
display_errors = On

нихуя не ругается
Аноним 28/05/19 Втр 20:10:30 #25 №197193042 
index.jpeg
>>197192872
Аноним 28/05/19 Втр 20:11:00 #26 №197193070 
>>197192823
чето похожее. Ща почитаю. Тханкс
Аноним 28/05/19 Втр 20:11:42 #27 №197193101 
>>197193042
Слился, хуила
Аноним 28/05/19 Втр 20:12:47 #28 №197193150 
>>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...;
Аноним 28/05/19 Втр 20:17:42 #29 №197193426 
>>197193150
а че блокнотом тогда фаел читается?
Аноним 28/05/19 Втр 20:18:30 #30 №197193472 
>>197193150
1 - теряется сам смысл скрипта = не подходит
2 и 3 не работают. Попробовал.
4 - хз как отключить, но тоже не нравится, я не хочу, чтобы для использования скрипта надо было человеку объяснять чтобы он плясал с бубном
Аноним 28/05/19 Втр 20:18:46 #31 №197193494 
>>197193426
+
Аноним 28/05/19 Втр 20:19:59 #32 №197193576 
>>197193426
Во время sleep, если открыть файл, куда записывается "lalala", то оно там будет? Если да, значит, мое предположение с буферизацией неправильное. Но я лишь сказал, что это "как вариант" лишь одна из возможных проблем
Аноним 28/05/19 Втр 20:26:49 #33 №197193964 
>>197193576
Да. Будет. В этом и суть
Аноним 28/05/19 Втр 20:34:02 #34 №197194359 
>>197193964
Тогда жди в треде хотя бы уверенного пыня-джуниора
Аноним 28/05/19 Втр 20:36:00 #35 №197194471 
забава в том, что и после fclose - пустая строка. Т.е. не может получить содержимое до тех пор пока первый скрипт не вырубить. Чет мне кажется какаят борода с пхп.ини. Покурю и пожалуй попробую линуксовый туда кинуть
Аноним 28/05/19 Втр 20:44:52 #36 №197194934 
>>197190679 (OP)

> $f = fopen('file.txt', 'cb');
> flock($f, LOCK_EX|LOCK_NB);
> ftruncate($f, 0);
> fwrite($f, 'lalala');
fflush($f);
> sleep(5000);

Должно помочь.
Аноним 28/05/19 Втр 20:46:10 #37 №197195004 
>>197190679 (OP)
А нахуя тебе пхп на винде? Серьезно, блядь.
Аноним 28/05/19 Втр 20:52:41 #38 №197195322 
>>197194934
нет. Уже писал
sage[mailto:sage] Аноним 28/05/19 Втр 20:58:18 #39 №197195632 
>>197195004
А нахуя ему вообще читать и редактировать файлы через пыху? Даже в чистом C это не так убого выглядит, и будет без проблем работать.
Аноним 28/05/19 Втр 20:59:27 #40 №197195678 
>>197195632
Нахуя вообще этим заниматься, лучшеб пошел бы с телками гулять
sage[mailto:sage] Аноним 28/05/19 Втр 21:03:59 #41 №197195927 
>>197195678
Хотя бы не через ноду сделал. Это уже радует. Но если серьезно - что тебе мешает написать эти 5-10 строчек на предназначеном для этого языке? Почему именно пыху нужно использовать как скриптопарашу?
Аноним 28/05/19 Втр 21:04:42 #42 №197195968 
а шо если снимать блокировку

> fwrite($f, 'lalala');
flock($fp, LOCK_UN);
> sleep(5000);
Аноним 28/05/19 Втр 21:14:08 #43 №197196480 
>>197195968
Тогда читает. Но мне нельзя ее снимать - смысл скрипта теряется
Аноним 28/05/19 Втр 21:15:06 #44 №197196533 
>>197195927
Мне надо сделать либу для пыхи, которую можно былобы юзать на винде и линупсе. Очевидно, что либа для пыхи должна быть написана на пыхе
Аноним 28/05/19 Втр 21:20:46 #45 №197196863 
>>197190679 (OP)
сделай флаш, аутист
sage[mailto:sage] Аноним 28/05/19 Втр 21:21:58 #46 №197196925 
>>197196533
Почему именно через пыху? Если не ошибаюсь, в пыху можно подключать библиотеки. Пишешь на C/++, на линуксе компилируешь в .o, на винде в .dll, дальше через свою любимую пыху подключаешься и охуеваешь от скорости работы. Или ты говнокодер, который кроме скриптов на пыхе ни во что не может?
Аноним 28/05/19 Втр 21:22:52 #47 №197196970 
>>197196863
он не помогает, жопойчтец
Аноним 28/05/19 Втр 21:23:22 #48 №197196997 
>>197196925
>Или ты говнокодер, который кроме скриптов на пыхе ни во что не может?
да. Съеби
Аноним 28/05/19 Втр 21:24:30 #49 №197197066 
php_test>type file.txt
The process cannot access the file because another process has locked a portion of the file.

вот чо пишет под виндой в терминале
а нотепадом открывается
какаято магия нотепада блеать
Аноним 28/05/19 Втр 21:31:41 #50 №197197452 
>>197197066
ахуительная история
Аноним 28/05/19 Втр 21:46:04 #51 №197198263 
>>197190679 (OP)
Sup, bro!
В твоей задаче слишком много неизвестных:
1. Windows и Linux по разному обрабатывают множественные обращения к файлам (скорее всего) ;
2. Windows установлена на NTFS(если на FAT то у меня для тебя плохие новости - у тебя ошибка в генетическом коде) , а Linux на EXT[234]. Файловая система может обрабатывать множественный доступ к файлам по разному.
Попробуй в качестве экскри эксперимента подмонтировать на Linux флешку с NTFS и писать файл туда.
Пы. Сы. Сорян за сажу - не могу в ведроиде ее отключить. Запрашиваю тактический бамп.
Аноним 28/05/19 Втр 21:46:59 #52 №197198324 
>>197198263
О! Отключилась.
Аноним 28/05/19 Втр 21:53:22 #53 №197198673 
>>197190679 (OP)
буфер флашить уже советовали?
Аноним 28/05/19 Втр 22:00:58 #54 №197199069 
>>197198673
советовали
Аноним 28/05/19 Втр 22:14:26 #55 №197199840 
>>197195927
>Хотя бы не через ноду сделал. Это уже радует
Ты там э, на ноду то не гони блеать!
Аноним 28/05/19 Втр 22:20:10 #56 №197200165 
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 на линуксе просто не работает. Попробуй во втором скрипте перед чтением что-то туда ещё дописать.
Аноним 28/05/19 Втр 22:27:23 #57 №197200559 
>>197200165
Работает
Аноним 28/05/19 Втр 22:33:19 #58 №197200861 
Пошел нахуй
Аноним 28/05/19 Втр 22:33:53 #59 №197200884 
>>197200559
Соси, пидор
Аноним 28/05/19 Втр 22:39:55 #60 №197201168 
>>197200559
Хм. Да, ты же писал, что блокнотом открывается нормально. Это похоже действительно на какие-то отличия в настройках самого пхп на разных системах. Я с ним незнаком поэтому идей нет никаких.

Но кстати, вопрос, зачем оставлять лок на файле? Обычно, когда работают с разделяемыми ресурсами, то перед чтением или записью лочат мьютекс и после нужной операции освобождают. Твой же пример первого скрипта работать будет нормально только если нигде другого лока нет, т.к. ты используешь неблокирующий вызов лока. Т.е. если он не удастся скрипт вс1 равно будет писать в файл.
Аноним 28/05/19 Втр 22:44:34 #61 №197201391 
Слушай, а попробуй во втором скрипте

$t = file_get_contents('file.txt', FALSE, NULL, 0);
Аноним 28/05/19 Втр 22:44:47 #62 №197201401 
>>197201168
Пишут, что саблайм тоже не читает. Т.е. это какаято внутренняя магия встроенного блокнота.

>зачем оставлять лок на файле?
чтобы предотвратить запуск второй копии скрипта
Аноним 28/05/19 Втр 22:46:31 #63 №197201499 
>>197201391
Хотя не, это бред, это же дефолтные значения, он и так с ними работает. Просто промелькнула идея, что эта функция не с тем офсетом работает.
Аноним 28/05/19 Втр 22:46:32 #64 №197201505 
>>197190679 (OP)
Есть какая-то похожая параша связанная с блокировкой доступа к файлам в приложениях .net core, запускаемых под виндой и под линухом. Сталкивался давненько.
Так, чисто для справки.
Аноним 28/05/19 Втр 22:47:02 #65 №197201534 
>>197201401
проверил нотепадом++, консолью (type), да хромом тем же. короче никто фаел не открывает кроме нотепада.
Аноним 28/05/19 Втр 22:51:10 #66 №197201776 
>>197201534
Спасибо. Бля рил тханкс
Аноним 28/05/19 Втр 22:51:51 #67 №197201810 
Лол забавная тема. А тебе в этот файл обязательно писать? Или ты туда хотел красивый статус выводить?
Аноним 28/05/19 Втр 22:53:01 #68 №197201881 
>>197190679 (OP)
write не обязан писать сразу на диск. как фиксить в твоем ссаном пхп - хз
Аноним 28/05/19 Втр 22:54:20 #69 №197201949 
>>197201401

> чтобы предотвратить запуск второй копии скрипта

ну так вот же так можно например


$fp = fopen("file.txt", "r+");


if (flock($fp, LOCK_EX|LOCK_NB)) {
\techo "Lock acquired, another process do no run";

flock($fp, LOCK_UN); // снимаем блокировку
} else {
echo "Cannot acquire lock, seems another process run!";
}
fclose($fp);
Аноним 28/05/19 Втр 22:59:31 #70 №197202243 
>>197201949
Вторая копия не сможет снять блокировку
Аноним 28/05/19 Втр 23:00:28 #71 №197202304 
>>197202243
>>197201949
а если снять в первой, тогда вторая запустится
Аноним 28/05/19 Втр 23:01:01 #72 №197202337 
>>197202243
> чтобы предотвратить запуск второй копии скрипта

так надо предотвратить запуск второй копии? или перехватить доступ к файлу?
Аноним 28/05/19 Втр 23:03:51 #73 №197202491 
у тебя скрипт дёргается по крону или еще както, и если предыдущий вызов еще не отработал, то надо предотвратить запуск второй копии параллельно?
Аноним 28/05/19 Втр 23:05:09 #74 №197202553 
>>197202337
Необходимо чтобы первая копия записала данные в файл.
Вторая копия, должна увидеть что файл залочен и вырубиться, при этом ей не обязательно уметь читать и писать в файл.

Но технически может быть третий скрипт, который должен уметь прочитать данный в файле, какраз в то время, когда запущена первая копия.

Я могу сделать еще один файл или поменять логику и т.д. Но мне это не подходит, я предпочту отказаться от винды
Аноним 28/05/19 Втр 23:05:48 #75 №197202577 
>>197202491
Скрипта нет. Но да, это либа для того, чтобы юзать в подобных скриптах
sage[mailto:sage] Аноним 28/05/19 Втр 23:07:10 #76 №197202647 
Расскажите ему >>197202553 о мьютексах уже наконец, а то он уже от б-гомерзкого высера мелкософта отказаться готов
Аноним 28/05/19 Втр 23:12:55 #77 №197202958 
>>197202553
Этот сценарий вообще по-другому реализуется как правило.
Аноним 28/05/19 Втр 23:17:48 #78 №197203189 
>>197202958
>Долбоебы с советами - сделать по другому - идут нахуй.
уж сорян, но поэтому я и не пишу обычно о том, что хочу сделать
Аноним 28/05/19 Втр 23:20:01 #79 №197203300 
>>197202553
Почему не нравится вариант со вторым файлом? Отдельный локфайл (пидфайл в /var/run) кстати достаточно распространенная тема для никсов. Если ты на лиуксе можешь прямо сейчас глянуть содержимое этого каталога.
Аноним 28/05/19 Втр 23:24:17 #80 №197203479 
Кстати на него же нужно будет ориентироваться и твоему третьему скрипту, иначе возмжна ситуация, что он заглянет проверить основной файл в середине записи. Ну тут объёмов зависит конечно, может и не стрельнуть.
Аноним 28/05/19 Втр 23:24:49 #81 №197203513 
>>197201534
Вывод только один - виндовый блокнот - это кривое поделие, написанное через настолько одно место, что оно кладет хуй на все блокировки ресурсов. Не удивлюсь, еслион выходит из Ring3 или читает файлы каким-нибудь прямым обращением к диску, а то и есть решето, через которое можно запустить произвольный код банально специальным .txt файлом.
Аноним 28/05/19 Втр 23:26:50 #82 №197203599 
>>197203300
Для линукса не нужен 2й файл. С одним получается сделать же.

Для винды надо два. Но там куча еще всякого функционала опирающегося на этот файл, даже если все переделать, то управлять потом этим всем будет намного сложнее, а я хочу чтобы было проще.
Аноним 28/05/19 Втр 23:31:53 #83 №197203838 
>>197202553
ну так ты раздели сущности, файл с данными и файл-блокировщик
Аноним 28/05/19 Втр 23:49:18 #84 №197204661 
6HiLtgosI.jpg
Проверь сначала что дефолтный блокнот работает напрямую с файлом, он может его копию делать и работать с ней.
Аноним 28/05/19 Втр 23:54:13 #85 №197204917 
>>197204661
Да он просто из подкорки читает напрямую, нахуй. Какая копия, ты ебанулся? Это же блокнот. К тому же как сделать копию файла, который не читается стандартными способами, м, Эллиот?
Аноним 29/05/19 Срд 00:02:24 #86 №197205314 
>>197204917
Понятия не имею, винду знаю на уровне юзера. Нет так нет.
Аноним 29/05/19 Срд 00:03:10 #87 №197205352 
>>197190679 (OP)
убери слип и все заработает
Аноним 29/05/19 Срд 01:20:52 #88 №197208420 
>>197190679 (OP)
Какой дебил в 2019 занимается низкоуровневой работой с файлами на пхп? Тебе дали мускул в конце концов. Там тоже свои нюансы, кстати.
Аноним 29/05/19 Срд 01:27:23 #89 №197208690 
https://www.php.net/manual/en/function.ftruncate.php#80250

Writing after ftruncate

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":

<?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.
Аноним 29/05/19 Срд 03:59:17 #90 №197211928 
>>197205352
чот заорал
Аноним 29/05/19 Срд 04:58:01 #91 №197212669 
>>197190679 (OP)
fsync() сделай
comments powered by Disqus

Отзывы и предложения