`
flex_莫冲
  • 浏览: 1090208 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

thinkphp socket to support sso (php socket 不稳定,不建议使用)

    博客分类:
  • php
阅读更多
cli code
#!/bin/bash

filepath=$(cd "$(dirname "$0")"; pwd)
cd $filepath
#running status:sso.lock,stop status:ssostop.lock
TMPFILE=$filepath/sso.lock
STOPFILE=$filepath/ssostop.lock
runCLI(){
    touch $TMPFILE
    echo "sso server process started.\n"
    logname="sso_"$(date +%Y%m%d);
	su www-data -c "php index.php sso start 1>>./Log/$logname.log 2>&1"
    rm -f $STOPFILE;
}

restartCLI(){
    stopCLI
    echo "Waiting for stop sso process."
    sleep 1
    echo "Exit prev sso process."
    runCLI &    
}

stopCLI(){
    if [ -f $TMPFILE ];then
        touch $STOPFILE
    fi
    rm -f ${TMPFILE};
	logname="sso_"$(date +%Y%m%d);
	su www-data -c "php index.php sso stop 1>>./Log/$logname.log 2>&1"
    echo "Sent stop sso server signal."
}

if [ "$1" = "-stop" ] ;then
    stopCLI
elif [ "$1" = "-start" -o "$1" = "" ] ;then
    if [ -f $TMPFILE ];then
        echo "Another process is running."
    else
      runCLI &
    fi
elif [ "$1" = "-restart" ] ;then
    restartCLI
else
    echo "Please select option -start -restart -stop"
fi



socket server code
<?php
namespace Admin\Action;
use Think\Action;
class SsoAction extends Action {
	private $sock;
	private $clients = array();
// 停止socket。kill 后,有可能socket临时文件还是没删除。会导致同一个端口无法启动
	//check port status:netstat -ano |grep port
	//search pid: lsof -i:port 
	//kill pid
	//rm -f sso.lock
	public function run($taskType) 
	{
		switch ($taskType) {
			case 'start':
				$this->_start();
				break;
			default:
				echo datetime() . " unknow task type!" . PHP_EOL;
				break;
		}
	}
	
	public function index() {
		echo datetime() . " server msg: ". $_SERVER['argv'][1] . " " . $_SERVER['argv'][2] . PHP_EOL;
		$this->run($_SERVER['argv'][2]);
	}
	
	private function _start() 
	{
		set_time_limit(0);
		ob_implicit_flush();
		
		if (($this->sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) === false) {
			echo datetime() . " socket_create() failed: reason:" . socket_strerror(socket_last_error()) . "\n";
			exit;
		}
		
		// start
		if (socket_bind($this->sock, C('SSO_ADDRESS'), C('SSO_PORT')) === false) {
			echo datetime() . " socket_bind failed, reason:" . socket_strerror(socket_last_error($sock)) . PHP_EOL;
			exit;
		}
		
		// listen
		if (socket_listen($this->sock, 5) === false) {
			echo datetime() . " socket_listen() failed: reason: " . socket_strerror(socket_last_error($sock)) . PHP_EOL;
			exit;
		}
		echo datetime() . " start socket server success!" . PHP_EOL;
		do {
			// accept socket msg failed
			if (($msgsock = socket_accept($this->sock)) === false) {
				echo datetime() . " socket_accepty() failed :reason:" . socket_strerror(socket_last_error($this->sock)) . PHP_EOL;
				break;
			}
			//read client message
			$buf = socket_read($msgsock, 1024);
			$data = json_decode($buf, true);
			$userID = $data['userID'];
			if ($data['msg'] == 'logout') {
				// clear session table 
				$this->_logout($userID);
		    } elseif ($data['msg'] == "check") {
		    	// check cache with user ID
		    	$back = S($userID) ? "success" : "fail";
				echo datetime() . " no cache of {$userID} " . PHP_EOL;
				if (false === socket_write($msgsock, $back)) {
					echo datetime() . " socket_write() failed reason:" . socket_strerror(socket_last_error($this->sock)) . PHP_EOL;
				}
		    }
			socket_close($msgsock);
		} while (true);
	}
	
	private function _logout($userID) {
		if (!$userID) return false;
		S($userID, null);
		echo datetime() . " userID:{$userID} logout by client. " . PHP_EOL;
	}
}
?>


socket client code
<?php
namespace Admin\Action;
 use Think\Action;
 use Org\Util\Socket;
class SsoClientAction extends Action {
	private $SocketClient;
	/**
	 * loop check sso server auth status
	 */
	public function run() 
	{
		$result = true;
		while($result===true) {
		    $this->_connect();	
			$result = $this->send();
			if (!$result) {
				// logout 
				session_destroy();
			}
			sleep(3);
		} 
		//$this->_connect();	
		//$result = $this->send();
	}

	private function _connect()
	{
		$config = array('persistent'	=> false,
						'host'			=> C("SSO_ADDRESS"),
						'protocol'		=> 'tcp',
						'port'			=> C("SSO_PORT"),
						'timeout'		=> 5);
		$this->SocketClient = new Socket($config);
		$this->SocketClient->connect();
	}
	
	/**
	 * @param msg check or logout string
	 */
	public function send($msg="check")
	{
		$userID = $_SESSION[C('USER_AUTH_KEY')];
		if (!$userID) $msg = "logout";
		$arr = array("msg"=>$msg, $userID=>$userID);
		$data = json_encode($arr);
		$result = $this->SocketClient->write($data);
		//echo datetime() . " send msg:{$msg} \r\n"  . PHP_EOL;
		$response = $this->SocketClient->read();
		echo datetime() . " " . $response . " from sso server \r\n" . PHP_EOL;
		$this->SocketClient->disconnect();
		if ($response == "logout" || $response == "fail") {
			echo datetime . " logout or fail \r\n" . PHP_EOL;
			session_destroy();
			return false;
		} 
		return true;
	}
}
?>

分享到:
评论

相关推荐

    基于 elementui + thinkphp6 + phpsocket.io的单商户客服系统源码.zip

    基于 elementui + thinkphp6 + phpsocket.io的单商户客服系统源码 基于 elementui + thinkphp6 + phpsocket.io的单商户客服系统源码 基于 elementui + thinkphp6 + phpsocket.io的单...

    亲测thinkphp3.1.3完美支持php7 thinkphp3.1.3--for php7.zip

    标题中的“thinkphp3.1.3完美支持php7”意味着这个压缩包是针对PHP7环境优化过的ThinkPHP 3.1.3框架版本。ThinkPHP是中国常用的开源PHP框架之一,以其简洁、高效的代码风格和丰富的功能而受到开发者的欢迎。PHP7则是...

    ThinkPHP3.1修改支持php7

    同时,建议考虑将项目升级到更高版本的ThinkPHP,如ThinkPHP5.x,这样不仅可以解决当前的兼容性问题,还能享受到更多新版本带来的性能优化和新特性。 总的来说,升级ThinkPHP3.1以支持PHP7是一个涉及多方面调整的...

    Thinkphp做的阿里云OSS后台

    Thinkphp做的阿里云OSS后台,PHP全套代码,Thinkphp3.2整合阿里云OSS图片,thinkphp3.2实现图片上传至OSS可减少服务器压力,节省宽带,安全又稳定,阿里云OSS对于做负载均衡非常方便,不用传到各个服务器了。...

    thinkphp6使用workerman websocket连接

    本文将深入探讨在ThinkPHP6框架中如何使用Workerman库来实现WebSocket连接,以及相关的技术要点。 首先,`ThinkPHP6` 是一个基于 PHP7 开发的轻量级且强大的国产PHP框架,其核心设计理念是“简洁、实用、快速”。它...

    thinkphp5.1 对接 phpword 使用phpoffice 自己搞了一下午终于搞成了一个对接的,网上的各种bug

    在使用ThinkPHP5.1对接PHPWord时,首先要确保已经正确安装了PHPOffice库。这通常通过Composer进行管理,执行`composer require phpoffice/phpword`命令即可。接着,在ThinkPHP5.1的控制器中引入所需类库,并实例化...

    thinkphp6 稳定版源码压缩包下载

    【标签】"php框架 thinkphp6稳定版" 指出这是关于PHP框架的内容,特别强调了ThinkPHP6的稳定版本,表明这是一个适合生产环境使用的框架。 压缩包文件名为"tp6",很可能包含了ThinkPHP6的核心源码文件、示例项目、...

    ThinkPHP3.1.2兼容PHP7升级包

    thinkphp-3.1.2.zip是源版本未修复的 Base为在thinkphp3.1.2源版本基本上修复PHP7.0兼容性的文件夹 ├── Base │ ├── Common │ │ └── common.php │ └── Lib │ ├── Behavior │ │ ...

    基于ThinkPHP和Socket通信的病房呼叫系统.zip

    《基于ThinkPHP和Socket通信的病房呼叫系统》 在当今的医疗信息化进程中,病房呼叫系统是提高医院服务质量、提升患者体验的重要组成部分。本项目“基于ThinkPHP和Socket通信的病房呼叫系统”是一款采用PHP编程语言...

    ThinkPHP 3.1.3 for php7

    这份框架代码已经经过了修改,能够适应PHP7的最新版本,包括7.0和7.1,使得开发者可以充分利用PHP7的优势,同时在ThinkPHP的稳定框架上构建应用。 一、ThinkPHP 3.1.3与PHP7的兼容问题 1. PHP7的语法变化:PHP7...

    PHP 使用TP5.0 实现SSO单点登录

    因为公司要实现SSO单点登录的效果,最近在网上找了一些资料,但是都没有好用的, 所以自己用PHP 使用TP5.0 实现了SSO单点登录,可以跨多个域名。 下载后在本地配置好 A,B,C 3个网站,就可以模拟效果了。

    Thinkphp 使用Dompdf

    Thinkphp 使用Dompdf

    ThinkPHP整合phpqrcode生成二维码DEMO

    本示例是关于如何在ThinkPHP框架中整合phpqrcode库来生成二维码的DEMO。这个过程涉及到前端与后端的交互、库的安装与配置、以及实际的二维码生成逻辑。 首先,`ThinkPHP`是一个基于PHP的轻量级开源框架,它提供了...

    基于elementui + thinkphp6 + phpsocket.io的dingdong开源单商户客服系统设计源码

    该开源单商户客服系统采用elementui、thinkphp6及phpsocket.io技术构建,支持多语言环境,包含875个文件,涵盖579个PHP文件、57个JavaScript文件、40个Markdown文件、29个JSON文件、29个Vue文件、25个PNG图片文件、...

    thinkphp5.0整合phpsocketio完整攻略(绕坑)

    - **安装PHPSocket.IO**:进入ThinkPHP5.0项目的根目录,使用Composer安装`composer require workerman/phpsocket.io`。完成后,vendor目录下会新增一个workerman文件夹,表示安装成功。 - **创建服务入口文件**...

    thinkphp使用mpdf导出html为pdf文件

    在ThinkPHP项目中使用mpdf,首先需要引入库。在控制器或服务中,添加以下代码: ```php use Mpdf\Mpdf; // 创建mpdf实例 $mpdf = new Mpdf(); ``` 接下来,你需要准备HTML内容。可以是动态生成的,也可以是静态...

    ThinkPHP5.1 框架下 PhpSpreadsheet 操作 Excel 表的导入导出.rar

    在ThinkPHP5.1项目中,使用PhpSpreadsheet导入Excel文件通常涉及以下步骤: 1. **安装库**: 通过Composer安装PhpSpreadsheet,命令行输入 `composer require phpoffice/phpspreadsheet`。 2. **读取文件**: 使用`\...

    Thinkphp整合php5.5_phpRedis扩展安装使用教程内附说明和工具包

    帮助你完成php程序对redis的支持,其中分别包含在linux和windows系统中如何一步步完成php_redis扩展安装的步骤和所需资源,最后我再结合Thinkphp3.2把redis整合进tp框架的Cache中,这样更方便的使用tp中S()方法直接...

    通过thinkphp5+PHPOffice读取word文件写入到html文件

    这里我们探讨的是如何使用ThinkPHP5框架结合PHPOffice库来实现这个功能。 首先,ThinkPHP5是一款流行的PHP轻量级框架,它提供了强大的路由、模型、控制器、视图等MVC模式支持,简化了Web应用的开发过程。在搭建...

    phpmailer+thinkphp3.2,命名空间

    在本例中,我们看到的是PHPMailer与ThinkPHP 3.2版本的集成,这是一个较老但仍然被许多项目使用的版本。 " DiaoyongController.class "可能是指一个控制器类,它是ThinkPHP框架的一部分,专门处理与邮件相关的操作...

Global site tag (gtag.js) - Google Analytics