我的应用程序正在使用 curl_multi_select 来等待 curl 调用完成。curl_multi_select 中的默认超时设置为 1 秒。对于给定的 url,此调用在 Linux 上立即返回,但在 OSX 上等待完整的 1 秒超时。
不幸的是,在我的情况下,更改代码中的超时并不是一个真正的选择——我需要一种方法来更改机器配置或使用不同的 php 模块/exes。
linux 和 osx 机器都运行 PHP 5.3.8。OSX 处理套接字和 select() 调用本身的方式似乎与 Linux 不同。
这是 curl 调用的作用:
'url' => string 'HTTP://172.19.105.171:8070 <SNIPPED> '... (length=1439)
...
'namelookup_time' => float 1.001309
下面是使用 dtruss 的 select 调用的样子:
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
请注意,选择调用需要 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 source代码)