PHP实现SOCKET接口SERVER端(转发)

来源:互联网 发布:炉石传说盒子大数据 编辑:程序博客网 时间:2024/05/29 15:02
实话实说PHP确实不是常驻后台的好的解决方法,不过谁让咱水平还比较差呢,呵呵

最近公司和某某超市合作(可以买完了去那些个超市自提),他们的合作商用的JAVA写的,随后他们商务给我发了一个文档,告诉我我们已经和某某某某合作了,你们要严格按照文档来进行开发~~ 看完了 没觉得啥,再看一次,发现这个文档怎么这么别扭,再定睛一看,我擦这个东西是PHP开发用的么。。 不过没办法,来吧!~

先叙述下接口的实现过程 最终端应该是超市的POS机(我猜的) -> 对方合作商平台 -> 我的接口,我的接口接收对方传过来的数据处理后按照文档中的报文格式进行回传…

参数传送流程是这样的

SOCKET接到 2进制数据流->转为十六进制的字符串->
将十六进制字符转换为常见字符串->按照报文进行切割得到各种数据->
进行逻辑处理->将字符串转换为GBK编码(对方竟然是GBK~干嘛不用utf8让我挺纳闷)->
将报文数据转换成ASCII码(ASCII码的十六进制)->拼接十六进制数据长度和报文头->
转换为数据流形式传给对方

SERVER端常驻后台实现
用了比较笨的方法,因为怕PHP常驻后台不靠谱,用crontab保证即使出了错断掉也可以重启(悲剧的是crontab最小颗粒是1分钟),然后用shell保证不会重复启动(重复启动会绑定不了端口报错)

crontab -e 打开crontab编辑

 

crontab -e 打开crontab编辑


* * * * * /share/serviece/check.sh >/dev/null 2>&1

check.sh文件 保证脚本不会重复启动


start()
{
    c=`ps w -C php|grep $1|wc -l`
    if [ $c -lt 1 ]
    then
      /usr/local/bin/php $1&
    fi
}
BASE_PATH=$(dirname `which $0`)
cd $BASE_PATH
start server.php

SERVER端 文件


<?php
    /**
    * Copyright (c) 2011,***.COM
    * All rights reserved.
    * 文件名称: server.php
    * 摘    要: server端
    * 版    本: 1.0
    * 日    期: 2012.2.6
    **/
   
    $NO_SESSION=true;
    set_time_limit(0);
    ignore_user_abort();
    ob_implicit_flush();
    include('./function.php');
   
    //本地IP
    $address = '127.0.0.1';
    //设置用1088端口进行通信
    $port = 1088;
   
    //创建SOCKET
    if (($sock = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)) < 0) {
        echo "socket创建失败原因 " . socket_strerror($sock) . "\n";
    }
    $ret = socket_bind($sock, $address, $port);
    if(!$ret){
        var_dump($ret);echo "\n";
        echo "创建套接字失败原因 " . socket_strerror($ret) . "\n";
        exit;
    }
    //监听
    if (($ret = socket_listen($sock, 5)) < 0) {
        echo "监听失败原因 " . socket_strerror($ret) . "\n";
    }
    do {
    //接收命令
        if (($msgsock = @socket_accept($sock)) < 0) {
            echo "命令接收失败原因: " . socket_strerror($msgsock) . "\n";
            break;
        }
        do {
            if (false === ($buf = socket_read($msgsock, 2048, PHP_BINARY_READ))) {
                echo "socket_read() failed: reason: " . socket_strerror($ret) . "\n";
                break 2;
            }
            if($buf){
                log_result("-------------------------收到请求--------------------\n");
                $t = bin2hex($buf);//把2进制数据流转为16进制字符串
                $rs_str = deal_string($t);//处理本身业务逻辑
                socket_write($msgsock, pack('H*', $rs_str), strlen($rs_str));
                log_result("-------------------------结束此次请求--------------------\n");
                break;
            }else{
                break;
            }
        } while (true);
        socket_close($msgsock);
    } while (true);
    socket_close($sock);



0 0
原创粉丝点击