powered by simpleCommunicator - 2.0.51     © 2025 Programmizd 02
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP межпроцессовое взаимодействие
33 сообщений из 33, показаны все 2 страниц
PHP межпроцессовое взаимодействие
    #39465493
Фотография re_qas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В общем задача:
при вызове скрипта чтобы он максимум в !5 флопов! дал метку что его вызвали другим скриптам... вариант с файл.lock - не попадает (((
$_SESSION - ну вообще...
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39465657
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чем file.lock не подходит?
Через memcache наверное можно.
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39465669
Фотография re_qas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не успевает (
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39465677
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не успевает что?
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39466079
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
5 флопов - это ж по нынешним меркам что-то около нуля по времени. Учитывая, что интерпретатор PHP делает валидацию перед непосредственно исполнением скрипта, сомневаюсь, что такая схема вообще сработает.

А вызывающий скрипт не может сделать уведомление о запуске заранее? Ну, как вариант, конечно.
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39466346
Фотография re_qas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в том то и беда что часть запросов попадает с разницей что-то около нуля... и из-за этого дубли.
HettНе успевает что?не успевает образоваться файл.lock до проверки на него наличия по итогу проскакивают 3-4 дубля...
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39466353
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
http://php.net/manual/ru/memcache.add.php

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
try {
    if ($memcache->add('key') !== false) {
        // synced block
    } else {
        // lock already acquired
    }
} finally {
    $memcache->remove('key');
}
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39466355
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
re_qasв том то и беда что часть запросов попадает с разницей что-то около нуля... и из-за этого дубли.
HettНе успевает что?не успевает образоваться файл.lock до проверки на него наличия по итогу проскакивают 3-4 дубля...Что-то вы неправильно делаете...
Код: php
1.
$f = @fopen("file.lock","x");

либо файла не было, он создался и вернулся хендл, либо файл был, случилась ошибка создания и вернулся null. Никак не могут два скрипта одновременно создать один и тот же файл.
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467283
Фотография re_qas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Barlonere_qasв том то и беда что часть запросов попадает с разницей что-то около нуля... и из-за этого дубли.
пропущено...
не успевает образоваться файл.lock до проверки на него наличия по итогу проскакивают 3-4 дубля...Что-то вы неправильно делаете...
Код: php
1.
$f = @fopen("file.lock","x");

либо файла не было, он создался и вернулся хендл, либо файл был, случилась ошибка создания и вернулся null. Никак не могут два скрипта одновременно создать один и тот же файл.я проверяю
Код: php
1.
2.
3.
4.
5.
6.
if (!file_exists('file.lock')) {
$fp = fopen($file, "x");
if ($fp !== false){
....
}
}


и умудряются лезть дубли
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467285
Фотография Hett
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
$file откуда берется?
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467288
Фотография re_qas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ну понятно что $file = 'file.lock' а потом в алге идет fclose($fp) и unlink($file)
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467296
Фотография re_qas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
re_qasну понятно что $file = 'file.lock' а потом в алге идет fclose($fp) и unlink($file) точнее
Код: php
1.
$file = __DIR__.'/files/lock_'.($bid = (int)(trim($req->post('bid')))).'lock';


и дальше именно по этому $bid идет запрос на то что нужно добавить, если по $bid возвращается false то естественно не то... ну и в логах по три-четыре раза реально int и 1=1
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467300
Фотография re_qas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
хочется заменить на что-то рода
Код: php
1.
2.
3.
4.
5.
if (!isset($_SESSION['lock_'.$bid])||($_SESSION['lock_'.$bid] == false)){
$_SESSION['lock_'.$bid] = true;
...
unset($_SESSION['lock_'.$bid]);
}


но соответственно сессии разные (((
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467301
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
re_qasя проверяю
Код: php
1.
2.
3.
4.
5.
6.
if (!file_exists('file.lock')) {
$fp = fopen($file, "x");
if ($fp !== false){
....
}
}


и умудряются лезть дублиНе может быть такого дикого бага в РНР, это бы давно заметили...
Полностью код покажите.
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467302
Barlone
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Кстати, тут у вас проверяется один файл, а создается другой...
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467305
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
re_qas,

Исходную задачу опишите подробно. Возможно, найдется какой-то другой способ решения.
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467311
Фотография re_qas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
// начало подгрузки двига cmf и конфигов  (даже не в классе, на данный момент через ифы и файловой структурой, как оказалось на 30% места в оперативке занимает)
$file = __DIR__.'/files/lock_'.($bid = (int)(trim($req->post('bid')))).'.lock';
... //пару обработчиков не связанных с проверками...
if (!file_exists(($file)) {
$fp = fopen($file, "x");
if ($fp !== false){
.... // код переброса с апи в бд с апи берется именно по $bid - $api->get(array('id'=>$bid,'id'))
fclose($fp);
unlink($file);
}else{
...
}
}else{
...
}
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467312
Фотография re_qas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vklere_qas,

Исходную задачу опишите подробно. Возможно, найдется какой-то другой способ решения.при активной сессии организовать автодобавление через апи с сайта А на сайт Б новых данных. ограничения: активная сессия должна быть к двум сайтам (крон отпадает), ограничение авторизации именно апи... второй нюанс активных сессий - 1500 +/-... период обновления - раз в 5 минут...
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467314
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
re_qasактивных сессий - 1500 +/-... период обновления - раз в 5 минут...Вот тут не вполне понятно. Обновлялка одна на все сессии или же у каждой сессии своя (вроде, отдельный запуск скрипта с определенными параметрами)?

В каком именно местеre_qasпо итогу проскакивают 3-4 дубля...?
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467319
Фотография re_qas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkleВ каком именно местеre_qasпо итогу проскакивают 3-4 дубля...?
именно при пробросе с апи в бд...

vklere_qasактивных сессий - 1500 +/-... период обновления - раз в 5 минут...Вот тут не вполне понятно. Обновлялка одна на все сессии или же у каждой сессии своя (вроде, отдельный запуск скрипта с определенными параметрами)? одна. параметры для обновления различаются только при инициализации cmf при инициализации авторизации сервер-сервер по апи, дальше только $bid при этом в части обработки есть проверка
Код: php
1.
if ($this->bd->get('table')->where('bid'=>$bid)->get() !==false){...}
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467322
Фотография re_qas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
вообще сложилось такое впечатление что 3-4 процесса (условно сервер 8 ядерный, пхп х86) срабатывают абсолютно параллельно
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467323
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
re_qasодна.В смысле, должен произойти единственный запуск скрипта. Параметры запуска один раз вычислили и любая попытка запуска должна использовать именно их. Правильно понимаю?
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467327
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
re_qasвообще сложилось такое впечатление что 3-4 процесса (условно сервер 8 ядерный, пхп х86) срабатывают абсолютно параллельноСам по себе PHP однопоточный. Пока не запустишь отдельный процесс (форком или внешним скриптом запуска), не будет ничего параллельного. Конечно, есть вариант, когда при нескольких конкурирующих попытках запуска требуется обеспечить гарантировано один экземпляр запущенного скрипта. Тогда обычно использую такую пару строк:
Код: php
1.
2.
$fp_lock = fopen(__FILE__, 'r+');
if(!flock($fp_lock, LOCK_EX | LOCK_NB)) exit;

У меня с этих строк по крону стартуют относительно долгоиграющие скрипты когда заранее невозможно определить предполагаемую продолжительность работы скрипта.
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467329
Фотография re_qas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vklere_qasодна.В смысле, должен произойти единственный запуск скрипта. Параметры запуска один раз вычислили и любая попытка запуска должна использовать именно их. Правильно понимаю?именно этой части идет наличие по uri $bid через пост и проверка дольше только то этому одному параметру... само добавление ветвлится но на другие $bid перепрыгнуть не может - $bid - корень... новый появляется 4-10 раз в 5 минут... раз в 5 минут у всех 1500+ срабатывает запрос на обновление... этот запрос возвращает список $bid, по которому пинается скрипт на добавление по принципу кто первый от того и добавим - остальных нах...
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467330
Фотография re_qas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vkle
Код: php
1.
if(!flock($fp_lock, LOCK_EX | LOCK_NB)) exit;

по логике должен сработать аналогично fopen(..,'x') если есть вернет false....
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467335
Фотография re_qas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а если стоит raid-storage-claster то не может быть проблема в том что мой файловый разбит на несколько сервов?
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467338
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
re_qasvkle
Код: php
1.
if(!flock($fp_lock, LOCK_EX | LOCK_NB)) exit;


по логике должен сработать аналогично fopen(..,'x') если есть вернет false....Ну так fopen там (в первой строчке) и используется, только ориентирован он не на относительно медленное создание нового файла в ФС, а на обращение к уже существующему и прочитанному с диска (хранящемуся в файловом буфере) файлу. В этом смысле область такого использования несколько ограничена. Если правильно понимаю внутреннюю кухню PHP, в данном случае flock лишь вызывает системную функцию блокировки файла.
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467341
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
re_qasа если стоит raid-storage-claster то не может быть проблема в том что мой файловый разбит на несколько сервов?Полагаю, если каталог или цепочку каталогов, где создается файл, требуется читать с диска - возможно, это будет долгим процессом. Если каталог не вымывается из буфера ФС - вряд ли.
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467345
Фотография re_qas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vklere_qasпропущено...
по логике должен сработать аналогично fopen(..,'x') если есть вернет false....Ну так fopen там (в первой строчке) и используется, только ориентирован он не на относительно медленное создание нового файла в ФС, а на обращение к уже существующему и прочитанному с диска (хранящемуся в файловом буфере) файлу. В этом смысле область такого использования несколько ограничена. Если правильно понимаю внутреннюю кухню PHP, в данном случае flock лишь вызывает системную функцию блокировки файла.нет... тут именно проверка "r+"... т.е. лишнее телодвижение процессора в части открыть и потом заблокировать, 'x' сразу именно создает, и если файл уже есть - ошибка...
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467348
Фотография re_qas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
vklere_qasа если стоит raid-storage-claster то не может быть проблема в том что мой файловый разбит на несколько сервов?Полагаю, если каталог или цепочку каталогов, где создается файл, требуется читать с диска - возможно, это будет долгим процессом. Если каталог не вымывается из буфера ФС - вряд ли.попинаю завтра админа проверить где моя часть массива сидит... межсерверовая пинговка <1ms но если с запросом по файлу... то реально может быть косяк...
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467353
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
re_qasvkleпропущено...
В смысле, должен произойти единственный запуск скрипта. Параметры запуска один раз вычислили и любая попытка запуска должна использовать именно их. Правильно понимаю?именно этой части идет наличие по uri $bid через пост и проверка дольше только то этому одному параметру... само добавление ветвлится но на другие $bid перепрыгнуть не может - $bid - корень... новый появляется 4-10 раз в 5 минут... раз в 5 минут у всех 1500+ срабатывает запрос на обновление... этот запрос возвращает список $bid, по которому пинается скрипт на добавление по принципу кто первый от того и добавим - остальных нах...

Возможно, я бы сделал как-то так. Обозначу основные моменты.

1. Запуск единственного экземпляра основного скрипта. По крону или другим образом - не суть важно.
2. Там бесконечный цикл с проверкой нового $bid и sleep порядка нескольких десятков секунд исходя из условия "новый появляется 4-10 раз в 5 минут". Если проверка наличия нового не сильно ресурсожруча - можно и почаще проверять.
3. Если найден новый $bid - переходим в ветвь добавления/обновления.

Если само по себе обновление окажется процессом слишком длительным и не укладывается в приемлемое время - тогда, вероятно, сделал бы форк скрипта или (более вероятно) системный вызов с запуском скрипта добавления без ожидания завершения. Но тут надо дополнительно контролировать количество дочерних процессов, чтоб выше крыши не наплодить, так как без контроля в случае перегрузки сервера Load Average будет расти лавинообразно (процессы не успевают отрабатывать). Да, и у форка есть куча неожиданных и, порою, не совсем приятных особенностей.

Как-то вот в такую сторону стал бы смотреть.
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467355
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
re_qasпроверка "r+"... т.е. лишнее телодвижение процессора в части открыть и потом заблокировать,А вот и не угадали. :-)
Ибо сам __FILE__ (этот самый файл скрипта, который содержит эту строчку кода) в момент исполнения скрипта уже "открыт" - прочитан с диска и загружен в оперативную память совсем недавно. И, наверняка, сам файл или указатель на него ещё не был удален из буфера. Остается только сделать попытку исключительной блокировки.
...
Рейтинг: 0 / 0
PHP межпроцессовое взаимодействие
    #39467365
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
re_qasvkleпропущено...
Полагаю, если каталог или цепочку каталогов, где создается файл, требуется читать с диска - возможно, это будет долгим процессом. Если каталог не вымывается из буфера ФС - вряд ли.попинаю завтра админа проверить где моя часть массива сидит... межсерверовая пинговка <1ms но если с запросом по файлу... то реально может быть косяк...Пингу (ICMP пакету) не требуется шкрябать головками дисков, так что, это совсем не показатель.

Заодно, чтоб два раза не бегать, поинтересуйтесь у админа о наличии на сервере локальной файловой системы типа memory и возможности доступа скрипта к ней. Нередко бывают какие-нибудь tmpfs с такой организацией размещения. Если файл блокировки делать там, оно, скорее всего, будет работать существенно быстрее.
...
Рейтинг: 0 / 0
33 сообщений из 33, показаны все 2 страниц
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP межпроцессовое взаимодействие
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]