今日までPHPでSegFaultを見たことがありませんが、それは可能だと思われます。最初はmysqlドライバーだと思っていましたが、私のコードであることがわかりました;)。
私は約2日間コードのデバッグに費やし、最終的にその原因を突き止めました(したがって、これに遭遇する将来のPHPプログラマーの皆さん、どういたしまして!)
簡単に言えば、あなたが歩いている間、あなたが歩いているのと同じ配列で行うことはできません。unset()
array_walk()
目的は、$out配列に存在しない$this->votesからすべての要素を削除することです($ this->votesのキーが$out内の要素の1つのidプロパティと一致する場合)。
私が抱えていた問題は、コードが正常に実行される時間の約半分であり、残りの半分は、apacheログのセグメンテーション違反でクラッシュしました(このエラーに気付くまでしばらく時間がかかったため、デバッグがかなり困難になりました)。
そして、ええ、それはそもそもかなりよく考えられていないコードです...。
array_walk($this->votes, function(&$o, $key) use($that, $out) {
$found = array_filter($out, function($p) use($key) {
return $p['id'] == $key;
});
if(count($found) == 0) {
unset($this->votes[$key]); //very very bad!!!!
}
});