[PHP-users 21958]Re: WEBサーバーがシングルで動いている現象について

竹本 靖 take @ e-logit.com
2004年 6月 3日 (木) 11:47:51 JST


竹本@大阪です。

サーバー側でポーリングを行うのであれば
httpサーバーからではダメですね。

PHPのコマンドライン版を利用してシェル起動させるのが
良いかと思いますが。


> お世話になります。
> 岸川です。
> 
> 竹本様、久保谷様ご返信ありがとうございます。
> 
> > まずは、htttpd の設定を見直すべきでしょう。
> 
> 特にその様な設定がない様です。
> thttpd自体の処理が複数プロセス(スレッド?)を立ち上げて処理する仕組みになって
> いないのではないかと。
> ApacheだとMaxClientsの設定で複数の要求に対して同時処理が出来る様ですが…
>  
> > Webサーバーがシングルでというのはちょっと意味がわかりかねますが、
> 同時に100個の接続要求があったとしても、
> 1個ずつ処理しているということです。
> 結果として、ソケット通信の待ち時間の間、他の接続要求を受け付けない現象になっ
> ています。
> 
> 
> > PHPにポーリング処理などの時間のかかる仕事をさせるのは向いていないかと思わ
>> > ますので、
> > 1.サーバー側でポーリング処理を行うプロセスを常駐させる。
> > 2.その結果をファイルに保存する。
> > 3.PHPでファイルを読み込み、結果を画面に表示する。
> 
> 1.の方法は、PHPで実装が可能なのでしょうか?
> 
> 現在は下記の方法で実現しています。
> ※JavaScriptなどのタイマーを使用して、
>   クライアント側からのポーリング作業に切り替え様かとも思いましたが、
>   他にも処理をしているため、出来れば避けたいのですが…
> 
> 
> もう少しアドバイスいただけないでしょうか。
> 
> <?php
>    // 処理A.....
> 
>     // ソケット通信
>     $ret=sendData();
> 
>    // 処理B.....
> 
>    // 処理C.....
> 
>    header("Location:xxxxxxxx");
> 
> 
> // データ送信
> function sendData()
> {
>     $starttime = time() ;
> 
>     do {
>         // ソケット送受信
>         $ret=openSocketConnect( $data ) ;
>         if( !$ret ) return FALSE;
> 
>         $timeout = FALSE ;
>         switch ( $data ) {
>             case    0 :         // WAIT
>                 $nowtime = time() ;
>                 if ( $nowtime - $starttime > 180 ) {
>                     // 180秒以上、WAITが続く場合はエラー
>                     return FALSE ;
>                 }
>                 else {
>                     sleep ( 10 ) ;  // 継続
>                 }
>                 break ;
>             case    1 :         // 成功
>                 return TRUE ;
>             case    2 :         // 失敗
>             default   :         // 想定外
>                 return FALSE
>         }
> 
>     } while ( 1 ) ;
> }
> 
> // ソケットオープン
> function openSocketConnect( &$sRecData)
> {
>     // ソケット接続をオープンする
>     $sHost = "127.0.0.1" ;
>     $nPortNo = "82" ;
> 
>     $fp = @fsockopen( $sHost, $nPortNo, $nErrNo, $sErrInfo, 5 ) ;
> 
>     if ( !$fp && $nErrNo == 0 ) {
>         return FALSE ;
>     }
> 
>     // データ送受信のタイムアウトをセット
>     socket_set_timeout ($fp, 5) ;
> 
>     // データ送信
>     $sSendData="12345abcde";
>     $ret=sendSocketMessage( $fp, $sSendData );
>     if(!$ret) {
>         fclose($fp);
>         return FALSE;
>     }
> 
>     // データ受信
>     $ret=recieveSocketMessage( $fp, &$sRecData );
>     if(!$ret) {
>         fclose($fp);
>         return FALSE;
>     }
> 
>     // ソケット接続クローズ
>     fclose($fp);
> 
>     return TRUE;
> }
> 
> // データ送信
> function sendSocketMessage( $fp, $sSendData )
> {
>     $nSendLen = fwrite( $fp, $sSendData ) ;
>     if ( $nSendLen < 0 ) {
>         return FALSE ;
>     }
>     return TRUE ;
> }
> 
> // データ受信
> function recieveSocketMessage( $fp, &$sRecData )
> {
> 
>     while ( !feof($fp) ) {
>         $sRecData = fgets( $fp, PHPS_READ_BUFFER_SIZE );
>         if ( strlen($sRecData) > 0 ) {
>             return TRUE;
>         }
>         else {
>             // lengthがない
>             return FALSE;
>         }
>     }
> }
> ?>
> 
> _________________________________________________________________
> メッセンジャーで総額1億円プレゼント! http://im.msn.co.jp/home.htm 
> 
> _______________________________________________
> PHP-users mailing list  PHP-users @ php.gr.jp
> http://ns1.php.gr.jp/mailman/listinfo/php-users
> PHP初心者のためのページ - 質問する前にはこちらをお読みください
> http://www.php.gr.jp/php/novice.php3
> 


PHP-users メーリングリストの案内