С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 30/08/10 в 23:25 |
Может кто тоже ломал голову - есть ли возможность в php работать с mutex или чем-то аналогичным?
Семафоры имхо предлагать смысла нет - нет у пыха средств проверить, занят он или нет.
flock - туда же, т.к. корректно работает в пределах одного процесса.
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 06/09/10 в 10:53 |
все еще актуально
|
|
|
|
С нами с 31.05.10
Сообщения: 1991
Рейтинг: 487
|
Добавлено: 06/09/10 в 11:24 |
рекомендую использовать БД для записи/чтения состояний или выбрать другой язык программирования для твоей задачи
|
|
|
|
С нами с 13.08.08
Сообщения: 1538
Рейтинг: 1011
|
Добавлено: 06/09/10 в 11:45 |
+1 за БД. Просто табличка с парами записей ID/состояние. Таблицу можно спокойно лочить со всеми вытекающими, эмулируя mutex.
|
|
|
|
С нами с 01.02.07
Сообщения: 231
Рейтинг: 294
|
Добавлено: 06/09/10 в 13:34 |
>flock - туда же, т.к. корректно работает в пределах одного процесса.
неправда
>рекомендую использовать БД для записи/чтения состояний
смотря какие задачи стоят
Если блокировать надо данные в БД, то стоит использова средства БД для блокировки
Если данные в файлах, то соотв fcntl/flock/lockf
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 06/09/10 в 15:07 |
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. допускаю, что проблему можно решить донастройкой системы, но хотелось бы универсальное решение, не зависящее сильно от настроек сервера )
|
|
|
|
Криптопохуист
С нами с 05.04.03
Сообщения: 17158
Рейтинг: 6019
|
Добавлено: 06/09/10 в 15:22 |
ТС, ты мозахист или просто хочешь зарисоваться?
Возьми нормальный язык программирования, тебе говорят.
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 06/09/10 в 15:35 |
Pentarh, каждой задаче свое решение, если задача решается быстро и в пару строк без гемороя на пхп, то зачем использовать другой язык, для запуска результата которого нужно соблюсти больше условий?
а так ты чем-то прав, от желания "идеальности" приходися быть немного и мАзОхистом. да и кем вообще быть не приходся )))
|
|
|
|
С нами с 01.02.07
Сообщения: 231
Рейтинг: 294
|
Добавлено: 06/09/10 в 19:47 |
>flock - туда же, т.к. корректно работает в пределах одного процесса.
надо писать что flock может некорретно работать в пределах нескольких тредов одного процесса, причем только для php ;)
Представить не могу как программисты php смогли поломать flock, он лочит filehandle, номер которого не может повторяться для разных тредов одного процесса.
|
|
|
|
Чингачгук, вождь красноглазых
С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824
|
Добавлено: 06/09/10 в 21:16 |
Heavy писал: | если задача решается быстро и в пару строк без гемороя на пхп |
Если. Ключевое слово - толстое "если". Это точно твой случай?
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 06/09/10 в 22:11 |
zuborg писал: | Представить не могу как программисты php смогли поломать flock, он лочит filehandle, номер которого не может повторяться для разных тредов одного процесса. |
ох, не знаю... много у них заГАДочных вещей сделано или не сделано. но всеравно - как можно лишить язык нормальных методов синхронизации, а те что дали еще и кастрировать?!!
Dr.Syshalt: - мой-мой. задача решена мелкой правкой пыха. но мне очень интересно , как ее решить - не имея возможности править пых, что бы на виртуалах, например, решать подобные задачи... а ведь много "скриптов" люди пишут полагаясь на эту функцию...
|
|
|
|
С нами с 21.09.03
Сообщения: 7329
Рейтинг: 2144
|
Добавлено: 06/09/10 в 23:42 |
Heavy писал: | Pentarh, каждой задаче свое решение, если задача решается быстро и в пару строк без гемороя на пхп, то зачем использовать другой язык, для запуска результата которого нужно соблюсти больше условий? |
Не факт, что для другого языка надо больше усилий. Я когда-то очень давно весьма полюблял писать скрипты на freepascal - получалось очень просто, недурно, и результат зависил только от libc, не требуя запуска жирного и неповоротливого интерпретатора.
|
|
|
|
Чингачгук, вождь красноглазых
С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824
|
Добавлено: 07/09/10 в 00:32 |
Heavy писал: | но мне очень интересно , как ее решить - не имея возможности править пых, что бы на виртуалах, например, решать подобные задачи... |
Ну, я бы таки попробовал писать на perl
Там с IPC все нормально.
|
|
|
|
С нами с 01.03.06
Сообщения: 629
Рейтинг: 620
|
Добавлено: 07/09/10 в 11:02 |
Вообщем, на данном форуме, решения, кроме как, писать на другом языке, придумать не получилось
Что ж, вывод есть у этого "решения" есть и другой - любой чисто пхп скрипт/продукт требующий синхронизации для разделения доступа, можно браковать не глядя - автор подобного продукта либо "пиздит" либо сам не ведает бед своего детища т.к. даже самый простецкий счетчик посещений в файл, тупо будет сбрасыватся на некоторых машинах
|
|
|
|
С нами с 13.08.08
Сообщения: 1538
Рейтинг: 1011
|
Добавлено: 07/09/10 в 12:35 |
Быстро, в пару строк и без геморроя задача решается на похапе с использованием СУБД. Если использовать СУБД нельзя по условию задачи - наверное, действительно лучше задействовать другой язык.
|
|
|
|
Чингачгук, вождь красноглазых
С нами с 14.05.04
Сообщения: 4744
Рейтинг: 1824
|
Добавлено: 07/09/10 в 13:40 |
Heavy писал: | Вообщем, на данном форуме, решения, кроме как, писать на другом языке, придумать не получилось |
Ну это как бы и первый форум, что я знаю, на котором многие люди вообще ничего, кроме PHP, не знают (большинство, про тебя не буду говорить), и пишут на нем где надо и не надо. Так что предложение использовать что-то более подходящее для задачи звучит как вполне здравая и свежая мысль ;)
Цитата: | любой чисто пхп скрипт/продукт требующий синхронизации для разделения доступа, можно браковать не глядя - автор подобного продукта либо "пиздит" либо сам не ведает бед своего детища т.к. даже самый простецкий счетчик посещений в файл, тупо будет сбрасыватся на некоторых машинах |
Как говорила герцогиня из "Алисы в Зазеркалье": каждому овощу - свое место. PHP - это именно язык для написания в знаменитом чукотском стиле "что вижу, о том пою", и где главная цель - это чтобы программа хоть как-то доковыляла до конца (в других свалившийся insert в базу вызовет исключительную ситуацию, в том же Perl+DBI или Java+JDBC, но не тут), а на корректность того, что в итоге получилось, всем как бы похуй. Ты видел, сколько "программистов" каждый второй вызов предваряют символом @ - то есть "сделай как получится"? А ты вообще про какие-то непонятные вещи, да про корректность счетчиков мозг пудришь Тебя удивляет, что авторам счетчиков в принципе похуй до таких мелочей, как потенциальная некорректность их кода? По-моему, вполне закономерно.
|
|
|
|