1

ループで継続的に実行されるシェル スクリプトがあります。

データベースのレコードをチェックし、必要に応じて変更します。

        set_time_limit(0);
        while(true){
            try{
                $this->out(mysql_ping());
                $companies = $this->findCompanies();            
                $companies = $this->reduceCompanies($companies, $rules);
                $this->processCompanies($companies);

            }catch (\Exception $e){
                Log::write('debug', $e->getMessage());
            $this->out($e->getMessage());
            }
        sleep(3);
        }

私が抱えている問題は、このスクリプトは正常に実行されているように見えますが、ランダムにスローされることです:「2006 MySQL server has gone away」 例外キャッチにいくつかのものを入れて、mysql サーバーに再接続しようとしました。

     }catch (\Exception $e){
                    if(!mysql_ping()){//tried 
    $this->connection->reconnect();  //also tried
$this->Company->getDatasource()->reconnect();   neither seem to work.
                    }}

データベースに再接続する方法について何か提案はありますか?

4

1 に答える 1

1

シェルが無限ループで実行されている同様の問題がありました。

ConnectionManager の使用を追加します。

use Cake\Datasource\ConnectionManager;

ループの前に接続を取得します。

$connection = ConnectionManager::get('default');

ループ内で、最初に接続が必要になる直前に、まだ接続されているかどうかを確認し、切断されている場合は接続を実行します。

if(!$connection->isConnected()) {
    $connection->connect();
}

シェルが長時間待機している状態の場合は、接続が再び必要になったときに、手動で切断して新しい接続を試みることができます。

if($connection->isConnected()) {
    $connection->disconnect();
}
于 2016-07-15T16:10:32.117 に答える