在彼此之后运行php功能

时间:2013-09-06 15:46:49

标签: php

我有一个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();
 }

多次没有同时运行

抱歉我的英文不好

3 个答案:

答案 0 :(得分:2)

最简单的解决方案是拥有一个is_connected函数:

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

is_already_connected()中,您必须编写一些智能代码以确定是否存在开放连接。

你也可以创建一种单例连接(虽然这个建议可能会实例化关于单例使用的很多争论;))

答案 1 :(得分: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();

?>

答案 2 :(得分:0)

如上所述in 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 - 如上面的问题所述。