いくつかの cron ジョブに単純なロック メカニズムを実装したかったので、通常とは異なる方法で実装することにしました。ソケットの作成/バインド/リッスンに関しては、PHP に少しバグがあるようです。
動作しているコード:
<?php
echo 'EXECUTING: '. __METHOD__ . \PHP_EOL;
if(false === ($socket = \socket_create(\AF_INET, \SOCK_STREAM, \SOL_TCP))) {
die('create');
}
if(false === ($bind = \socket_bind($socket, '127.0.0.1', 4444))) {
die('bind');
}
if(false === ($listen = \socket_listen($socket))) {
die('listen');
}
var_dump($socket, $bind, $listen);
これによりソケットが作成され、着信接続を待機するインターフェースにバインドされます。次のように呼び出して確認できます。
netstat -anp | grep LIST | grep tcp
同じ PHP コードを単純なクラスに入れると、バインド/リッスンしません。これが私が話しているコードです:
<?php
class Test
{
public function lock()
{
echo 'EXECUTING: '. __METHOD__ . \PHP_EOL;
if(false === ($socket = \socket_create(\AF_INET, \SOCK_STREAM, \SOL_TCP))) {
die('create');
}
if(false === ($bind = \socket_bind($socket, '127.0.0.1', 4444))) {
die('bind');
}
if(false === ($listen = \socket_listen($socket))) {
die('listen');
}
var_dump($socket, $bind, $listen);
}
}
$t = new Test();
$t->lock();
echo 'Working...'. \PHP_EOL;
sleep(60);
echo 'Done.';
このコードを実行すると、var_dump が次のように表示されることがわかります。
$socket
リソースです(これが必要です)$bind = true
$listen = true
しかし、コードは実際にはバインド/リッスンしていません。
私が間違っていることは何ですか?
編集:
テスト済み:
- PHP 5.4.4 (Linux)
- PHP 5.3.3 (Linux)