Синхронизация потоков, существует ли такое в php

Cloun

Новичок
Синхронизация потоков, существует ли такое в php

Опишу эллементарную ситуацию:
Есть одна конекция к базе данных открытая функцией mysql_pconnect(). Предположим два (или более) юзеров единовременно пытаются выполнить запись по этой конекции в таблицу, а потом к возращенному id функцией mysql_insert_id() делают какую-то привязку.
Т.е. если даже mysql_query() - атамарная операция, то уже вызов mysql_insert_id() может вернуть некоерктный id.

Решение данной проблемы я вижу только одно - лочить конекцию средствами языка php.
Даже блокировками таблицы на уровне БД не дабъешся требуемого результат.

В хелпе я нарыл Semaphore, Shared Memory and IPC Functions.
Но в данном случае Semaphore поможет, но, может есть более удобное средство? Может есть какая-нибудь возможность залочить конкретный ресурс?
 

Popoff

popoff.donetsk.ua
что-то мне подсказывает, что ты не совсем хорошо понимаешь, как работает mysql_pconnect. можешь объяснить, что означает фраза
два (или более) юзеров единовременно пытаются выполнить запись по этой конекции в таблицу
?

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

Cloun

Новичок
Или как второй вариант - на каждую сессию открывать свою конекцию.

-~{}~ 08.10.05 18:30:

Popoff
Почему не возмодно??? Функция mysql_pconnect() при повторном вызове не создает новое соединение, и возращает указатель на уже существующее.
И, насколько мне известно из мануала по php, это соединение распростроняется на все сесии. И не умерает при завершении выполнения скрипта.
 

Popoff

popoff.donetsk.ua
на каждую сессию открывать свою конекцию
это как?

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

Cloun

Новичок
Popoff
использовать mysql_connect().
Как можно в передалх одной сесии сделать несколько запросов?
Блин, возможно я, как новичек в php, использую не верные термины.
Что я подразумеваю под сессией - когда юзер обращается к серверу в первый раз, у него в кукисах создается некий ID, который потом используется как ID сессии. И php по этому ID связывает запрос с хранящейся у него сессией. Так? Это сессия?
Так же есть еще существует такое понятие как "выполнение скрипта". То есть это обработка одного запроса юзера.

Тык вот коннект, открытый mysql_connect живет пока не закончится выполнение скрипта.
А коннект mysql_pconnect вообще живет, пока timeout не истечет. Так все это?

ЗЫЖ Если есть возможность, стукни мне в асю: 100688230
 

Popoff

popoff.donetsk.ua
Cloun
Почему не возмодно??? Функция mysql_pconnect() при повторном вызове не создает новое соединение, и возращает указатель на уже существующее.
И, насколько мне известно из мануала по php, это соединение распростроняется на все сесии. И не умерает при завершении выполнения скрипта.
это ты почти правильно знаешь.

не понятно только, почему ты говоришь, что
это соединение распростроняется на все сесии
но при этом не говоришь, что это соединение так же не зависит ни от каких куки, ни от каких переменных, переданных из форм, ни от адреса страницы. такое впечатление может сложиться, будто от сессии не зависит, а от каких-нибудь переменных, пришедших из формы - зависит.
 

Cloun

Новичок
Popoff
Да-да, я немного запутолся. Значит есть два варианта:
connect - открытие соединения на одно выполнение скрипта. Один запрос одного юзера - одно соединение. Черевато огромным количеством открытых соединений.
pconnect - открывается только одно соединение и жевет оно живет, пока не помрет (т.е. пока timeout не произойдет).
Так?
Значит при втором варианте у нас может произойти наложение, так?

И еще. Если два разных запроса обрабатываются паралельно. И первый запрос открыл соединение, и потом второй открывает такое же соединение, то вернется новое или уже открытое соединение??? Если второй вариант, то тут тоже может произойти проблема.

И в конце концов, как выстроить в ряд выполнение запросов связанных с редактированием таблиц???
 

Popoff

popoff.donetsk.ua
Cloun
возможно я, как новичек в php
если ты новичек, то используй mysql_connect, мой тебе совет :)

если хочешь узнать, почему - поищи в этом форуме фразу "mysql_pconnect" :)
Andreika
клиент, видимо, думает что "persistent" - это означает, что открылось одно соединение и все через это одно соединение работают :)
ЗЫЖ Если есть возможность, стукни мне в асю: 100688230
Если ты прочтешь внимательно это:
http://phpclub.ru/talk/showthread.php?s=&threadid=28522&rand=1
и в особенности !очень внимательно! это:
http://ln.com.ua/~openxs/articles/smart-questions-ru.html
то поймешь, почему я не захочу стучать тебе в аську для обсуждения подобного вопроса. там об этом прямо сказано.
 

Andreika

"PHP for nubies" reader
For example, if you had 20 different child processes that ran a script that made a persistent connection to your SQL server, you'd have 20 different connections to the SQL server, one from each child.
 

Popoff

popoff.donetsk.ua
Cloun
в поиск :) жду от тебя ссылки на 20 тем, в которых обсуждался этот вопрос с краткими аннотациями, о чем в этих темах говорится. только если после этого ты не найдешь ответ на свой вопрос, то мы сможем продолжить поиск ответа на твой вопрос :)
 

Cloun

Новичок
Popoff
А ты по теме можешь мне ответить? Меня интересует вполне конкретный вопрос - можно ли как-нибудь залость конект?
клиент, видимо, думает что "persistent" - это означает, что открылось одно соединение и все через это одно соединение работают
А ты хочешь сказать, что это не так?
Во-первых, при соединении, функция пытается найти уже открытый (постоянный) указатель на тот же сервер с тем же пользователем и паролем. Если он найден, возвращён функцией будет именно он, вместо открытия нового соединения.

Во-вторых, соединение с SQL-сервером не будет закрыто, когда работа скрипта закончится. Вместо этого, оно останется рабочим для будущего использования (mysql_close() также не закрывает постоянные соединения)
Это цитаты из php_manual скаченного с php.net.
 

Andreika

"PHP for nubies" reader
Cloun
сколько твоих скриптов одновременно может обрабатывать один child апача?
 

Cloun

Новичок
Млин, хрен с этим pconnect. Не удачный пример. Пускай будет fopen(). Меня то интересует другой вопрос. Можно ли залочить ресурс. Например как это делается в C# функцией lock???

-~{}~ 08.10.05 18:58:

Andreika
сколько твоих скриптов одновременно может обрабатывать один child апача?
Не понял? Один поток apache одновременно обрабатывать может только один скрипт.
 

Andreika

"PHP for nubies" reader
flock, Semaphore, Shared Memory and IPC Functions

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

Popoff

popoff.donetsk.ua
Cloun
начинающие программисты от опытных отличаются, кроме всего прочего, еще и тем, что опытные, даже если они не знают, как решается их задача, понимают, что если в их задаче поменять одно любое исходное данное, то вся задача, может оказаться, будет решаться совсем другим способом.

начинающие же считают, что незначительные изменения в исходных данных приведут лишь к незначительным изменениями в методе решения.

Пускай будет fopen().
"пускай будет" означает, что у тебя на самом деле не fopen вовсе, а не пойми что еще. боюсь, помочь тебе никто не сможет.
 

Cloun

Новичок
Бресь Сергей
Спасибо, читаю.
Popoff
А тебе за ссылочки не спасибо. Ибо я их уже читал.
 

Popoff

popoff.donetsk.ua
Cloun
если ты их читал и читал внимательно, то не совсем понятно, почему ты прилюдно попросил меня (или кого бы то ни было еще в этом форуме) постучаться тебе в аську для обсуждения вопроса, который был поднят в этом топике. если ты их уже читал, то можешь прочитать еще раз. но теперь уже с интересом, любовью, и внимательностью. :)
 

Cloun

Новичок
Andreika
Это хороше если так. Я до конца не уверен, что pconnect возращает разные link'и в разных потоках. В мануале ни слова об этом не сказано.
Popoff
Если ты хочешь мне доказать, что я не опытный програмист, то прямая тебе дорога в offTopic.
Вот ты мега опытный такой, подскажи начинающему. На каждый поток apache открывается отдельное соединение с mysql при использовании функции mysql_pconnect, или одно на все???
 
Сверху