我有一个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();
}
多次没有同时运行
抱歉我的英文不好
答案 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 - 如上面的问题所述。