|
|
|
| Первый скрипт имеет такой код:
<?php
$adr = "stop.txt" ;
$file = fopen($adr, "w"); // открываем файл для перезаписи
fputs($file, ""); // записываем
fclose ($file); // закрываем файл
for ($i=1; $i <= 1000000; $i++)
{
echo "<br> $i ";
$stop = file_get_contents($adr);
if ($stop == "stop") break;
}
echo "<br><br><br> $i ";
|
После миллиона циклов скрипт остановится и выведет на дисплей результат сразу всей своей работы, до того находившийся в буфере.
И есть второй скрипт
<?php
$adr = "stop.txt" ;
if(!file_exists($adr)) fclose(fopen($adr, "a+t")); // Создаём файл если он не существует
$f=fopen($adr, "r+t") ; // Открываем файл для чтения и записи в режиме r+t
flock($f, LOCK_EX); // Блокируем файл эксклюзивно
$filesize = (filesize ($adr) +10); // Длина файла в байтах плюс запас
$text = fread($f, $filesize); // Чтение содержимого файла
$text = "stop"; // Операция с текстом (или с числом)
// Сохраняем информацию
ftruncate($f,0); // очищаем файл
rewind ($f); // переводим указатель в начало файла
fwrite($f,$text); // записываем новое значение
flock($f, LOCK_UN); // отпираем файл
fclose($f); // закрываем файл
|
Как я полагал, второй скрипт, вызванный во время работы первого скрипта, сделает такую запись в файл stop.txt, что в первом скрипте цикл прервется.
В реале этого, конечно же, не получилось: второй скрипт становится в очередь на обслуживание процессором и исполняется лишь тогда, когда закончит свою работу первый скрипт.
Можно ли дать второму скрипту приоритет на исполнение? | |
|
|
|
|
|
|
|
для: Владимир55
(15.10.2009 в 23:27)
| | и из другого браузера тоже? | |
|
|
|
|
|
|
|
для: Trianon
(15.10.2009 в 23:32)
| | Да, два независимых браузера - каждый для своего скрипта. Прервать работу первого скрипта не удается. Хотя в текстовом файле уже есть стоп-слово (блокотом вижу), первый скрипт продолжает работу. И потом выводится сообщение 1000001
Эксперимент на Денвере. | |
|
|
|
|
|
|
|
для: Владимир55
(15.10.2009 в 23:34)
| | Денвер не сервис - в прямом смысле. Апач у него как приложение запущен. | |
|
|
|
|
|
|
|
для: Trianon
(15.10.2009 в 23:38)
| | Программа, для которой мне нужно отладить прерывание, будет использоваться только на Денвере.
Это делает задачу неразрешимой? | |
|
|
|
|
|
|
|
для: Владимир55
(15.10.2009 в 23:41)
| | не стану утверждать.
экспериментировать надо. | |
|
|
|
|
|
|
|
для: Trianon
(15.10.2009 в 23:50)
| | Что же именно следует подвергнуть эксперименту?
Совместную работу двух описанных скриптов я опробовал и результаты описал. Есть ли какие-то иные подходы? | |
|
|
|
|
|
|
|
для: Владимир55
(15.10.2009 в 23:54)
| | А синхронизироваться именно через файл - обязательное условие?
Раз денвер - значит есть БД. Не проще тогда через INSERT / SELECT остановиться? | |
|
|
|
|
|
|
|
для: Trianon
(16.10.2009 в 00:12)
| | Для синхронизации любой способ сгодится. Я хотел через сессии - не получилось по той же причине, что и через файл. А чем база данных отличается? Если второй скрипт не запускается до завершения работы первого скрипта, то уже и неважно, какой код у второго скрипта. Ведь так?
Вот если бы был способ управлять приоритетом исполнения!
Или через рнр вызывать прерывание и как-то обрабатывать его вектор... | |
|
|
|
|
|
|
|
для: Владимир55
(16.10.2009 в 00:36)
| | Вы сказали, что слово в файле появляется - значит второй (останавливающий) процесс запускается и исполняется. | |
|
|
|
|
|
|
|
для: Trianon
(16.10.2009 в 00:41)
| | Получается, что неправильно я написал. Второй скрипт - он ведь должен исполняться мгновенно. А он висит долго, пока первый не закончит работу.
Или еще так.
Первый скрипт запускаю (а второй нет). И потом блокнотом делаю стоп-файл. Первый скрипт останавливается и выводится какое-нибудь промежуточное число, меньшее лимона. | |
|
|
|
|
|
|
|
для: Владимир55
(16.10.2009 в 00:55)
| | Как ни странно, у меня всё это отработало без изменений...
Если не считать это:
<?php
$adr = "stop.txt" ;
$file = fopen($adr, "w"); // открываем файл для перезаписи
fputs($file, ""); // записываем
fclose ($file); // закрываем файл
for ($i=1; $i <= 1000000; $i++)
{
$stop = file_get_contents($adr);
if ($stop == "stop") break;
}
echo $i;
|
| |
|
|
|
|
|
|
|
для: Николай2357
(16.10.2009 в 01:00)
| | Как это понимать:
"Если не считать это:" ? | |
|
|
|
|
|
|
|
для: Владимир55
(16.10.2009 в 01:05)
| | >Как это понимать:
"Если не считать это:" ?
да никак... счетчик больно уж веселый был. А скрипт работает на денвере у меня. Хотел тоже поискать в чем затык, так нечего искать то... | |
|
|
|
|
|
|
|
для: Владимир55
(16.10.2009 в 00:55)
| | Еще можно попробовать покрутить значение настройки MaxRequestsPerChild в файле
Z:\usr\local\apache\conf\httpd.conf | |
|
|
|
|
|
|
|
для: Trianon
(16.10.2009 в 01:12)
| | Покручу.
А еще такая идея - если создавать стоп-файл не средствами рнр, а скриптом JS?
К сожалению, я не знаю, как написать код создания такого текстового файла. Это сложно? | |
|
|
|
|
|
|
|
для: Владимир55
(16.10.2009 в 01:23)
| | Это возможно.
<script>
var fso = new ActiveXObject("Scripting.FileSystemObject");
var a = fso.CreateTextFile("c:\\testfile.txt", true);
a.WriteLine("This is a test.");
a.Close();
</script>
|
Как видите, используется activex. Поэтому работает только в IE. | |
|
|
|
|
|
|
|
для: Саня
(16.10.2009 в 10:24)
| | Попробовал с ИЕ.
Потребовала надстройку - установил. Разрешил запуск activex
Но на при работе на Денвере получаю сообщение:
Сведения об ошибке на веб-странице
Агент пользователя: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.1; Trident/4.0; Pivim Multibar; .NET CLR 1.1.4322; .NET CLR 2.0.50727; InfoPath.1; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)
штамп времени: Fri, 16 Oct 2009 09:07:44 UTC
Сообщение: Невозможно создание объекта сервером программирования объектов
Строка: 10
Символ: 1
Код: 0
URI-код: http://sin/2.php
Строка 10 содержит "<script>".
Однако на рабочем столе, а также на диске С скрипт работает! Вопреки всем мрачным прогнозам!
Осталось только как-то "уговорить" его выполнить свои функции на Денвере. Как бы это сделать? | |
|
|
|