Форум: Форум PHPФорум ApacheФорум Регулярные ВыраженияФорум MySQLHTML+CSS+JavaScriptФорум FlashРазное
Новые темы: 0000000
PHP 5/6. В подлиннике. Авторы: Кузнецов М.В., Симдянов И.В. Программирование. Ступени успешной карьеры. Авторы: Кузнецов М.В., Симдянов И.В. PHP. Практика создания Web-сайтов (второе издание). Авторы: Кузнецов М.В., Симдянов И.В. C++. Мастер-класс в задачах и примерах. Авторы: Кузнецов М.В., Симдянов И.В. PHP на примерах (2 издание). Авторы: Кузнецов М.В., Симдянов И.В.
ВСЕ НАШИ КНИГИ
Консультационный центр SoftTime

Форум PHP

Выбрать другой форум

 

Здравствуйте, Посетитель!

вид форума:
Линейный форум Структурный форум

тема: Как одним скриптом вмешаться в работу другого?
 
 автор: Владимир55   (15.10.2009 в 23:27)   письмо автору
 
 

Первый скрипт имеет такой код:

<?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($fLOCK_EX);                 // Блокируем файл эксклюзивно
    
$filesize = (filesize ($adr) +10);    // Длина файла в байтах плюс запас

    
$text fread($f$filesize);      // Чтение содержимого файла
    
$text "stop";                 // Операция с текстом (или с числом)


    // Сохраняем информацию
    
ftruncate($f,0);                // очищаем файл
    
rewind ($f);                    // переводим указатель в начало файла
    
fwrite($f,$text);                // записываем новое значение
    
flock($fLOCK_UN);             // отпираем файл
    
fclose($f);                        // закрываем файл


Как я полагал, второй скрипт, вызванный во время работы первого скрипта, сделает такую запись в файл stop.txt, что в первом скрипте цикл прервется.

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

Можно ли дать второму скрипту приоритет на исполнение?

  Ответить  
 
 автор: Trianon   (15.10.2009 в 23:32)   письмо автору
 
   для: Владимир55   (15.10.2009 в 23:27)
 

и из другого браузера тоже?

  Ответить  
 
 автор: Владимир55   (15.10.2009 в 23:34)   письмо автору
 
   для: Trianon   (15.10.2009 в 23:32)
 

Да, два независимых браузера - каждый для своего скрипта. Прервать работу первого скрипта не удается. Хотя в текстовом файле уже есть стоп-слово (блокотом вижу), первый скрипт продолжает работу. И потом выводится сообщение 1000001

Эксперимент на Денвере.

  Ответить  
 
 автор: Trianon   (15.10.2009 в 23:38)   письмо автору
 
   для: Владимир55   (15.10.2009 в 23:34)
 

Денвер не сервис - в прямом смысле. Апач у него как приложение запущен.

  Ответить  
 
 автор: Владимир55   (15.10.2009 в 23:41)   письмо автору
 
   для: Trianon   (15.10.2009 в 23:38)
 

Программа, для которой мне нужно отладить прерывание, будет использоваться только на Денвере.

Это делает задачу неразрешимой?

  Ответить  
 
 автор: Trianon   (15.10.2009 в 23:50)   письмо автору
 
   для: Владимир55   (15.10.2009 в 23:41)
 

не стану утверждать.
экспериментировать надо.

  Ответить  
 
 автор: Владимир55   (15.10.2009 в 23:54)   письмо автору
 
   для: Trianon   (15.10.2009 в 23:50)
 

Что же именно следует подвергнуть эксперименту?

Совместную работу двух описанных скриптов я опробовал и результаты описал. Есть ли какие-то иные подходы?

  Ответить  
 
 автор: Trianon   (16.10.2009 в 00:12)   письмо автору
 
   для: Владимир55   (15.10.2009 в 23:54)
 

А синхронизироваться именно через файл - обязательное условие?
Раз денвер - значит есть БД. Не проще тогда через INSERT / SELECT остановиться?

  Ответить  
 
 автор: Владимир55   (16.10.2009 в 00:36)   письмо автору
 
   для: Trianon   (16.10.2009 в 00:12)
 

Для синхронизации любой способ сгодится. Я хотел через сессии - не получилось по той же причине, что и через файл. А чем база данных отличается? Если второй скрипт не запускается до завершения работы первого скрипта, то уже и неважно, какой код у второго скрипта. Ведь так?

Вот если бы был способ управлять приоритетом исполнения!
Или через рнр вызывать прерывание и как-то обрабатывать его вектор...

  Ответить  
 
 автор: Trianon   (16.10.2009 в 00:41)   письмо автору
 
   для: Владимир55   (16.10.2009 в 00:36)
 

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

  Ответить  
 
 автор: Владимир55   (16.10.2009 в 00:55)   письмо автору
 
   для: Trianon   (16.10.2009 в 00:41)
 

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

Или еще так.

Первый скрипт запускаю (а второй нет). И потом блокнотом делаю стоп-файл. Первый скрипт останавливается и выводится какое-нибудь промежуточное число, меньшее лимона.

  Ответить  
 
 автор: Николай2357   (16.10.2009 в 01:00)   письмо автору
 
   для: Владимир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;

  Ответить  
 
 автор: Владимир55   (16.10.2009 в 01:05)   письмо автору
 
   для: Николай2357   (16.10.2009 в 01:00)
 

Как это понимать:
"Если не считать это:" ?

  Ответить  
 
 автор: Николай2357   (16.10.2009 в 01:50)   письмо автору
 
   для: Владимир55   (16.10.2009 в 01:05)
 

>Как это понимать:
"Если не считать это:" ?

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

  Ответить  
 
 автор: Trianon   (16.10.2009 в 01:12)   письмо автору
 
   для: Владимир55   (16.10.2009 в 00:55)
 

Еще можно попробовать покрутить значение настройки MaxRequestsPerChild в файле
Z:\usr\local\apache\conf\httpd.conf

  Ответить  
 
 автор: Владимир55   (16.10.2009 в 01:23)   письмо автору
 
   для: Trianon   (16.10.2009 в 01:12)
 

Покручу.

А еще такая идея - если создавать стоп-файл не средствами рнр, а скриптом JS?

К сожалению, я не знаю, как написать код создания такого текстового файла. Это сложно?

  Ответить  
 
 автор: Саня   (16.10.2009 в 10:24)   письмо автору
 
   для: Владимир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.

  Ответить  
 
 автор: Владимир55   (16.10.2009 в 13:19)   письмо автору
 
   для: Саня   (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>".

Однако на рабочем столе, а также на диске С скрипт работает! Вопреки всем мрачным прогнозам!

Осталось только как-то "уговорить" его выполнить свои функции на Денвере. Как бы это сделать?

  Ответить  
Rambler's Top100
вверх

Rambler's Top100 Яндекс.Метрика Яндекс цитирования