set_time_limitでFatalエラー吐かせて、ob_startで出力変えて強制終了。
この方法では、処理を継続させる事が出来るけど出来ません。設計をやり直す必要がある気がします。タイムアウトありきで設計してなかったので、かなりきつい事になりそうです。きれいに設計出来る自信はありません。
ある処理(ブロック)の処理時間がタイムアウト時間を超えたら、その処理をキャンセルしてコールバック関数を実行して(必要なら)結果を返し、そのまま何食わぬ顔で処理を継続させる。こういう事をしてみたいわけですが、いまいち実現方法が思いつきません。
まず、「タイムアウト」というイベントを発生させる方法がさっぱりです。ここでは、set_time_limitは考えません(強制終了につながるので)。例えば、preg_match関数の実行中にタイムアウト時間を超えたとして、preg_match関数の中から「タイムアウト」を知らせる必要があるわけですが、きっと無茶ですよね。
監視対象の処理を別プロセスに切り出せばよいのかとも考えましたが、どうなんでしょうか。子プロセスの結果を親プロセスが受け取る事って出来るんでしたっけ。別ファイルに切り出してexecとかはなしです。色々と、ぼろぼろになりそうなので。
マルチスレッドだと簡単なんですかね。実行パスが複数同時に存在する(?)ようなプログラミングを本格的に経験した事がないので、マルチプロセスもマルチスレッドもさっぱりです。
今回は、「見た感じそうなってればよい」程度と割り切って冒頭の方法で実装しましたが、どうにもスッキリしません。
多分、知らないだけなんでしょうね。なさけなし。。。

