powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Экстренное завершение скрипта и запрещение переходов.
10 сообщений из 35, страница 2 из 2
Экстренное завершение скрипта и запрещение переходов.
    #37854024
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Пожалуй, дополню и поясню. Способ, что выше предложил, одновременно и простой и дурацкий.

Простой - потому что эффективен для поставленной задачи и укладывается в десяток строк кода.

Дурацкий - потому что пользователю будет тупо выдаваться отлуп, и этот самый пользователь, тыкаясь на сервер в надежде найти "окно", будет злиться на Вас все больше с каждым неудачным тычком. Таким образом, способ можно признать годным лишь при почти полном отсутствии конкуренции пользователей. Вроде защиты от случайных ошибок.

При сколько-нибудь заметной конкуренции следует строить очередь в БД, а скрипт-обработчик очереди запускать по крону. Он (скрипт-обработчик) должен брать из БД задание, обрабатывать, и складывать куда-то результат (в базу или в файлы), делая в базе пометку о начале выполнения и завершении задания. Таким образом, пользователю достаточно будет просто один раз "оставить заявку", а потом наведываться либо за получением статуса [в очереди | выполняется], либо за готовым результатом. Так что, по-хорошему, от кардинального пересмотра алгоритма Вам не уйти.
...
Рейтинг: 0 / 0
Экстренное завершение скрипта и запрещение переходов.
    #37854038
Atlina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
<?php

$fp = fopen("lock.txt", "r+");

if (flock($fp, LOCK_EX)) { // выполняем эксклюзивную блокировку
      /*
* test.php
*/
error_reporting(0);
set_time_limit(60);  // заменить на нужное

$path = 'sdfkjh/';  // что-нибудь рандомное

// $lifetime задает время, в течение которого скрипт считается занятым.
$lifetime = 1*60; // 15 минут, заменить на нужное

$ip = isset($_SERVER['REMOTE_ADDR']) ? $_SERVER['REMOTE_ADDR'] : ((isset($_ENV['REMOTE_ADDR'])) ? $_ENV['REMOTE_ADDR'] : getenv('REMOTE_ADDR'));
$filename = $path . md5($ip) . '.txt';

if (file_exists($filename))
{
	if (time() - filemtime($filename) > $lifetime)
		@unlink($filename);
	else
	{
		echo 'Облом...';
		exit;
	}
}

$fp = fopen($filename, 'w');
if ($fp)
{
	while (!flock($fp, LOCK_EX))
		sleep(1);
	fwrite($fp, $ip);
	fflush($fp);
	flock($fp, LOCK_UN);
	fclose($fp);
}
else
{
    echo 'Ошибка...';
    exit;
}

echo "Работаю...";
ob_flush();
flush();

/*
* Выполнение скрипта продолжается до самого конца, даже если пользователь закроет страницу.
* Только НЕ НАДО ничего выводить, никаких там echo или print после flush() !!!
*/
sleep(30);
/* ... */
if (file_exists($filename))
    unlink($filename);
    flock($fp, LOCK_UN); // отпираем файл
} else {
    echo "Не удалось получить блокировку !";
}

fclose($fp);

?>



Попросила друга зайти вместе со мной, так оно и друга обработало и меня. Обоим написало "Работаю...".
...
Рейтинг: 0 / 0
Экстренное завершение скрипта и запрещение переходов.
    #37854040
Atlina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle , ну как бы очереди большой не будет, я думала сделать так: Пользователь нажимает кнопку, крутится окошко бразуера ( пользователя это устроит ), он ждет свое время и тогда получает результат. Все вроде просто.
...
Рейтинг: 0 / 0
Экстренное завершение скрипта и запрещение переходов.
    #37854053
phpz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AtlinaПопросила друга зайти вместе со мной, так оно и друга обработало и меня. Обоим написало "Работаю...".

Все правильно, т.к. у вас и у друга разные айпи-адреса (см. 12772943 ).

Если вы хотите, чтобы не было доступа никому до тех пор, пока скрипт не отработает до конца, то запираете файл с уникальным именем для целевой задачи и не отпускаете его. Проверка $lifetime обязательна, чтобы не получилось так, что файл вообще никогда не удалится.
...
Рейтинг: 0 / 0
Экстренное завершение скрипта и запрещение переходов.
    #37854060
Atlina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
phpz, можно хоть чуть примеров? А то почти не имею понятия о чем Вы.
...
Рейтинг: 0 / 0
Экстренное завершение скрипта и запрещение переходов.
    #37854066
vkle
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
phpz,

Причем тут различные адреса? Блокировка ставится до проверки айпи.



Atlina,

Файл lock.txt с указателем $fp в начале лочим, в конце отпираем. Нафига с этим указателем производить какие-то действия в середине?

Поменьше копипасты, побольше осмысленности в коде. Не бойтесь писать ручками и думать над тем, что пишите. Давайте переменным однозначно понятные имена, вроде $fp_lock, $fp_result. В это трудно поверить, но вероятность путаницы упадет на пару порядков
...
Рейтинг: 0 / 0
Экстренное завершение скрипта и запрещение переходов.
    #37854084
Atlina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
vkle, я просто думала модифицировать ранние написаный код, то есть там для одного пользователя, а мне сделать так для всех по очереди. Сейчас попробую без излишек. =)
...
Рейтинг: 0 / 0
Экстренное завершение скрипта и запрещение переходов.
    #37854107
Atlina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Испытываю этот код:

Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
<?php

$fp = fopen("lock.txt", "r+");

if (flock($fp, LOCK_EX)) { // выполняем эксклюзивную блокировку
    
	sleep(10);
	
	echo "Ok!";

    flock($fp, LOCK_UN); // отпираем файл
} else {
    echo "Не удалось получить блокировку !";
}

fclose($fp);

?>



Опять же таки с двух разных ip я и мой друг смогли войти. Такое впечатление что скрипту наплевать на ограничения файла и т.п. Возможно ли сразу выводить ошибку, то есть как только человек вошел, сразу проверяется заблокирован ли файл и тогда скрипт или завершается, или продолжает работать?
...
Рейтинг: 0 / 0
Экстренное завершение скрипта и запрещение переходов.
    #37854109
phpz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AtlinaСейчас попробую без излишек. =)
Вот без всяких излишек. Отказывает в доступе, если файл залочен и не устарел:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
<?php
error_reporting(0);
set_time_limit(90);

$lifetime = 1*60;

$flock_name = "lock.txt";
if (file_exists($flock_name))
{
	if (time() - filemtime($flock_name) > $lifetime)
		@unlink($flock_name);
	else
	{
		echo "Занят...";
		exit;
	}
}

if ($fp = fopen($flock_name, "w"))
{
	if (flock($fp, LOCK_EX))
	{
		echo "Работаю...";
		ob_flush();
		flush();
		/* ... */
		sleep(45);
		flock($fp, LOCK_UN);
		fclose($fp);
		@unlink($flock_name);
	}
	else
	{
		echo "Ошибка...";
		fclose($fp);
	}
}
?>
...
Рейтинг: 0 / 0
Экстренное завершение скрипта и запрещение переходов.
    #37854115
phpz
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
phpz,

Точнее, если файл существует , залочен и не устарел :)
...
Рейтинг: 0 / 0
10 сообщений из 35, страница 2 из 2
Форумы / PHP, Perl, Python [игнор отключен] [закрыт для гостей] / Экстренное завершение скрипта и запрещение переходов.
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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