私のアプリは curl_multi_select を使用して、curl 呼び出しが完了するのを待ちます。curl_multi_select のデフォルトのタイムアウトは 1 秒に設定されています。特定の URL に対して、この呼び出しは Linux ではすぐに戻りますが、OSX では 1 秒の完全なタイムアウトを待ちます。
残念ながら、コードのタイムアウトを変更することは、私の状況では実際にはオプションではありません。マシンの構成を変更するか、別の php モジュール/exe を使用する方法が必要です。
Linux と osx の両方のボックスで PHP 5.3.8 が実行されています。OSX がソケットを処理する方法と、Linux とは異なる select() 呼び出し自体に何かがあるようです。
curl 呼び出しの機能は次のとおりです。
'url' => string 'HTTP://172.19.105.171:8070 <SNIPPED> '... (length=1439)
...
'namelookup_time' => float 1.001309
dtruss を使用した場合の選択呼び出しは次のようになります。
sudo dtruss -a -n httpd > dtruss.txt.2 2>&1
PID/THRD RELATIVE ELAPSD CPU SYSCALL(args) = return
...
21524/0x17136: 14369 37 31 connect_nocancel(0xA, 0x7FFF649DB9F8, 0x6A) = 0 0
21524/0x17136: 14383 15 10 sendto_nocancel(0xA, 0x7FAA786E4AD0, 0x1C) = 28 0
20285/0x8d8d: 755608 1001045 16 select(0x0, 0x0, 0x0, 0x0, 0x7FFF64353A70) = 0 0
select 呼び出しに 1001045 マイクロ秒、つまり 1 秒かかっていることに注意してください。
それで、これはOSXがソケットを処理する方法に関連していますか? PHP/Curl の別のビルド オプションで変更できるものはありますか? または、ネットワーク構成について変更して、select() 呼び出しをより速く返すことができるものはありますか?
これは、現在の質問に絞り込む前に私が抱えていた元の問題です:
PHP/curl: namelookup_time/dns slowing requests
その他の調査:
http://www.somacon.com/p537.php
http://svn.php.net/viewvc/php/php-src/trunk/ext/curl/multi.c?view=markup (curl_multi_select ソースコード)