我想为少数 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)