CakePHP 2.4.2 を使用して、RDS データベースを備えた Amazon Elastic Beanstalk サーバーで CMS サイトを実行しています。昨夜から、ログにエラーが表示され、特定のページが読み込まれません (500 エラー)。
error: [PDOException] SQLSTATE[HY000]: General error: 1300 Invalid utf8 character string: '\x88\xB7'
同じ 'utf8' 文字のセットが表示されることがありますが、エラー ログにはさまざまな文字列が多数記録されているため、毎回同じエラーですが、同じ悪い文字列ではありません。ログにある他の文字列の一部を次に示します。
'\x88\xB7'
'\x88W'
'H\x85'
'\xB0\\x91\x84{\x7F'
'\xC0\x9C'
'\xE8V'
'\xD8\x0E'
'\xA4'
昨夜仕事を離れる前に、ebextension 構成をプッシュして、Zend Opcode Caching をサーバーにインストールしました。これがエラーの原因であるという証拠はありませんが、エラーを引き起こす可能性のあるサーバーに対して行った唯一の変更のようです。エラーが発生する前に行われた最後の変更でした。午後 5 時頃にコードをプッシュすると、午後 6 時頃にログにエラーが表示されるようになりました。
参考までに、opcache を有効にするために使用した構成を次に示します。
packages:
yum:
php55-opcache: []
同じ設定で問題なく動作しているopcacheパッケージなしで、実稼働環境に複数のサーバーがあり、ローカルのテストボックスでもそのようなエラーを再現できませんでした。
opcache である種のあいまいなバグを見つけた可能性がありますか、それとも私が見ているものについてもっと論理的な結論がありますか? これらのエラーは私のコードの奥深くで発生しているため、どうすればデバッグできるのか途方に暮れています。私は自分のコードを検索して、コード自体に悪い文字がないことを確認しましたが、それを超えて、私は暗闇の中でちょっと突っついています.
アップデート:
これが UTF8 文字列の不適切な strtolower() 変換によって引き起こされているかどうかを調べましたが、関連するクエリの 1 つにユーザーが入力した値が含まれておらず、どの条件も UTF8 文字列を使用していないため、それが可能であるとは思えませんそれに追跡されます。失敗しているクエリの 1 つは、ログイン コントローラーで利用可能なすべてのリージョンのルックアップです。
$regions = $this->Region->find('all', array('conditions' => array('do_not_display' => 0, 'active' => 1)));