使用未定义常量 CURLOPT_TCP_FASTOPEN

Use of undefined constant CURLOPT_TCP_FASTOPEN

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

Use of undefined constant CURLOPT_TCP_FASTOPEN - assumed '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

curl -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

OS : unix (Centos 7.x)

curl --tcp-fastopen -L http://www.google.com return 出现如下错误:

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

I chose to answer in a more broad way to hopefully help more poeple when they encounter issues relating to this and google for answers

(注意: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 此命令应该 return curl,如果没有 returned,则不会加载 curl 扩展对于 php 客户端。

问题是在内核版本 3.13 之前默认情况下不启用 tcp 快速打开。

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

1.Add tcp_fastopen 在 sysctl.d

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

2.Restart sysctl

systemctl restart systemd-sysctl

3.Verify tcp_fastopen

的 sysctl 设置

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