33576


現在jQuery+PHPで画面を開いたときにsocket_createで接続し、成功したら以降は  
socket_createせずにsocket_write(),socket_read()を繰り返すソースを書いています。

PHPの関数はjsで3sec毎に呼び出され、phpで取得したデータを#datadisplayのidを付けた  
テーブルタブに更新するものです。(*1)

本題は、呼び出されたphp内でsocket_create -> socket_write() -> socket_read() ->
socket_close()をしています。  
しかし、画面を開いた際にsocket_create()し、成功したら$_SESSION('socketNo')に返り値を格納し、以後はsocket_write()
->
socket_read()を繰り返し、終了時には手動操作によりsocket_close()を呼び出そうとした場合、１回目の処理には$_SESSION('socketNo')が格納されるのですが、２回目以降phpが呼び出された際に$_SESSION('socketNo')の値が0になってしまい、socket_write(),socket_read()の処理でエラーが戻ってきてしまいます。(*2)

socket_create()の返り値を$_SESSION('socketNo')に入れて保管するのはできないのでしょうか？

わかりにくい文になってしまい、申し訳ございませんが、よろしくお願い致します。

以下、一部略している箇所がありますが、該当箇所のコードを添付します。

(*1)------------------------------------------------------

[code]

    function displayData()
    {
        $("#datadisplay").load("dispData.php").fadeIn("normal");
    }
    $.get("dispData.php",{},displayData);
    
    function autoRefresh(interval){
        autoloader = setInterval(displayData,interval);
    }
    autoRefresh(3000);
    
[/code]

(*2)------------------------------------------------------

[code]

    <?php
    
    session_start();
    
    // tcp socket client
    function connect($sendCmd, $ver)
    {
        global $sysVer, $recvBuf;
    
    　　$socket = $_SESSION['socketNo'];
    
        ChromePhp::log('sendCmd'.$sendCmd);
        ChromePhp::log('log : connectFlg : '.$_SESSION['connectFlg']);
        ChromePhp::log('log : socketNo : '.$socket);         // <==== 接続後の値が0になる
    
        if( $_SESSION['connectFlg'] == 0 ) {
    
            ChromePhp::log('connect to server : start');
    
            $server = '127.0.0.1';
            $port = 1000;
            $headLen = 8;
    
            // ソケット接続（TCP/IP）
            if(!($socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP)))
            {
                $errorcode = socket_last_error();
                $errormsg = socket_strerror($errorcode);
    
                die("Couldn't create socket: [$errorcode] $errormsg \n");
            }
    
    
            if(!($result = socket_connect($socket, $server, $port)))
            {
                $errorcode = socket_last_error();
                $errormsg = socket_strerror($errorcode);
    
                die("Couldn't connect socket: [$errorcode] $errormsg \n");
            }
    
            $_SESSION['connectFlg'] = 1;
            ChromePhp::log('connect to server : success'.$_SESSION['connectFlg']);
    
            $_SESSION['socketNo'] = $socket;
    
        }
    
        $socket = $_SESSION['socketNo'];
        ChromePhp::log('get data');
    
        //get data
        $in = pack('s*', $sendCmd, 0, 0, 0);
        socket_write($socket, $in, strlen($in));
    
        $buf = socket_read($socket, $headLen);
        $out = unpack('s*', $buf);
        $dataSize = $out[4];
    
        $buf = socket_read($socket, $dataSize);
        $recvBuf = $buf;
    
    }
    
        ?> 
    
[/code]


CC BY-SA 3.0
2017-03-27T07:19:20.590
33570
2017-03-27T11:55:25.723
2017-03-27T11:55:25.723
8000
21215
question
php jquery
socket_createの返り値を$_SESSIONに入れたときの保存期間


socket_createメソッドの返り値はresource型です。  
<http://php.net/manual/ja/function.socket-create.php>

PHPの以下のマニュアルに、resource型はセッションに保存できないとあります。  
<http://php.net/manual/ja/intro.session.php>

> 警告  
>  セッションデータはシリアライズされるので、 resource 型の変数はセッションに格納できません。  
>  シリアライズハンドラ (php および php_binary) は、register_globals の制約を引き継いでいます。
> そのため、数値のインデックスや特殊文字 (| や !) を含む文字列のインデックスは使えません。
> これらを使っていると、スクリプトのシャットダウン時にエラーが発生します。 php_serialize には、そのような制約はありません。
> php_serialize は PHP 5.5.4 以降で使えます。

このため、セッションへの登録に失敗しているのではないかと思います。  
いかがでしょうか？


CC BY-SA 3.0
2017-03-27T11:09:34.743
33576
2017-03-27T11:09:34.743
17014
33570
answer