3

私のアプリは 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 ソースコード)

4

1 に答える 1

1

あなたが試すことができます

usleep(30000); // 0.03s

それ以外の

curl_multi_select($mh);

おそらくマイクロ秒単位で遊ぶ必要がありますが、基本的な使用には0.03秒で十分だと思います。

また、タイムアウトを自分で実装する必要があります。変数に書き込みmicrotime(true)、ループ呼び出しごとに現在の時刻と比較することで実行できます。

于 2012-05-27T17:34:50.137 に答える