Бред


Ответить в тред Ответить в тред

<<
Назад | Вниз | Каталог | Обновить тред | Автообновление
90 3 26

Аноним 28/05/19 Втр 19:26:31 1971906791
phpPNG3.webp (72Кб, 800x420)
800x420
В тред призываются бог ПэХэПэ, который объяснит мне что за хуйня?

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

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

$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 1971907712
Потому что гладиолус
Аноним 28/05/19 Втр 19:29:48 1971908883
бамп
Аноним 28/05/19 Втр 19:35:24 1971912014
бамп
Аноним 28/05/19 Втр 19:38:48 1971913725
>>197190679 (OP)
При чём здесь линух или винда?
php одинаковой версии и там, и там?
Кодировка текстового файла какая в обоих случаях?
Аноним 28/05/19 Втр 19:38:50 1971913736
>>197190679 (OP)
На пыне не писал. Как вариант, на линухе у тебя отключена буферизация, а на винде она есть. Попробуй "lalala\n", или как там лайн-фиды ставятся
мимо си-программись
Аноним 28/05/19 Втр 19:43:59 1971916217
>>197191372
при том что на винде и лине по разному работает. Причем тут кодировка? Чтобы ни было в файле (а в него пишет) - оно бы хоть крякозябрами вывелось.

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

Кстати. Если убить первый скрипт, то тогда второй читает нормально
Аноним 28/05/19 Втр 19:45:38 1971917048
>>197191372
и да версия 7.3 и там и там
Аноним 28/05/19 Втр 19:49:41 1971919049
Аноним 28/05/19 Втр 19:50:38 19719195110
>>197191904
мне надо чтобы файл продолжал быть залоченым покуда sleep
Аноним 28/05/19 Втр 19:50:53 19719196211
А количество одновременных потоков?
Аноним 28/05/19 Втр 19:51:47 19719200712
Аноним 28/05/19 Втр 19:53:08 19719206413
Аноним 28/05/19 Втр 19:58:37 19719235314
включи display_errors во втором скрипте

не срабатывает file_get_contents, на винде нельзя читать файл открытый другим процессом
Аноним 28/05/19 Втр 19:59:37 19719239915
Аноним 28/05/19 Втр 20:00:33 19719245516
>>197192353
хуле я его блокнотом могу открыть и прочитать тогда? Или я туплю?
Аноним 28/05/19 Втр 20:01:22 19719249817
>>197192455
да хуй знает может и я туплю
сари ворнинги
Аноним 28/05/19 Втр 20:03:00 19719260518
>>197191373
перенос строки не помог
Аноним 28/05/19 Втр 20:05:17 19719274519
>>197192399
А, ну раз так, тогда сам ебись с этой хуйнёй для даунов
Аноним 28/05/19 Втр 20:06:16 19719279520
>>197192745
ты бы ниче и не посоветовал т.к. ты из тех, кто пишет ЧТО МОЖНА ПА ДРУГОМУ, а когда обсирается просто линяет из треда. Так что уебуй. Хуй тебе в рот
Аноним 28/05/19 Втр 20:06:47 19719282321
Аноним 28/05/19 Втр 20:07:37 19719287222
>>197192795
>посоветовал т.к. ты из тех, кто пишет ЧТО МОЖНА ПА ДРУГОМУ, а когда обсирается просто линяет из треда. Так что уебуй. Хуй тебе в рот.

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

нихуя не ругается
Аноним 28/05/19 Втр 20:10:30 19719304225
index.jpeg (10Кб, 266x189)
266x189
Аноним 28/05/19 Втр 20:11:00 19719307026
>>197192823
чето похожее. Ща почитаю. Тханкс
Аноним 28/05/19 Втр 20:11:42 19719310127
Аноним 28/05/19 Втр 20:12:47 19719315028
>>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 19719342629
>>197193150
а че блокнотом тогда фаел читается?
Аноним 28/05/19 Втр 20:18:30 19719347230
>>197193150
1 - теряется сам смысл скрипта = не подходит
2 и 3 не работают. Попробовал.
4 - хз как отключить, но тоже не нравится, я не хочу, чтобы для использования скрипта надо было человеку объяснять чтобы он плясал с бубном
Аноним 28/05/19 Втр 20:18:46 19719349431
Аноним 28/05/19 Втр 20:19:59 19719357632
>>197193426
Во время sleep, если открыть файл, куда записывается "lalala", то оно там будет? Если да, значит, мое предположение с буферизацией неправильное. Но я лишь сказал, что это "как вариант" лишь одна из возможных проблем
Аноним 28/05/19 Втр 20:26:49 19719396433
Аноним 28/05/19 Втр 20:34:02 19719435934
>>197193964
Тогда жди в треде хотя бы уверенного пыня-джуниора
Аноним 28/05/19 Втр 20:36:00 19719447135
забава в том, что и после fclose - пустая строка. Т.е. не может получить содержимое до тех пор пока первый скрипт не вырубить. Чет мне кажется какаят борода с пхп.ини. Покурю и пожалуй попробую линуксовый туда кинуть
Аноним 28/05/19 Втр 20:44:52 19719493436
>>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 19719500437
>>197190679 (OP)
А нахуя тебе пхп на винде? Серьезно, блядь.
Аноним 28/05/19 Втр 20:52:41 19719532238
28/05/19 Втр 20:58:18 19719563239
>>197195004
А нахуя ему вообще читать и редактировать файлы через пыху? Даже в чистом C это не так убого выглядит, и будет без проблем работать.
Аноним 28/05/19 Втр 20:59:27 19719567840
>>197195632
Нахуя вообще этим заниматься, лучшеб пошел бы с телками гулять
28/05/19 Втр 21:03:59 19719592741
>>197195678
Хотя бы не через ноду сделал. Это уже радует. Но если серьезно - что тебе мешает написать эти 5-10 строчек на предназначеном для этого языке? Почему именно пыху нужно использовать как скриптопарашу?
Аноним 28/05/19 Втр 21:04:42 19719596842
а шо если снимать блокировку

> fwrite($f, 'lalala');
flock($fp, LOCK_UN);
> sleep(5000);
Аноним 28/05/19 Втр 21:14:08 19719648043
>>197195968
Тогда читает. Но мне нельзя ее снимать - смысл скрипта теряется
Аноним 28/05/19 Втр 21:15:06 19719653344
>>197195927
Мне надо сделать либу для пыхи, которую можно былобы юзать на винде и линупсе. Очевидно, что либа для пыхи должна быть написана на пыхе
Аноним 28/05/19 Втр 21:20:46 19719686345
28/05/19 Втр 21:21:58 19719692546
>>197196533
Почему именно через пыху? Если не ошибаюсь, в пыху можно подключать библиотеки. Пишешь на C/++, на линуксе компилируешь в .o, на винде в .dll, дальше через свою любимую пыху подключаешься и охуеваешь от скорости работы. Или ты говнокодер, который кроме скриптов на пыхе ни во что не может?
Аноним 28/05/19 Втр 21:22:52 19719697047
>>197196863
он не помогает, жопойчтец
Аноним 28/05/19 Втр 21:23:22 19719699748
>>197196925
>Или ты говнокодер, который кроме скриптов на пыхе ни во что не может?
да. Съеби
Аноним 28/05/19 Втр 21:24:30 19719706649
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 19719745250
Аноним 28/05/19 Втр 21:46:04 19719826351
>>197190679 (OP)
Sup, bro!
В твоей задаче слишком много неизвестных:
1. Windows и Linux по разному обрабатывают множественные обращения к файлам (скорее всего) ;
2. Windows установлена на NTFS(если на FAT то у меня для тебя плохие новости - у тебя ошибка в генетическом коде) , а Linux на EXT[234]. Файловая система может обрабатывать множественный доступ к файлам по разному.
Попробуй в качестве экскри эксперимента подмонтировать на Linux флешку с NTFS и писать файл туда.
Пы. Сы. Сорян за сажу - не могу в ведроиде ее отключить. Запрашиваю тактический бамп.
Аноним 28/05/19 Втр 21:46:59 19719832452
Аноним 28/05/19 Втр 21:53:22 19719867353
Аноним 28/05/19 Втр 22:00:58 19719906954
Аноним 28/05/19 Втр 22:14:26 19719984055
>>197195927
>Хотя бы не через ноду сделал. Это уже радует
Ты там э, на ноду то не гони блеать!
Аноним 28/05/19 Втр 22:20:10 19720016556
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 19720055957
Аноним 28/05/19 Втр 22:33:19 19720086158
Пошел нахуй
Аноним 28/05/19 Втр 22:33:53 19720088459
Аноним 28/05/19 Втр 22:39:55 19720116860
>>197200559
Хм. Да, ты же писал, что блокнотом открывается нормально. Это похоже действительно на какие-то отличия в настройках самого пхп на разных системах. Я с ним незнаком поэтому идей нет никаких.

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

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

>зачем оставлять лок на файле?
чтобы предотвратить запуск второй копии скрипта
Аноним 28/05/19 Втр 22:46:31 19720149963
>>197201391
Хотя не, это бред, это же дефолтные значения, он и так с ними работает. Просто промелькнула идея, что эта функция не с тем офсетом работает.
Аноним 28/05/19 Втр 22:46:32 19720150564
>>197190679 (OP)
Есть какая-то похожая параша связанная с блокировкой доступа к файлам в приложениях .net core, запускаемых под виндой и под линухом. Сталкивался давненько.
Так, чисто для справки.
Аноним 28/05/19 Втр 22:47:02 19720153465
>>197201401
проверил нотепадом++, консолью (type), да хромом тем же. короче никто фаел не открывает кроме нотепада.
Аноним 28/05/19 Втр 22:51:10 19720177666
>>197201534
Спасибо. Бля рил тханкс
Аноним 28/05/19 Втр 22:51:51 19720181067
Лол забавная тема. А тебе в этот файл обязательно писать? Или ты туда хотел красивый статус выводить?
Аноним 28/05/19 Втр 22:53:01 19720188168
>>197190679 (OP)
write не обязан писать сразу на диск. как фиксить в твоем ссаном пхп - хз
Аноним 28/05/19 Втр 22:54:20 19720194969
>>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);
Аноним 28/05/19 Втр 22:59:31 19720224370
>>197201949
Вторая копия не сможет снять блокировку
Аноним 28/05/19 Втр 23:00:28 19720230471
Аноним 28/05/19 Втр 23:01:01 19720233772
>>197202243
> чтобы предотвратить запуск второй копии скрипта

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

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

Я могу сделать еще один файл или поменять логику и т.д. Но мне это не подходит, я предпочту отказаться от винды
Аноним 28/05/19 Втр 23:05:48 19720257775
>>197202491
Скрипта нет. Но да, это либа для того, чтобы юзать в подобных скриптах
28/05/19 Втр 23:07:10 19720264776
Расскажите ему >>197202553 о мьютексах уже наконец, а то он уже от б-гомерзкого высера мелкософта отказаться готов
Аноним 28/05/19 Втр 23:12:55 19720295877
>>197202553
Этот сценарий вообще по-другому реализуется как правило.
Аноним 28/05/19 Втр 23:17:48 19720318978
>>197202958
>Долбоебы с советами - сделать по другому - идут нахуй.
уж сорян, но поэтому я и не пишу обычно о том, что хочу сделать
Аноним 28/05/19 Втр 23:20:01 19720330079
>>197202553
Почему не нравится вариант со вторым файлом? Отдельный локфайл (пидфайл в /var/run) кстати достаточно распространенная тема для никсов. Если ты на лиуксе можешь прямо сейчас глянуть содержимое этого каталога.
Аноним 28/05/19 Втр 23:24:17 19720347980
Кстати на него же нужно будет ориентироваться и твоему третьему скрипту, иначе возмжна ситуация, что он заглянет проверить основной файл в середине записи. Ну тут объёмов зависит конечно, может и не стрельнуть.
Аноним 28/05/19 Втр 23:24:49 19720351381
>>197201534
Вывод только один - виндовый блокнот - это кривое поделие, написанное через настолько одно место, что оно кладет хуй на все блокировки ресурсов. Не удивлюсь, еслион выходит из Ring3 или читает файлы каким-нибудь прямым обращением к диску, а то и есть решето, через которое можно запустить произвольный код банально специальным .txt файлом.
Аноним 28/05/19 Втр 23:26:50 19720359982
>>197203300
Для линукса не нужен 2й файл. С одним получается сделать же.

Для винды надо два. Но там куча еще всякого функционала опирающегося на этот файл, даже если все переделать, то управлять потом этим всем будет намного сложнее, а я хочу чтобы было проще.
Аноним 28/05/19 Втр 23:31:53 19720383883
>>197202553
ну так ты раздели сущности, файл с данными и файл-блокировщик
Аноним 28/05/19 Втр 23:49:18 19720466184
6HiLtgosI.jpg (67Кб, 960x544)
960x544
Проверь сначала что дефолтный блокнот работает напрямую с файлом, он может его копию делать и работать с ней.
Аноним 28/05/19 Втр 23:54:13 19720491785
>>197204661
Да он просто из подкорки читает напрямую, нахуй. Какая копия, ты ебанулся? Это же блокнот. К тому же как сделать копию файла, который не читается стандартными способами, м, Эллиот?
Аноним 29/05/19 Срд 00:02:24 19720531486
>>197204917
Понятия не имею, винду знаю на уровне юзера. Нет так нет.
Аноним 29/05/19 Срд 00:03:10 19720535287
Аноним 29/05/19 Срд 01:20:52 19720842088
>>197190679 (OP)
Какой дебил в 2019 занимается низкоуровневой работой с файлами на пхп? Тебе дали мускул в конце концов. Там тоже свои нюансы, кстати.
Аноним 29/05/19 Срд 01:27:23 19720869089
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 19721192890
Аноним 29/05/19 Срд 04:58:01 19721266991
Настройки X
Ответить в тред X
15000 [S]
Макс объем: 20Mб, макс кол-во файлов: 4
Кликни/брось файл/ctrl-v
X
Ваш шидевор X
Стикеры X
Избранное / Топ тредов