ホームページ  >  記事  >  バックエンド開発  >  PHP バックエンド ソケット サービスの長いリンク、複数の同時開発ノート_PHP チュートリアル

PHP バックエンド ソケット サービスの長いリンク、複数の同時開発ノート_PHP チュートリアル

WBOY
WBOYオリジナル
2016-07-14 10:10:12921ブラウズ


[php]
       //保護子进程上限
        if($this->_maxFork >0 && $this->_children > $this->_maxFork)
        {
            Yii::log("_children > ".$this->_maxFork,CLogger::LEVEL_WARNING,__METHOD__); 
            $this->ハンドラー(SIGCHLD); 
               usleep(200); 
            続く; 
        }
 
 
/**
* 監視信号
* @param オブジェクト ソケット $clientt
* @return boolean
​*/
パブリック関数ハンドラー($signo) {
     
    Yii::log("ハンドラー {$signo} ",CLogger::LEVEL_INFO, __METHOD__); 
     
    switch(intval($signo)) {
        ケース SIGCLD:
        ケース SIGCHLD:
             
            Yii::log("SIGCHLD サブプロセス ",CLogger::LEVEL_TRACE, __METHOD__); 
            // 通常退出
            //declare = 1、つまり 1 つの信号がマルチプロセス ダイに対応する可能性があることを意味します
            while( ($pid = pcntl_wait($status, WNOHANG|WUTRACED)) > 0 ) {
                if (FALSE === pcntl_wifexited($status)) {
                    Yii::log("サブプロセス {$pid} がコード {$status} で異常終了しました",CLogger::LEVEL_WARNING, __METHOD__); 
                } その他 {
                    Yii::log("サブプロセス {$pid} が正常に終了しました",CLogger::LEVEL_INFO, __METHOD__); 
                }
                $this->_children--; 
            }
            壊す; 
        ケースの署名:
        シグクイット:
        ため息:
            //异常退出
           $this->_cleanup(); 
            終了(0); 
            壊す; 
        デフォルト:
            壊す; 
    }
}

//保護子进程上限
            if($this->_maxFork >0 && $this->_children > $this->_maxFork)
            {
                Yii::log("_children > ".$this->_maxFork,CLogger::LEVEL_WARNING,__METHOD__);
                $this->ハンドラー(SIGCHLD);
// usleep(200);
                続けます;
            }


    /**
* 監視信号
* @param オブジェクト ソケット $clientt
* @return boolean
​​*/
    パブリック関数ハンドラー($signo) {
       
        Yii::log("ハンドラー {$signo} ",CLogger::LEVEL_INFO, __METHOD__);
       
        switch(intval($signo)) {
            ケース SIGCLD:
            ケース SIGCHLD:
               
                Yii::log("SIGCHLD サブプロセス ",CLogger::LEVEL_TRACE, __METHOD__);
                // 通常退出
                //declare = 1、つまり 1 つの信号がマルチプロセス ダイに対応する可能性があることを意味します
                while( ($pid = pcntl_wait($status, WNOHANG|WUTRACED)) > 0 ) {
                    if (FALSE === pcntl_wifexited($status)) {
                        Yii::log("サブプロセス {$pid} がコード {$status} で異常終了しました",CLogger::LEVEL_WARNING, __METHOD__);
                    } その他 {
                        Yii::log("サブプロセス {$pid} が正常に終了しました",CLogger::LEVEL_INFO, __METHOD__);
                    }
                    $this->_children--;
                }
                休憩;
            ケースの署名:
            シグクイック:
            ため息:
                //异常退出
               $this->_cleanup();
                終了(0);
                休憩;
            デフォルト:
                休憩;
        }
    }

【多进程方式注意点】


变量共有问题
プロセスであるため、メインプロセスの 1 つであることが理解できます。実行は、pcntl_fork() を使用して各メインから実行され、子プロセスの後に自発的に実行され、子プロセスの層の互換性が回避され、一般的な子プロセスの実行完了後に exit(子プロセスは、実行中のダウンがメインプロセスに影響を及ぼさない限り、メインプロセスと量を共有することはできません。

信号と選択冲突问题
pcntl_signal 注册信号後会和 stream_select 有冲突
PHP エラー[2]: stream_select(): [4] を選択できません: 中断されたシステム调用 (max_fd=10)
現時点では解決方法が確立されておらず、pcntl_signal を使用して制御されていません。

进程回收

子プロセスが exit によって終了すると、pcntl_wait による回復が必要になるため、プロセスが終了します。 centos の测试で公開された最大のプロセス上限は 3.2 万で、設定子プロセス数を介して、設定値を超えて pcntl_wait を使用して再取得されます


ソケット读書注意

多くのプロセスの場合、同じソケット ハンドルに対して複数のプロセスが同時に発生する可能性があります。 解決方法は、メインで操作を行い、すべてのデータを取り出した後、子プロセスを実行します。



ファイル操作の注意点
複数プロセスの場合、ファイルサイズ関数が取得できない、または取得したファイルのサイズが変わらない場合があります
これは、Linux でシステム関数を直接呼び出すことで解決されます。


$file_size = @filesize($logFile);
//同時実行時にファイルサイズが取得できない問題を解決
If(0 == $file_size ||$this->_prevFileSize == $file_size )
                                                                                  $file_size = @exec('/usr/bin/stat -c %s '.escapeshellarg($logFile));
clearstatcache(); }

ストレス テスト後、同時実行数 1000 は 1 秒あたり 350 リクエストに達する可能性があります。最適化できるはずです。


http://www.bkjia.com/PHPjc/477526.html

tru​​ehttp://www.bkjia.com/PHPjc/477526.html技術記事 [php] //子プロセスの上限を保証する if($this-_maxFork 0 $this-_children $this-_maxFork) { Yii::log(_children .$this-_maxFork,CLogger::LEVEL_WARNING,__METHOD__); $ this-handler (SIGCHLD) あなた...
声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。