Memcache::connect
(PECL memcache >= 0.2.0)
Memcache::connect — memcached サーバーへの接続をオープンする
説明
Memcache::connect() は、memcached サーバーへの接続を 確立します。 Memcache::connect() を使用してオープンされた接続は、 スクリプトの実行終了時に自動的に閉じられます。 Memcache::close() を使用して閉じることも可能です。 memcache_connect() 関数を使用することも可能です。
パラメータ
host
-
memcached が接続を待ち受けるホストを指定します。 このパラメータには別のトランスポート層を指定することもできます。たとえば
unix:///path/to/memcached.sock
のようにすると Unix ドメインソケットを使用できます。この場合、port
は0
を指定しなければなりません。 port
-
memcached が接続を待ち受けるポートを指定します。 Unix ドメインソケットを使用する場合は、このパラメータを
0
とします。port
を指定しなかったときのデフォルトは memcache.default_port となります。そのため、このメソッドをコールするときにはポートを明示しておくことをおすすめします。 timeout
-
デーモンへの接続の際に使用する値 (秒単位) です。 デフォルト値を 1 秒でも変更する前には十分注意してください。 接続が遅くなってしまうと、 キャッシュ処理のメリットが なくなってしまいます。
例
例1 Memcache::connect() の例
<?php
/* 手続き型の API */
$memcache_obj = memcache_connect('memcache_host', 11211);
/* オブジェクト指向の API */
$memcache = new Memcache;
$memcache->connect('memcache_host', 11211);
?>
注意
port
を省略した場合は、PHP の ini 設定
memcache.default_port
の値をデフォルトとして使います。
もしこの値がアプリケーションのどこかで変更されていれば、予期せぬ結果を引き起こすかもしれません。
このメソッドをコールするときには、常にポートを明示しておくことをおすすめします。
User Contributed Notes 2 notes
If memcached is working, calling memcache_connect( ) returns an Object instance, not a boolean. If memcached is not working, calling memcache_connect( ) throws a notice AND a warning (and returns false as expected).
<?php
/* memcache is running */
$test1 = memcache_connect('127.0.0.1',11211);
echo gettype($test1);
// object
echo get_class($test1);
// Memcache
/* memcached is stopped */
$test2 = memcache_connect('127.0.0.1',11211);
/*
Notice: memcache_connect(): Server 127.0.0.1 (tcp 11211) failed with: A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
(10060) in C:\Program Files\Support Tools\- on line 1
Warning: memcache_connect(): Can't connect to 127.0.0.1:11211, A connection attempt failed because the connected party did not properly respond after a period of time, or established connection failed because connected host has failed to respond.
(10060) in C:\Program Files\Support Tools\- on line 1
*/
echo gettype($test2);
// boolean
echo $test2===false;
// 1
?>
There appears to be no way to check whether memcached is actually running without resorting to error suppression:
<?php
$test3 = @memcache_connect('127.0.0.1',11211);
if( $test3===false ){
// memcached is _probably_ not running
}
?>
In describing the timeout there is a statement that is not completely correct, increase the timeout does not necessarily preclude or unfeasible memcache, only allows the system to wait for more concurrent connections, which is a large minority of the number of connections, this causes several problems and could simply be corrected if the timeout was increased and perform some tests.
To prove the concept and show that the connection does not wait if the server goes down:
<?PHP
while ( ++$loop < 10000 ) {
try {
$memcache = new Memcache;
@$memcache->pconnect( "127.0.0.1" , 11211 , 30 );
$loopset = 0;
$loopget = 0;
while ( ++$loopset < 50 ) {
if ( @$memcache->set( "foo" , "bar" ) === false ) {
echo "Fail!" . PHP_EOL;
}
}
while ( ++$loopget < 500 ) {
if ( @$memcache->get( "foo" ) === false ) {
echo "Fail!" . PHP_EOL;
}
}
if ( $loop % 100 == 0 ) {
echo "Try: " . $loop . PHP_EOL;
}
} catch ( Exception $e ) {
echo "Fail: " . $e->getMessage() . PHP_EOL;
}
}
?>
Replace with an invalid host and test the timeout will not make a difference! It serves only for connections to the socket that are occupied.
More detail about troubleshooting timeouts in memcached google code.