swooleなどのマルチプロセスでのmysql has gone awayソリューション

2454 ワード

ぶんせき
最近、swooleなどのPHPマルチプロセスネットワークアプリケーションを開発したところ、mysql has gone awayのエラーが頻繁に発生していることが分かった.
プロジェクトの下のデータベース接続はfork前に伝達を統一的に作成し、つまりこの接続を共用し、マルチプロセスが1つの接続を共用すると、返される結果はどのプロセスで処理されるか保証されません.接続を持つプロセスは理論的にこの接続を読み書きすることができ,データが錯乱する.
1つのプロセスの接続を閉じると、他のプロセスの接続が失われ、玄学的なmysql has gone awayエラーが発生します.
これはマルチプロセスで非常に容易に発生し、深刻な低レベルのエラーであり、防止すべきである.
解決する
swooleはworker_にありますstartでプロセスごとにデータベース接続を作成する
$serv = new swoole_server("0.0.0.0", 9502);

//   onWorkerStart     redis/mysql  
$serv->on('workerstart', function($serv, $id) {
    $redis = new redis;
    $redis->connect('127.0.0.1', 6379);
    $serv->redis = $redis;
});

$serv->on('receive', function (swoole_server $serv, $fd, $from_id, $data) { 
    $value = $serv->redis->get("key");
    $serv->send($fd, "Swoole: ".$value);
});

$serv->start();

オリジナルfork後に作成すればよい