Master-X
Форум | Новости | Статьи
Главная » Форум » Программинг, Скрипты, Софт, Сервисы » 
Тема: PHP и mutex
цитата
30/08/10 в 23:25
 Heavy
Может кто тоже ломал голову - есть ли возможность в php работать с mutex или чем-то аналогичным?
Семафоры имхо предлагать смысла нет - нет у пыха средств проверить, занят он или нет.
flock - туда же, т.к. корректно работает в пределах одного процесса.
цитата
06/09/10 в 10:53
 Heavy
все еще актуально icon_smile.gif
цитата
06/09/10 в 11:24
 LeadFarmer
рекомендую использовать БД для записи/чтения состояний или выбрать другой язык программирования для твоей задачи smail54.gif
цитата
06/09/10 в 11:45
 remorhaz
+1 за БД. Просто табличка с парами записей ID/состояние. Таблицу можно спокойно лочить со всеми вытекающими, эмулируя mutex.
цитата
06/09/10 в 13:34
 zuborg
>flock - туда же, т.к. корректно работает в пределах одного процесса.
неправда

>рекомендую использовать БД для записи/чтения состояний
смотря какие задачи стоят
Если блокировать надо данные в БД, то стоит использова средства БД для блокировки
Если данные в файлах, то соотв fcntl/flock/lockf
цитата
06/09/10 в 15:07
 Heavy
zuborg писал:
Если данные в файлах, то соотв fcntl/flock/lockf

да, блокировка нужна файла - захватил+считал+поменял+отпустил, либо проверил захвачено на данный момент или нет (поэтому семафор и не прошел - нет через пых по таймауту ожидание прервать)
спасибо, посмотрю в сторону fcntl.

zuborg писал:

>рекомендую использовать БД для записи/чтения состояний
смотря какие задачи стоят

+1, базу тут превлекать смысла нет

zuborg писал:
>flock - туда же, т.к. корректно работает в пределах одного процесса.
неправда

я был бы рад, если юы это было неправда. и всегда доверял этому методу, пока не напаролся сам на практике и не нашел объяснения причины в сети.

для начала цитата из официальной документации по php (http://php.net/manual/en/function.flock.php)

Warning
On some operating systems flock() is implemented at the process level. When using a multithreaded server API like ISAPI you may not be able to rely on flock() to protect files against other PHP scripts running in parallel threads of the same server instance!

имеется Linux 2.6.18-128.7.1.el5
апач "форкается" на N "процессов", между ними flock не везде работаетю вот пример лога с колизией:


2010-09-06 00:45:46 >   C ~ wait lock
2010-09-06 00:45:46 >   C ~ locked
2010-09-06 00:45:46 >   C ~ load
2010-09-06 00:45:46 >   C ~ save
2010-09-06 00:45:46 >   A ~ wait lock
2010-09-06 00:45:46 >   C ~ unlock
2010-09-06 00:45:46 >   A ~ locked
2010-09-06 00:45:46 >   A ~ load
2010-09-06 00:45:46 >   A ~ save
2010-09-06 00:45:46 >   B ~ wait lock
2010-09-06 00:45:46 >   B ~ locked
2010-09-06 00:45:46 >   A ~ unlock
2010-09-06 00:45:46 >   A ~ wait lock
2010-09-06 00:45:46 >   A ~ locked
2010-09-06 00:45:46 >   B ~ save
2010-09-06 00:45:46 >   B ~ unlock
2010-09-06 00:45:46 >   B ~ wait lock
2010-09-06 00:45:46 >   B ~ locked
2010-09-06 00:45:46 >   B ~ load
2010-09-06 00:45:46 >   B ~ unlock
2010-09-06 00:45:46 >   A ~ load
2010-09-06 00:45:46 >   A ~ unlock

A и B в середине куска лога входяд в колизию


p.s. допускаю, что проблему можно решить донастройкой системы, но хотелось бы универсальное решение, не зависящее сильно от настроек сервера )
цитата
06/09/10 в 15:22
 Pentarh
ТС, ты мозахист или просто хочешь зарисоваться?

Возьми нормальный язык программирования, тебе говорят.
цитата
06/09/10 в 15:35
 Heavy
Pentarh, каждой задаче свое решение, если задача решается быстро и в пару строк без гемороя на пхп, то зачем использовать другой язык, для запуска результата которого нужно соблюсти больше условий?

а так ты чем-то прав, от желания "идеальности" приходися быть немного и мАзОхистом. да и кем вообще быть не приходся icon_smile.gif)))
цитата
06/09/10 в 19:47
 zuborg
>flock - туда же, т.к. корректно работает в пределах одного процесса.
надо писать что flock может некорретно работать в пределах нескольких тредов одного процесса, причем только для php ;)

Представить не могу как программисты php смогли поломать flock, он лочит filehandle, номер которого не может повторяться для разных тредов одного процесса.
цитата
06/09/10 в 21:16
 Dr.Syshalt
Heavy писал:
если задача решается быстро и в пару строк без гемороя на пхп


Если. Ключевое слово - толстое "если". Это точно твой случай? icon_wink.gif
цитата
06/09/10 в 22:11
 Heavy
zuborg писал:
Представить не могу как программисты php смогли поломать flock, он лочит filehandle, номер которого не может повторяться для разных тредов одного процесса.

ох, не знаю... много у них заГАДочных вещей сделано или не сделано. но всеравно - как можно лишить язык нормальных методов синхронизации, а те что дали еще и кастрировать?!! icon_cry.gif

Dr.Syshalt: - мой-мой. задача решена мелкой правкой пыха. но мне очень интересно , как ее решить - не имея возможности править пых, что бы на виртуалах, например, решать подобные задачи... а ведь много "скриптов" люди пишут полагаясь на эту функцию... icon_smile.gif
цитата
06/09/10 в 23:42
 lega_cobra
Heavy писал:
Pentarh, каждой задаче свое решение, если задача решается быстро и в пару строк без гемороя на пхп, то зачем использовать другой язык, для запуска результата которого нужно соблюсти больше условий?


Не факт, что для другого языка надо больше усилий. Я когда-то очень давно весьма полюблял писать скрипты на freepascal - получалось очень просто, недурно, и результат зависил только от libc, не требуя запуска жирного и неповоротливого интерпретатора. icon_smile.gif
цитата
07/09/10 в 00:32
 Dr.Syshalt
Heavy писал:
но мне очень интересно , как ее решить - не имея возможности править пых, что бы на виртуалах, например, решать подобные задачи...


Ну, я бы таки попробовал писать на perl smail101.gif
Там с IPC все нормально.
цитата
07/09/10 в 11:02
 Heavy
Вообщем, на данном форуме, решения, кроме как, писать на другом языке, придумать не получилось icon_cool.gif

Что ж, вывод есть у этого "решения" есть и другой - любой чисто пхп скрипт/продукт требующий синхронизации для разделения доступа, можно браковать не глядя - автор подобного продукта либо "пиздит" либо сам не ведает бед своего детища smail101.gif т.к. даже самый простецкий счетчик посещений в файл, тупо будет сбрасыватся на некоторых машинах icon_razz.gif
цитата
07/09/10 в 12:35
 remorhaz
Быстро, в пару строк и без геморроя задача решается на похапе с использованием СУБД. Если использовать СУБД нельзя по условию задачи - наверное, действительно лучше задействовать другой язык.
цитата
07/09/10 в 13:40
 Dr.Syshalt
Heavy писал:
Вообщем, на данном форуме, решения, кроме как, писать на другом языке, придумать не получилось icon_cool.gif


Ну это как бы и первый форум, что я знаю, на котором многие люди вообще ничего, кроме PHP, не знают (большинство, про тебя не буду говорить), и пишут на нем где надо и не надо. Так что предложение использовать что-то более подходящее для задачи звучит как вполне здравая и свежая мысль ;)

Цитата:
любой чисто пхп скрипт/продукт требующий синхронизации для разделения доступа, можно браковать не глядя - автор подобного продукта либо "пиздит" либо сам не ведает бед своего детища smail101.gif т.к. даже самый простецкий счетчик посещений в файл, тупо будет сбрасыватся на некоторых машинах icon_razz.gif


Как говорила герцогиня из "Алисы в Зазеркалье": каждому овощу - свое место. PHP - это именно язык для написания в знаменитом чукотском стиле "что вижу, о том пою", и где главная цель - это чтобы программа хоть как-то доковыляла до конца (в других свалившийся insert в базу вызовет исключительную ситуацию, в том же Perl+DBI или Java+JDBC, но не тут), а на корректность того, что в итоге получилось, всем как бы похуй. Ты видел, сколько "программистов" каждый второй вызов предваряют символом @ - то есть "сделай как получится"? А ты вообще про какие-то непонятные вещи, да про корректность счетчиков мозг пудришь icon_biggrin.gif Тебя удивляет, что авторам счетчиков в принципе похуй до таких мелочей, как потенциальная некорректность их кода? По-моему, вполне закономерно.


Эта страница в полной версии