ホームページ >バックエンド開発 >PHPチュートリアル >PHP バックエンド ソケット サービスの長いリンク、複数の同時開発ノート_PHP チュートリアル
[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();
}
http://www.bkjia.com/PHPjc/477526.html