WordPress サイトを新たに作成しようと Local を利用して自分の PC に環境を構築したが、API アクセスを行うと必ず timeout する現象に遭遇した。
正確に言うと 以下のように API アクセスを同じ URL に対して連続して行うと二回目のアクセスが必ず timeout になるという状態だ。
require_once( '../public/wp-load.php' );
# test
$posts = wp_remote_get('http://example.local/wp-json/wp/v2/posts');
var_dump($posts);
$posts = wp_remote_get('http://example.local/wp-json/wp/v2/posts');
var_dump($posts); // timeout
exit;
エラーメッセージは以下の通り。
cURL error 28: Operation timed out after 5006 milliseconds with 0 bytes received
wp_remote_get に対して timeout の値を 0 や極端に大きな数字などに設定したり、各関数の間に sleep をいれても同様に timeout が出る。wp_remote_get ではなく cURL 関数を利用したり、file_get_contents のような他のアクセス方法でも同様。ただし、ターミナルから curl コマンドを連続で行ったり、ブラウザから同じ URL に対して F5 連打した場合は特に問題はなし。
対処法だが、web サーバーをデフォルトの nginx から apache に変更すると正常にアクセスできる。
nginx でのみ発生するのでサーバー側の設定だとは思うのだが、設定ファイルを見てもよくわからず。nginx では連続したアクセスの制限を行う limit_req_zone という設定があるが、タイムアウトではなく 503 が返るようだ。
まぁこういうコードを書くなという話ではあるのだが、プログラムでループ回しているとこのようなケースも出てくる。とりあえず対処できたということで良しとする。