Функция обратного вызова PHP не вызывается - PullRequest
0 голосов
/ 22 мая 2010

У меня есть следующий код:

function failureCallback($host, $port) {
    print "memcache '$host:$port' failed";
}

$this->memcache = new Memcache;

## bool Memcache::addServer  (  string $host  [,  int $port = 11211  [,  bool $persistent  [,  int $weight  [,  int $timeout  [,  int $retry_interval  [,  bool $status  [,  callback $failure_callback  [,  int $timeoutms  ]]]]]]]] )
 $this->memcache->addServer('192.168.1.35', '11211', FALSE, 50, 10, 10, TRUE, 'failureCallback' );

Сервер подключен и работает (проверено!), Но при каждом соединении вызывается функция обратного вызова Failure. Почему это так?

Справка:

Документация PHP: Memcache :: addServer -> fail_callback

Позволяет пользователю указать обратный вызов функция для запуска при встрече с ошибка. Обратный вызов выполняется до попытка аварийного переключения. Функция принимает два параметра, имя хоста и порт вышедшего из строя сервера

Редактировать: Обновленный пост с правильным количеством параметров перед функцией обратного вызова, но без везения: (

Ответы [ 3 ]

3 голосов
/ 22 мая 2010

Причина, по которой ваш код не работает, заключается в том, что вы на самом деле не передаете обратный вызов. Вы просто вызываете эту функцию и передаете возвращаемое значение. Обратным вызовом в PHP обычно является либо строка с именем функции, либо массив для методов объекта.

$this->memcache->addServer('192.168.1.35', '11211', 0, 50, 10, TRUE, array($this, '_call_memecache_failure');

Параметры должны быть переданы функцией. Вы можете узнать больше о том, как обратные вызовы работают в PHP в документации

Примеры (из документов):

<?php 

// An example callback function
function my_callback_function() {
    echo 'hello world!';
}

// An example callback method
class MyClass {
    static function myCallbackMethod() {
        echo 'Hello World!';
    }
}

// Type 1: Simple callback
call_user_func('my_callback_function'); 

// Type 2: Static class method call
call_user_func(array('MyClass', 'myCallbackMethod')); 

// Type 3: Object method call
$obj = new MyClass();
call_user_func(array($obj, 'myCallbackMethod'));

// Type 4: Static class method call (As of PHP 5.2.3)
call_user_func('MyClass::myCallbackMethod');

// Type 5: Relative static class method call (As of PHP 5.3.0)
class A {
    public static function who() {
        echo "A\n";
    }
}

class B extends A {
    public static function who() {
        echo "B\n";
    }
}

call_user_func(array('B', 'parent::who')); // A
?>
1 голос
/ 23 мая 2010

http://docs.php.net/memcache.addserver говорит:

Memcache :: addServer
[...]
При использовании этого метода (в отличие от Memcache :: connect () и Memcache :: pconnect ()) сетевое соединение не устанавливается до тех пор, пока оно действительно не потребуется.
class Foo {
  protected $memcache;

  public function __construct() {
    echo "Foo::construct\n";
    $this->memcache = new Memcache;
    echo "  adding server\n";
    $this->memcache->addServer('127.0.0.1', 11211, false, 50, 5, 5, true, array($this, 'failureCallback'));
    echo "  constructor done\n";
  }

  public function bar($value) {
    echo "Foo::bar($value)\n";
    $b = $this->memcache->add('testkey', $value, false, 5);
    echo '  add() returned ', $b ? 'true':'false', "\n";
  }

  public function failureCallback($host, $port) {
    echo " ( Foo::failureCallback: memcache '$host:$port' failed )\n";
  }
}

$foo = new Foo;
$foo->bar(1);

отпечатков (без работы memcached на localhost)

Foo::construct
  adding server
  constructor done
Foo::bar(1)
 ( Foo::failureCallback: memcache '127.0.0.1:11211' failed )
  add() returned false
0 голосов
/ 19 июня 2015
$this->memcache = new Memcache;

$this->memcache->addserver(
    $host,
    $port,
    $persistent,
    $weight,
    $timeout,
    $retryInterval,
    $status,
    function($host, $tcpPort, $udpPort, $errorMessage, $errorCode) {
        $message = strtr('Memcache fail on :host (TCP::tcp/UDP::udp) with message ":msg" (:code)', [
            ':host' => $host,
            ':tcp'  => $tcpPort,
            ':udp'  => $udpPort,
            ':msg'  => $errorMessage,
            ':code' => $errorCode
        ]);

        error_log($message);
    }
);
...