Пару непростых вопросов о declare и register_tick_function

mrsol

Новичок
Пару непростых вопросов о declare и register_tick_function

Сразу скажу искала и на этом форуме и на других и на php.net ничего не нашёл.

имеем файл test6_cl.php
PHP:
<?php
  class main_class{
    
    var $test_tics;
    var $this_value;
    
    function main_class($value){
        
        $this->this_value = $value;
        
    }
    
    function start(){
        $this->test_tics = new test_ticks_cl($this->this_value);
        declare(ticks=1);
    }
    
    function some_calculate(){
        for($x=1; $x<=3; $x++){
            echo "val='".$this->this_value."' x='".$x."' \n";
        }
    }
  }
  
  class test_ticks_cl{
    
    var $the_value;
    
    function test_ticks_cl($value){
        
        $this->the_value = $value;
        register_tick_function(array(&$this, 'show_value'));
        
    }
    
    function show_value(){
        
        echo "value_is='".$this->the_value."' \n";
        /*for($y=1; $y<=2; $y++){
            echo "val='".$this->the_value."' y='".$y."' \n";
        }*/
    }
  }
  
  
?>
второй файл test6.php
PHP:
<?php
  require_once('test6_cl.php');
  
  echo "init first class\n";
  $m1 = new main_class(1);
  $m1->start();
  echo "init second class\n";
  $m2 = new main_class(2);
  $m2->start();
  
  echo "start main test \n";
  echo "start first class test\n";
  $m1->some_calculate();
  echo "start second class test\n";
  $m2->some_calculate();
  echo "test calculate no in class\n";
  
  for($x=1; $x<=3; $x++){
    echo "x_no_in_class='".$x."' \n";
  }
  
?>

------------------------------------------------------------
Первый вопрос
при исполнении файла php -q test6.php
Когда доходит до блока
PHP:
for($x=1; $x<=3; $x++){
  echo "x_no_in_class='".$x."' \n";
}
Тики не отрабатываются, то есть вывод происходит следующий, привожу не весь вывод, а только последнюю часть.
value_is='2'
value_is='1'
val='2' x='3'
value_is='1'
value_is='2'
value_is='2'
value_is='1'
value_is='1'
value_is='2'
value_is='2'
value_is='1'
value_is='1'
value_is='2'
value_is='2'
value_is='1'
test calculate no in class
x_no_in_class='1'
x_no_in_class='2'
x_no_in_class='3'
При этом не изменяя кода, кроме удаления строчки require_once('test6_cl.php'); соединяем всё в один файл и тики начинают работать и тут.
value_is='2'
value_is='1'
x_no_in_class='3'
value_is='1'
value_is='2'
value_is='2'
Из-за чего такое разное поведение в одном и том же коде??? Это был нулевой вопрос, и он не является глобальным. :) Вопрос конечно чисто философский, но привёл он меня к следующим уже не философским вопросам.


Вот эти вопросы.
Первый вопрос.
Как можно реализовать тики для данного пример, чтобы отрабатывалась только те тики которые принадлежать классу который сейчас производит действия? В данный момент тики выполняются независимо какой из классов работает в данный момент.
То есть когда выполняется функция some_calculate из объекта $m1, чтобы не выполнялась функция show_value из объекта $m2->test_tics
Предложение создать несколько файлов с копиями скрипта и с разными названиями классов не подходит.


Второй вопрос, в принципе взаимозаменяемый с первым.
Сейчас происходит следующая ситуация. Когда отрабатывается одна из зарегистрированных функций, то она тоже создаёт тики и начинается вызов функций друг друга, то есть чем больше зарегистрированных функций в тиках и чем больше в них кода, тем больше происходит циклов вызова друг друга.
На пример это видно если разкомментировать следующий код в функции show_value
PHP:
function show_value(){
        
        echo "value_is='".$this->the_value."' \n";
        for($y=1; $y<=2; $y++){
            echo "val='".$this->the_value."' y='".$y."' \n";
        }
    }
Происходит примено следующее. Часть вывода.
value_is='1'
val='1' y='1'
val='1' y='2'
val='2' y='1'
value_is='1'
val='1' y='1'
val='1' y='2'
value_is='1'
val='1' y='1'
val='1' y='2'
val='2' y='2'
value_is='1'
val='1' y='1'
val='1' y='2'
value_is='1'
val='1' y='1'
val='1' y='2'
value_is='1'
val='1' y='1'
val='1' y='2'
-------------- val='2' x='2'
value_is='1'
value_is='2'
val='2' y='1'
val='2' y='2'
val='1' y='1'
value_is='2'
val='2' y='1'
val='2' y='2'
value_is='2'
val='2' y='1'
val='2' y='2'
val='1' y='2'
value_is='2'
val='2' y='1'
val='2' y='2'
value_is='2'
val='2' y='1'
val='2' y='2'
value_is='2'
val='2' y='1'
То есть при работе одной из зарегистрированных функций, сколько бы не было в ней кода, нужно чтобы другие не выполнялись. А функций может быть очень много и могут быть разные.
Когда есть одна зарегистрированная функция, и она вызывает в себе другие функции из её класса или вообще какие либо, то она не создаёт тиков, которые её бы опять вызвали.

Вот такие вопросы.

Оперционка linux, php версия PHP 5.2.1 (cli)
 

fixxxer

К.О.
Партнер клуба
там как то хитро, мне помнится в свое время приходилось этот деклейр в каждый файл где оно нужно вставлять, в причины не вникал
 

mrsol

Новичок
2FractalizeR
Ну бывают очепятки.

2Beavis
Сейчас попытаюсь.
На повестке 3 вопроса.

Начну со второго.
Допустим зарегистрировано используюя register_tick_function несколько функций. А B и С. Исполняется код вне этих функциях, происходит перехват тика и скрипт начинает отрабатывать функцию А, выполнив её переходит на выполнение функции B, при этом в ходе выполнения функции начинается перехват тиков и опять вызывается функция А. И так они начинают вызывать в какой-то цикличности друг-друга, но при этом не зацикливаются. И это происходит если эти функции лежат в разных файлах. Если всё в одном, то всё нормально, зарегистрированные функции не создают лишних перехватов.
Так вот вопрос, как заставить обработчик работать как будто все функции в одном файле, то есть чтобы не было рекурсивных вызовов.
Вот пример кодов.
Файл. test.php
PHP:
<?php
  include("a.php");
  include("b.php");
  include("c.php");
  
  register_tick_function('A');
  register_tick_function('B');
  register_tick_function('C');
  declare(ticks=1);
  
  for($u=1; $u<=3; $u++){
    echo "Main u='".$u."' \n";
  }
?>
Файл a.php
PHP:
<?php
  function A(){
    for($x=1; $x<=3; $x++)
        echo "func A x='".$x."' \n";
  }
?>
Файл b.php
PHP:
<?php
  function B(){
    for($y=1; $y<=3; $y++)
        echo "func B y='".$y."' \n";
  }
?>
Файл с.php
PHP:
<?php
  function C(){
    for($z=1; $z<=3; $z++)
        echo "func C z='".$z."' \n";
  }
?>
И вывод получается местами следующий.
func A x='3'
func C z='2'
func A x='1'
func B y='1'
func B y='2'
func B y='3'
func A x='2'
func B y='1'
Что не соответствует логике выполнения. Или у меня логика хромает?

Пробовал в файлах указывать declare(ticks=1); Эффекта не дало.
В принципе уже сам доделал класс собственной обработки зарегеных функций, в котором только зарегана в системе вызове одна функция а остальные зареганы в классе и класс их выполняет, но как-то некрасиво.


Теперь по поводу первого вопроса.
Вынкция регистрируется на обработку из определённого класса или подкласа, Нужно чтобы эта функция обрабатывалась только тогда, когда работает непосредственно данный класс или происходит выполнения других функция или классов но ход выполнения всё равно находится в в данном классе.
В этой связи начал копать в сторону debug_backtrace, но она возвращает только классы как они объявлялись, а именование определённых объектов не возвращает.

Если что-то непонятно спрашивайте.
 

mrsol

Новичок
Автор оригинала: StUV
можно постановку задачи в виде _до_кода_ ?..
Не совсем понял что значит постановка задачи _до_кода.

Кстати решение уже вроде сделал сам. Всё что требовалось работает.
 

mrsol

Новичок
Автор оригинала: StUV
для чего все это было нужно?
какая задача?
Есть класс работает с некоторыми устройствами. В одном скрипте может быть несколько копий классов, которые работают с разными устройствами.
Первая задача, обновлять в shared memory время последнего выполнения данной копии класса.
Вторая задача, принимать новые команды из shared memory как только они появились.
И ещё несколько задач.

И вообще хотелось разобраться почему такое разное поведение одного и того же кода. Но это так и не понял.
 
Сверху