0

我有一个 php 应用程序,它需要与使用令牌进行身份验证的服务器建立连接,该令牌在连接丢失之前一直有效。

当第一个连接仍然打开时建立另一个连接时,我的应用程序崩溃,因为令牌与当前连接的令牌不同......

public function connect()
{
    $Socket = fsockopen("192.168.1.1", 1234);
    if ($Socket !== false) {
        stream_set_timeout($Socket, static::TIMEOUT_SEC, static::TIMEOUT_USEC);
        $this->socket = $Socket;
        $this->sendeverything;
    }
}

我如何能够运行如下功能:

 function gogogo() {
      connect();
 }

多次而不让它们同时运行

对不起,我的英语不好

4

3 回答 3

2

最简单的解决方案是使用 is_connected 函数:

function connect() {
    if(is_already_connected()) {
        return;
    }
    // ... your connect logic
}

在其中,is_already_connected()您必须编写一些智能代码来确定是否有打开的连接。

您还可以创建一种单例连接(尽管这个建议可能会引发很多关于使用单例的争论;))

于 2013-09-06T15:51:09.883 回答
1

尝试这样的事情......

<?php

class Connection {
    public $Socket = null;

    public function connect(){
        // Checking if Socket already has a pointer :P
        if((bool)$this->Socket){
            return true;
        }

        $this->Socket = fsockopen("192.168.1.1", 1234);
        if ($this->Socket !== false) {
            stream_set_timeout($this->Socket, static::TIMEOUT_SEC, static::TIMEOUT_USEC);
            $this->sendeverything();
        }
    }
}

$myconnect = new Connection();
$myconnect->connect();
$myconnect->connect();

?>
于 2013-09-06T16:05:21.973 回答
0

this question中所述,您可以使用sem_aquire它。就像是:

function connect(){
    $key = "192.168.1.1:1234" ;
    try{
        $sem = sem_get( $SEMKey);
        sem_acquire($sem);
        //Do connecty stuff here
        sem_release($sem);
    }catch(Exception $ex){
        //Exception handling
    }finally{
        //Finally only available in PHP 5.5 place this in catch and try if < 5.5
        sem_release($sem);
    }
}

请注意,这是完全未经测试的,不会在 Windows 上工作。如果您在 Windows 上,则可以使用flock - 再次如上述问题中所述。

于 2013-09-06T16:03:34.187 回答