Блокирование повторного запуска php скрипта.

phpize

Новичок
Блокирование повторного запуска php скрипта.

Как блокировать повторный запуска php скрипта если он уже выполняется.
Причем повторный запуск не должен ждать пока предыдущий закончится.
Нужно просто сразу завершить повторное выполнение..

Win XP, апач 2.2, php как модуль.

Делаю так:

Вначале выполнения (первый запуск) если нет файла lock.txt - создаю его.
В конце выполнения lock.txt удаляю.

Если скрипт запустили второй раз(пока еще первый запуск не закончился)
то lock.txt существует и надо просто выйти.

Проблема в том что второй запуск как бы ждет пока первый закончится
и выполняется. А мне нужно чтоб он не ждал и сразу вышел.

Как это правильно сделать.
Спасибо.
 

nibble

Новичок
<?
if (file_exists('lock.txt')) die();
file_put_contents('lock.txt', 'LOCKED');
// Your code here
unlink('lock.txt');
?>
 

FedulovIvan

Новичок
А нафига создавать файл отдельный? Не проще так:
PHP:
<?php
session_start();
if(isset($_SESSION['lock_flag'])) {
    exit();
}
$_SESSION['lock_flag'] = true;
// куча полезных действий
// куча полезных действий
// куча полезных действий
unset( $_SESSION['lock_flag'] );
?>
 

dimagolov

Новичок
FedulovIvan, иногда лучше жевать, чем говорить. почитай ман на ф-ю, что я дал.
 

FedulovIvan

Новичок
Димаголов, типа одна эта функция решение всей проблемы? = )
В мане про функцию написано что она нужна для завершения работы с сессией ДО завершения работы скрипта. Дабы в сессию могли писать другие скрипты. При повторном запуске этого скрипта разве потребуеться запись в сессию?
 

dimagolov

Новичок
FedulovIvan, слушай, вот возьми скрипт
PHP:
<?php
session_start();
echo "Start...";
sleep(20);
echo "End";
и открой его в двух окошках одновременно. расскажешь о результатах и может начнешь думать головой.

-~{}~ 19.11.09 17:07:

кстати, перечитал ман. там же просто специально для тебя и для ТС сказано:
..., but as session data is locked to prevent concurrent writes only one script may operate on a session at any time. When using framesets together with sessions you will experience the frames loading one by one due to this locking.
это вторая половина первого и второе предложения, неужели так сложно было осилить 3 строчки текста?
 

FedulovIvan

Новичок
>>Session write is locked
А где написано что сессия блокируется и на чтение, умник!?
Чесно - не разу не сталкивался. Надо проверить.

Зы. И, димаголов, права гнать на пустом месте вроде тебе не давали?
 

dimagolov

Новичок
А где написано что сессия блокируется и на чтение
в мануале :) ну выделю для тебя специально нужную часть из уже сделанной цитаты:
only one script may operate on a session at any time
учитывая то, что session_start открывает сессионный файл именно для записи, то понять что именно блокирует файл можно было уже давно...

ну и там дальше как бы написано что позволяет делать session_write_close
 

phpize

Новичок
Вобщем, разрулил я ето дело.
Проблема была вот в чем.

Запускаю скрипт в 1-й вкладке firefox-a.
Скрипт начинает выполняться.

Запускаю этот же скрипт(url) во 2-й вкладке firefox-a.
(первый запуск еще выполняется)
Второй запуск скрипта начинает выполняться.

Так вот. Firefox для второй вкладки видит что уже этот самый url не закончился в первой и ждет пока он закончится для первой вкладки и потом сразу выполняется во второй вкладке.
Также работает и Хром.

А вот IE и Opera не ждут этого.

Теперь я создаю 2 lock-файла lock.start lock.finish
в которы записываю timestamp
Ну и соотв. задаю минимальну паузу между запусками в конфиге.
 

phpize

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

varan

Б̈́̈̽ͮͣ̈Л̩̲̮̻̤̹͓ДͦЖ̯̙̭̥̑͆А͇̠̱͓͇̾ͨД͙͈̰̳͈͛ͅ
тогда пусть твоя страница делает пост запрос, тогда не будет кешироваться.
А зачем через браузер запускать такие вещи? Может лучше из консоли?
 

grigori

( ͡° ͜ʖ ͡°)
Команда форума
phpize
Fx делает 2 запроса по одному адресу и 2й не ждет окончания 1го
скорее всего у тебя сессия
 

autosoft

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

Решил так:

Файл robot.sh

PHP:
#!/bin/sh
if [ ! -f /www/mail_robot/.lock ]
    then
        (/usr/local/php/bin/php /www/mail_robot/robot.php)
        rm -f /www/mail_robot/.lock
fi
Естественно в robot.php создается файл .lock

Но вот удалять .lock в этом же файле не всегда может быть корректным.
Например .lock никогда не удалиться если php исчерпает max_execution_time или просто запершится раньше по exit(...).

Вообщем адаптируйте robot.sh для win, если нужно.
 

phpize

Новичок
Автор оригинала: grigori
Fx делает 2 запроса по одному адресу и 2й не ждет окончания 1го
скорее всего у тебя сессия
2й запрос как раз ждет выполнения 1го.
Сессии нет.

-~{}~ 21.11.09 18:54:

Автор оригинала: varan
тогда пусть твоя страница делает пост запрос, тогда не будет кешироваться.
А зачем через браузер запускать такие вещи? Может лучше из консоли?
Да будет из консоли.
Но иногда надо будет и из броузера через админку.
 
Сверху