【问题标题】:Use of undefined constant CURLOPT_TCP_FASTOPEN使用未定义的常量 CURLOPT_TCP_FASTOPEN
【发布时间】:2020-08-22 07:39:38
【问题描述】:

如果我在代码中使用CURLOPT_TCP_FASTOPEN 选项,则会收到以下错误。

使用未定义的常量 CURLOPT_TCP_FASTOPEN - 假设 'CURLOPT_TCP_FASTOPEN'

CURLOPT_TCP_FASTOPEN 是 php 7.4.5 interface 中支持的选项。

php -v

PHP 7.4.5 (cli) (built: Apr 14 2020 12:54:33) ( NTS )
Copyright (c) The PHP Group
Zend Engine v3.4.0, Copyright (c) Zend Technologies
    with Zend OPcache v7.4.5, Copyright (c), by Zend Technologies

卷曲-V

curl 7.70.0 (x86_64-redhat-linux-gnu) libcurl/7.70.0 NSS/3.44 zlib/1.2.7 libpsl/0.7.0 (+libicu/50.1.2) libssh2/1.9.0 nghttp2/1.31.1
Release-Date: 2020-04-29
Protocols: dict file ftp ftps gopher http https imap imaps ldap ldaps pop3 pop3s rtsp scp sftp smb smbs smtp smtps telnet tftp
Features: AsynchDNS GSS-API HTTP2 HTTPS-proxy IPv6 Kerberos Largefile libz Metalink NTLM NTLM_WB PSL SPNEGO SSL UnixSockets

我在这里做错了什么?

编辑 1:

这里是与 YouriKoeman 的概述相对应的附加信息

内核版本:3.10.0-1062.12.1.el7.x86_64

操作系统:unix (Centos 7.x)

curl --tcp-fastopen -L http://www.google.com 返回以下错误:

curl: (55) Send failure: Operation not supported for curl --tcp-fastopen -L http://www.google.com

【问题讨论】:

  • 抱歉 - 只需检查它是否已启用 - stackoverflow.com/questions/22713591/…
  • @NigelRen curl 扩展已启用。我可以很好地提出 curl 请求,只有这个选项会导致问题
  • 能否分享一下这个命令的结果:php -r 'print_r(curl_version()['version']);'
  • 我收到了PHP Warning: Use of undefined constant version - assumed 'version' (this will throw an Error in a future version of PHP) in Command line code on line 1 你的命令
  • @0stone0 这里是 curl 的 phpinfo 的一部分-i.gyazo.com/710f2787f38aa4a6438612fdc9b3ac20.png

标签: php php-curl


【解决方案1】:

我选择以更广泛的方式回答,希望能在更多人遇到与此相关的问题时帮助他们并谷歌寻求答案

(注意:php 运行时和加载的扩展在 CLI 和从网络服务器访问时可能会有所不同)

此功能的系统要求是什么?

您要使用的功能CURLOPT_TCP_FASTOPEN 需要满足一些系统要求

它们是:

  1. 你必须有Kernel version > 3.6 (linux)
  2. 您必须拥有PHP 7.0.7 或更高版本
  3. 您必须拥有Curl(program) AND php{your/version}-curl 7.49.0 或更高版本
  4. 您必须拥有*nix 类型的操作系统(macos、linux、bsd)

如何调试不满足什么要求?

未定义常量这一事实是一个危险信号,即未满足这些依赖项之一,但我如何确定是哪个?

内核版本

这个很简单,运行以下命令: uname -r.

必须大于3.6

Curl 版本和构建选项

检查 curl 功能是否可用的最佳方法是使用此选项从 cli 调用 curl,例如: curl --tcp-fastopen -O http://google.com

如果这个请求成功,curl在你的系统上配置正确,所以问题出在php上

PHP 版本和扩展

对于网络服务器

使用phpinfo() 检查php version 是否大于7.0.7 以及php-curl 扩展是否已加载

对于 CLI

在命令行中输入php -v,版本应该大于7.0.7

要检查扩展,请在命令行中输入以下内容php -m | grep curl,此命令应返回curl,如果未返回任何内容,则不会为 php cli 加载 curl 扩展。

【讨论】:

  • 感谢您的详细回答。我收到以下错误。curl: (55) Send failure: Operation not supported for curl --tcp-fastopen -L http://www.google.com 。 curl 的构建选项中可能缺少某些内容
  • 您可以使用自定义 repo 中的此构建选项安装 curl 二进制文件,遗憾的是我不知道 redhat。我确定可以使用的选项是使用所述构建选项自己构建 curl
  • Ps:这也可能意味着你的内核版本不是最新的(需要支持send()networking 命令)。你的内核版本是 > 3.6(高于 3.6,而不是 3.6 本身)
  • 运行以下命令以确保您是官方(或您的自定义)存储库可以提供的最新版本:yum -y update kernelyum remove curlyum install curl
【解决方案2】:

问题是直到内核版本 3.13 才默认启用 tcp 快速打开。

在 Centos 7 上启用 TCP 快速打开:

1.在sysctl.d中添加tcp_fastopen

echo "net.ipv4.tcp_fastopen=3" > /etc/sysctl.d/30-tcp_fastopen.conf 

2.重启sysctl

systemctl restart systemd-sysctl

3.验证 tcp_fastopen 的 sysctl 设置

cat /proc/sys/net/ipv4/tcp_fastopen 应该输出 3

【讨论】:

  • 我不知道默认情况下它是关闭的(我运行滚动发行版)。好发现!很高兴它已修复
猜你喜欢
  • 2011-05-20
  • 2014-08-27
  • 2018-12-28
  • 2016-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-05-24
相关资源
最近更新 更多