如何防止curl_multi_select挂在osx上?

时间:2012-05-25 02:07:59

标签: php macos curl

我的应用正在使用curl_multi_select等待curl调用完成。 curl_multi_select中的默认超时设置为1秒。对于给定的url,此调用立即在Linux上返回,但在OSX上等待完整的1秒超时。

不幸的是,在我的情况下,更改代码中的超时并不是一个选项 - 我需要一种方法来更改机器配置或使用不同的php模块/ exes。

linux和osx框都运行PHP 5.3.8。 OSX处理套接字和select()调用本身的方式似乎与Linux有所不同。

以下是卷曲调用的作用:

'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源代码)

1 个答案:

答案 0 :(得分:1)

你可以尝试

usleep(30000); // 0.03s

而不是

curl_multi_select($mh);

你可能需要玩微秒,但我认为0.03s足以满足基本用途。

此外,您还必须自己实施超时。 可以将microtime(true)写入变量并将其与每次循环调用的当前时间进行比较。