PHP OO повторная реализация логики и передача динамического метода и аргументов

Мой первый вопрос здесь.

Вопрос аналогичен этому: PHP: Повторная попытка запроса задано несколько раз или до достижения успеха

Попытайтесь до успеха в OO. Вот пример того, что я пытаюсь сделать:

class Creatives {

    public function run() {
        $auth_token='mypassword';
        $id=123123;
        $this->retry_till_success ( $this->getCreatives, array($auth_token, $id) );
        print $this->creatives; 
    }

    public function getCreatives($auth_token, $id) {
        $this->creatives = $this->campagin->get($auth_token, $id);      
    }

    private function retry_till_success($method, $args) {
        do {
            $try_again = false;
            try {
                /* how to call the method with */
                /* call user method with params pass */
                /* do until success */
            } catch (SoapFault $fault) {
                if($fault->faultstring== 'couldnt connect to host')
                    $try_again=true;
            }
        } while ($try_again);
    }
}

я читал о call_user_func, но не знаю, могу ли я использовать его внутри класса, мне нужно сделать 99,9% успеха в моих звонках, любое предложение для достижения этого будет замечательным. Спасибо.

php,

1

Ответов: 6


2 принят

Лучшим способом было бы расширить SoapClient и добавить повтор в метод __call.

class LocalSoapClient extends SoapClient
{

  public function __call($function_name, $arguments)
  {
    $result = false;
    $max_retries = 5;
    $retry_count = 0;

    while(! $result && $retry_count < $max_retries)
    {
      try
      {
        $result = parent::__call($function_name, $arguments);
      }
      catch(SoapFault $fault)
      {
        if($fault->faultstring != 'Could not connect to host')
        {
          throw $fault;
        }
      }
      sleep(1);
      $retry_count ++;
    }
    if($retry_count == $max_retries)
    {
      throw new SoapFault('Could not connect to host after 5 attempts');
    }
    return $result;
  }
}

затем, когда вы создаете экземпляр своего использования клиентом мыла new LocalSoapClient()вместоnew SoapClient()


1

call_user_func_array() отлично подходит для этого:

$result = call_user_func_array( array($this, $method), $args );

Первый аргумент - псевдо-тип обратного вызова , а второй - это массив параметров, который будет передан функции / методу в виде отдельных аргументов.

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


0
private function retry_till_success($method, $args) {

...

$this->$method($args[0], $args[1]);

}

Вы также можете использовать ReflectionClass / ReflectionMethod и вызвать InvokeArgs () для переменного количества аргументов

http://nz.php.net/oop5.reflection


0

Я не совсем уверен, что вы имеете в виду, но так работает call_user_func (_array) ():

call_user_func($method, $arg); //call global function named $method like this: $method($arg)
call_user_func(array($this, $method), $arg); call class method on this class like this: $this->$method($arg);
//lets presume args is an array: $args = array(1, 2);
call_user_func_array($method, $args); //calls global function named $method like this: $method($args[0], $args[1]);
call_user_func_array(array($this, $method), $args); //calls class method like this: $this->$method($args[0], $args[1]);

Также см. Документацию для call_user_func:
http://nl3.php.net/manual/en/function.call-user-func.php
и для call_user_func_array:
http://nl3.php.net/manual/en/function. колл-пользователем функ-array.php


0

$this->getCreativesне будет работать, потому что в PHP функции не являются гражданами базового класса. Вы можете использовать call_user_func[_array]или создавать фабрику для задач и представлять каждую задачу как объект, который реализует интерфейс (например, iRepeatableTask). Таким образом, вы можете позвонить

try
{    
    $task->repeatUntilSuccess()
} catch (SoapFault $e) {...}

и преимущество состоит в том, что эти объекты легко сохраняются / восстанавливаются в БД для выполнения позже (т. е. с помощью cronjob и т. д.).

PHP,
Похожие вопросы
Яндекс.Метрика