php cURL curl_exec 返回 false,在使用 errno 43 BAD_FUNCTION_ARGUMENT 初始化之前停止执行

问题描述 投票:0回答:1

我从 service A(运行 phpunit 测试)向 service B (api) 发送多个curl 请求。

在固定数量的curl调用之后,curl_exec函数返回false,并显示代码43,这意味着BAD_FUNCTION_ARGUMENT

该错误总是发生在我的一组测试中的同一个测试中。如果我在错误发生之前删除一个测试,错误只会转移到下一个使用curl的测试。

这看起来我在某个地方遇到了(硬)限制,这就是我所知道的:

  • 从启动到崩溃大约需要30秒,建议有超时限制
    • 我设置了 CURLOPT_TIMEOUT => 120
    • 我设置了 CURLOPT_CONNECTTIMEOUT => 120
    • 在 php 中设置脚本最大时间 set_time_limit(0) (无限)
  • 由于测试总是在同一个地点进行,也许是内存限制?
    • 在 php.ini 中增加内存限制 128 => => 512 并重新启动服务器
  • CURLOPT_VERBOSE信息显示连接被重用
    • 设置 CURLOPT_FORBID_REUSE => true
    • 向请求添加标头“连接:关闭”

这些都不能帮助我防止curl错误,让我们看一下错误发生前请求的详细信息和错误的信息。

出现错误之前最后一次成功的curl

* Host localhost:80 was resolved.
* IPv6: ::1
* IPv4: 127.0.0.1
*   Trying [::1]:80...
* Connected to localhost (::1) port 80
> GET /user/2645f3b7-a187-47c0-95d3-0ab1696501eb/ HTTP/1.1
Host: localhost
Accept: */*
Accept-Encoding: deflate, gzip, br, zstd
Connection: close
Authorization: Bearer: eyJ0eXAiOiJKV1QiLCJhbGciOiJIUzI1NiJ9.eyJrZXlzIjp7lciJ9.JivFp5Rp6YcQ5KkcEp_7WiVB2SmIRdnXcsg86r3eGIE

* Request completely sent off
< HTTP/1.1 200 OK
< Date: Wed, 08 May 2024 12:28:43 GMT
< Server: Apache/2.4.54 (Unix) OpenSSL/1.0.2u PHP/8.2.0 mod_wsgi/3.5 Python/2.7.18 mod_fastcgi/mod_fastcgi-SNAP-0910052141 mod_perl/2.0.11 Perl/v5.30.1
< X-Powered-By: PHP/8.2.0
< Set-Cookie: _ssid=0qupDtygjuhsOEQyDYilnLSfcEymOUDKDwdTVXEyQqC68D3b8tkPH6-SCby2qcKB%2CsJU1%2C4vbk39hLbeT%2CWGgdh%2Ctn9C4SOerZ2YHh6VWIrsI3Br8X-Jyu1XCfsMk8Lu; expires=Wed, 15 May 2024 12:28:43 GMT; Max-Age=604800; path=/; HttpOnly; SameSite=Strict
< Expires: Thu, 19 Nov 1981 08:52:00 GMT
< Cache-Control: no-store, no-cache, must-revalidate
< Pragma: no-cache
< Access-Control-Allow-Origin: *
< Content-Length: 1208
< Connection: close
< Content-Type: application/json
< 
* Closing connection

使用以下curlinfo

array(40) {
  ["url"]=>
  string(57) "http://localhost/user/2645f3b7-a187-47c0-95d3-0ab1696501eb/"
  ["content_type"]=>
  string(16) "application/json"
  ["http_code"]=>
  int(200)
  ["header_size"]=>
  int(703)
  ["request_size"]=>
  int(0)
  ["filetime"]=>
  int(-1)
  ["ssl_verify_result"]=>
  int(0)
  ["redirect_count"]=>
  int(0)
  ["total_time"]=>
  float(1.024873)
  ["namelookup_time"]=>
  float(5.2E-5)
  ["connect_time"]=>
  float(0.000393)
  ["pretransfer_time"]=>
  float(0.000602)
  ["size_upload"]=>
  float(44)
  ["size_download"]=>
  float(114)
  ["speed_download"]=>
  float(111)
  ["speed_upload"]=>
  float(42)
  ["download_content_length"]=>
  float(114)
  ["upload_content_length"]=>
  float(44)
  ["starttransfer_time"]=>
  float(1.024833)
  ["redirect_time"]=>
  float(0)
  ["redirect_url"]=>
  string(0) ""
  ["primary_ip"]=>
  string(3) "::1"
  ["certinfo"]=>
  array(0) {
  }
  ["primary_port"]=>
  int(80)
  ["local_ip"]=>
  string(3) "::1"
  ["local_port"]=>
  int(59910)
  ["http_version"]=>
  int(2)
  ["protocol"]=>
  int(1)
  ["ssl_verifyresult"]=>
  int(0)
  ["scheme"]=>
  string(4) "HTTP"
  ["appconnect_time_us"]=>
  int(0)
  ["connect_time_us"]=>
  int(393)
  ["namelookup_time_us"]=>
  int(52)
  ["pretransfer_time_us"]=>
  int(602)
  ["redirect_time_us"]=>
  int(0)
  ["starttransfer_time_us"]=>
  int(1024833)
  ["total_time_us"]=>
  int(1024873)
  ["effective_method"]=>
  string(4) "POST"
  ["capath"]=>
  string(0) ""
  ["cainfo"]=>
  string(0) ""
}

然后出现错误,没有详细信息,只有没有值的curlinfo

array(40) {
  ["url"]=>
  string(57) "http://localhost/role/ROLE-RKX0TRLT1QGF/"
  ["content_type"]=>
  NULL
  ["http_code"]=>
  int(0)
  ["header_size"]=>
  int(0)
  ["request_size"]=>
  int(0)
  ["filetime"]=>
  int(-1)
  ["ssl_verify_result"]=>
  int(0)
  ["redirect_count"]=>
  int(0)
  ["total_time"]=>
  float(0)
  ["namelookup_time"]=>
  float(0)
  ["connect_time"]=>
  float(0)
  ["pretransfer_time"]=>
  float(0)
  ["size_upload"]=>
  float(0)
  ["size_download"]=>
  float(0)
  ["speed_download"]=>
  float(0)
  ["speed_upload"]=>
  float(0)
  ["download_content_length"]=>
  float(-1)
  ["upload_content_length"]=>
  float(-1)
  ["starttransfer_time"]=>
  float(0)
  ["redirect_time"]=>
  float(0)
  ["redirect_url"]=>
  string(0) ""
  ["primary_ip"]=>
  string(0) ""
  ["certinfo"]=>
  array(0) {
  }
  ["primary_port"]=>
  int(0)
  ["local_ip"]=>
  string(0) ""
  ["local_port"]=>
  int(0)
  ["http_version"]=>
  int(0)
  ["protocol"]=>
  int(0)
  ["ssl_verifyresult"]=>
  int(0)
  ["scheme"]=>
  string(0) ""
  ["appconnect_time_us"]=>
  int(0)
  ["connect_time_us"]=>
  int(0)
  ["namelookup_time_us"]=>
  int(0)
  ["pretransfer_time_us"]=>
  int(0)
  ["redirect_time_us"]=>
  int(0)
  ["starttransfer_time_us"]=>
  int(0)
  ["total_time_us"]=>
  int(0)
  ["effective_method"]=>
  string(3) "GET"
  ["capath"]=>
  string(0) ""
  ["cainfo"]=>
  string(0) ""
}

显然,curl 甚至没有初始化并且崩溃了。 errno 设置为 43 BAD_FUNCTION_ARGUMENT,但无法找出导致此情况的原因。如果我只运行一部分测试,包括运行所有测试时出错的测试,则一切正常。

如果有人对如何找出导致此问题的原因有建议,也许是一些我没有听说过的卷曲选项。也许由于 CURLOPT_FORBID_REUSE 选项和“Connection: close”标头,我认为 apache 服务器上的最大连接数已关闭。

php curl
1个回答
0
投票

该错误是由当时使用的curl版本8.1.2造成的。如果您遇到意外的 43 BAD_FUNCTION_ARGUMENT 错误,请更新您的curl。在撰写本文时,curl 8.7.1 不会产生此错误。

© www.soinside.com 2019 - 2024. All rights reserved.