PHP スクリプトのプロファイリングを行った後、例外の作成に非常に時間がかかるように見えることがわかりました。
%Time Real User System Calls secs/call Name 100.0 0.00 3448.05 0.00 8.89 0.00 1.81 1 0.0000 3448.0543 main 64.7 2230.28 2230.28 0.02 0.02 0.00 0.00 892 2.5003 2.5003 sleep 35.1 0.01 1211.84 0.00 8.16 0.00 1.49 1001 0.0000 1.2106 do_process 34.7 986.81 1197.34 2.59 2.60 1.18 1.18 1330 0.7420 0.9003 file_get_contents 6.1 0.00 210.53 0.00 0.01 0.00 0.01 28 0.0000 7.5191 __lambda_func 6.1 210.53 210.53 0.01 0.01 0.01 0.01 28 7.5191 7.5191 ErrorException->__construct 0.4 0.00 13.47 0.01 5.21 0.00 0.18 206 0.0000 0.0654 do_check 0.4 13.15 13.15 5.08 5.08 0.15 0.15 402 0.0327 0.0327 preg_replace
つまり、1 回あたりの実際の (CPU ではない) 時間は 7.5 秒ですErrorException->__construct
。 これを改善する方法についてのアイデアを探しています!
関連コード:
set_error_handler( create_function( '$severity, $message, $file, $line', 'throw new ErrorException($message, $severity, $severity, $file, $line);' ) ); $opts = array( 'http' => array( 'method' => 'GET', 'timeout' => 60 ) ); $ctx = stream_context_create($opts); try { $this->data = file_get_contents($url, false, $ctx); } catch (Exception $e) { # The set_error_handler call ensures that we arrive here on any type # of error. $this->data = ''; if(preg_match('/HTTP\/1.[0|1] 4[0-9][0-9] /', $e->getMessage()) == 1) { return 404; } else if(strpos($e->getMessage(), "php_network_getaddresses: getaddrinfo failed") !== false) { return 1000; } else { $this->message = $e->getMessage(); return -1; } }
明確な答えがなくても、どのような要因がリアルタイムに影響を与える可能性があるかを理解したいと思います。私の理解では、コンストラクターにはfile_get_contents
呼び出し自体またはcatch
句の時間が含まれていないため、これが遅くなる正当な理由 (大量のメモリを割り当てようとする以外) を実際に考えることはできません。