4

最近、アップグレード後にphp 5.4.26から5.4.28にアップグレードしましたが、このエラーが発生しています

Notice: Unknown: send of 6 bytes failed with errno=32 Broken pipe in Unknown on line 0

次のコードを実行するたびに:

<?php
$tasks = array(
   '1'  => array(),
   '2'  => array(),
);

ini_set('display_errors', true);

class RedisClass {

    private $redis;

    public function __construct()
    {
        $this->redis = new Redis();
        $this->redis->connect('localhost', 6379);
    }

}

$redis = new RedisClass();

foreach ($tasks as $index => $task)
{
    $pid = pcntl_fork();

    // This is a child                                                                                                                                                          
    if($pid == 0)
    {
        echo "Running ".$index." child in ". getmypid() ."\n";
        break;
    }
}

switch($pid)
{
case -1 :
    die('could not fork');
    break;
case 0:
    // do the child code                                                                                                                                                        
    break;
default:
    while (pcntl_waitpid(0, $status) != -1)
    {
        $status = pcntl_wexitstatus($status);
        echo "Child completed with status $status\n";
    }
    echo "Child Done (says: ". getmypid() .")";
    exit;
}

子を 1 つだけフォークすると、PHP 通知が表示されません。複数の子を実行すると、最初の子を除くすべての子に対して PHP 通知が表示されます。

ここで何が起こっているかについて手がかりを持っている人はいますか?

Redis 接続を複数回閉じようとしていると思いますが、これは問題なく少なくとも 4 か月間実行しているコードです。

これらの通知は、5.4.28 へのアップグレード後にのみ表示され始めます。

PHP の変更ログを確認しましたが、この問題の原因と思われるものは何も見つかりません。

これをバグとして PHP に報告する必要がありますか?

アップデート:

Redis の問題である可能性があるようです。私はphpredisを使用しています。Redisをロードする代わりに、mysql 接続で同じコードをテストしましたが、エラーは発生しません。

class MysqlClass {
    private $mysqli;
    public function __construct()
    {
        $this->mysqli = mysqli_init();  //This is not the droid you are looking for                                                                                             
        $this->mysqli->real_connect('IP_ADDRESS',
                                    'USER_NAME',
                                    'PASSWORD');
    }
}

$mysql = new MysqlClass();
4

1 に答える 1

0

ここでの問題は、子プロセスで Redis を再接続しないことです。マイケルが言ったように、2 番目の子供以降は積極的なつながりがありません。その mysql の例は、いくつかのクエリも作成する場合は機能しません。

「MySQL server has gone away」エラーと Redis で問題のある動作が発生しました。

解決策は、子で MySQL と Redis への新しい接続を作成することです。インスタンスをリセットするために MySQL/Redis 接続を処理するシングルトーンがあるかどうかを確認してください (これは私にとっても問題でした)。

于 2015-11-13T14:29:50.600 に答える