php - 如何防止 curl_multi_select 在 osx 上挂起?

标签 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 有所不同。

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

最佳答案

你可以试试

usleep(30000); // 0.03s

代替

curl_multi_select($mh);

您可能需要调整微秒数,但我认为 0.03 秒足以满足基本使用需求。

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

关于php - 如何防止 curl_multi_select 在 osx 上挂起?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10747626/

相关文章:

php - 如何在连接表中设置 Laravel 的 Eloquent 关系?

c++ - 在 Linux 中链接时发生库冲突,但在 OSX 中则不会

c - setgid 不适用于/tmp/

PHP multi curl 在一台机器上工作,在另一台机器上失败

c++ - 使用 cURL 下载文件的简单方法

php - 这是 RESTful 吗?使用补品

c# - PHP 中的 SQL 更新

尝试将读取的数据写入文件时出现 curl 写入错误

php - 我如何使用 API 在 XERO 中添加采购订单?

macos - 由于单声道版本无法启动 Omnisharp