Гость
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / PHP межпроцессовое взаимодействие / 25 сообщений из 33, страница 1 из 2
04.06.2017, 16:23
    #39465493
re_qas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
В общем задача:
при вызове скрипта чтобы он максимум в !5 флопов! дал метку что его вызвали другим скриптам... вариант с файл.lock - не попадает (((
$_SESSION - ну вообще...
...
Рейтинг: 0 / 0
05.06.2017, 06:34
    #39465657
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
Чем file.lock не подходит?
Через memcache наверное можно.
...
Рейтинг: 0 / 0
05.06.2017, 08:17
    #39465669
re_qas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
Не успевает (
...
Рейтинг: 0 / 0
05.06.2017, 08:38
    #39465677
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
Не успевает что?
...
Рейтинг: 0 / 0
05.06.2017, 16:50
    #39466079
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
5 флопов - это ж по нынешним меркам что-то около нуля по времени. Учитывая, что интерпретатор PHP делает валидацию перед непосредственно исполнением скрипта, сомневаюсь, что такая схема вообще сработает.

А вызывающий скрипт не может сделать уведомление о запуске заранее? Ну, как вариант, конечно.
...
Рейтинг: 0 / 0
06.06.2017, 07:38
    #39466346
re_qas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
в том то и беда что часть запросов попадает с разницей что-то около нуля... и из-за этого дубли.
HettНе успевает что?не успевает образоваться файл.lock до проверки на него наличия по итогу проскакивают 3-4 дубля...
...
Рейтинг: 0 / 0
06.06.2017, 08:04
    #39466353
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
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
06.06.2017, 08:10
    #39466355
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
re_qasв том то и беда что часть запросов попадает с разницей что-то около нуля... и из-за этого дубли.
HettНе успевает что?не успевает образоваться файл.lock до проверки на него наличия по итогу проскакивают 3-4 дубля...Что-то вы неправильно делаете...
Код: php
1.
$f = @fopen("file.lock","x");

либо файла не было, он создался и вернулся хендл, либо файл был, случилась ошибка создания и вернулся null. Никак не могут два скрипта одновременно создать один и тот же файл.
...
Рейтинг: 0 / 0
06.06.2017, 20:17
    #39467283
re_qas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
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
06.06.2017, 20:20
    #39467285
Hett
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
$file откуда берется?
...
Рейтинг: 0 / 0
06.06.2017, 20:21
    #39467288
re_qas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
ну понятно что $file = 'file.lock' а потом в алге идет fclose($fp) и unlink($file)
...
Рейтинг: 0 / 0
06.06.2017, 20:37
    #39467296
re_qas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
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
06.06.2017, 20:44
    #39467300
re_qas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
хочется заменить на что-то рода
Код: 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
06.06.2017, 20:45
    #39467301
Barlone
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
re_qasя проверяю
Код: php
1.
2.
3.
4.
5.
6.
if (!file_exists('file.lock')) {
$fp = fopen($file, "x");
if ($fp !== false){
....
}
}


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

Исходную задачу опишите подробно. Возможно, найдется какой-то другой способ решения.
...
Рейтинг: 0 / 0
06.06.2017, 20:59
    #39467311
re_qas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
Код: 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
06.06.2017, 21:04
    #39467312
re_qas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
vklere_qas,

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

В каком именно местеre_qasпо итогу проскакивают 3-4 дубля...?
...
Рейтинг: 0 / 0
06.06.2017, 21:16
    #39467319
re_qas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
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
06.06.2017, 21:23
    #39467322
re_qas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
вообще сложилось такое впечатление что 3-4 процесса (условно сервер 8 ядерный, пхп х86) срабатывают абсолютно параллельно
...
Рейтинг: 0 / 0
06.06.2017, 21:24
    #39467323
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
re_qasодна.В смысле, должен произойти единственный запуск скрипта. Параметры запуска один раз вычислили и любая попытка запуска должна использовать именно их. Правильно понимаю?
...
Рейтинг: 0 / 0
06.06.2017, 21:32
    #39467327
vkle
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
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
06.06.2017, 21:34
    #39467329
re_qas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
vklere_qasодна.В смысле, должен произойти единственный запуск скрипта. Параметры запуска один раз вычислили и любая попытка запуска должна использовать именно их. Правильно понимаю?именно этой части идет наличие по uri $bid через пост и проверка дольше только то этому одному параметру... само добавление ветвлится но на другие $bid перепрыгнуть не может - $bid - корень... новый появляется 4-10 раз в 5 минут... раз в 5 минут у всех 1500+ срабатывает запрос на обновление... этот запрос возвращает список $bid, по которому пинается скрипт на добавление по принципу кто первый от того и добавим - остальных нах...
...
Рейтинг: 0 / 0
06.06.2017, 21:39
    #39467330
re_qas
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
PHP межпроцессовое взаимодействие
vkle
Код: php
1.
if(!flock($fp_lock, LOCK_EX | LOCK_NB)) exit;

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


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