Использование неопределенной константы CURLOPT_TCP_FASTOPEN - PullRequest
6 голосов
/ 07 мая 2020

Если я использую опцию 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

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

ОС: 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

Ответы [ 2 ]

6 голосов
/ 12 мая 2020

Я решил ответить более широко, чтобы, надеюсь, помочь большему количеству людей, когда они сталкиваются с проблемами, связанными с этим, и Google для ответов

(Примечание: php время выполнения и Загруженные расширения могут различаться в зависимости от интерфейса командной строки и при доступе с веб-сервера) .

Каковы системные требования для этой функции?

Функция 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.

* 103 8 * Оно должно быть больше 3.6

Версия и параметры сборки Curl

Лучший способ проверить, доступна ли эта функция в curl, - это вызвать curl из cli с этим параметром, например: 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, если ничего не возвращается, расширение curl не загружается для php cli.

5 голосов
/ 14 мая 2020

Проблема заключалась в том, что tcp fast open не включен по умолчанию до версии ядра 3.13.

Чтобы включить TCP Fast Open на Centos 7:

1. Добавьте tcp_fastopen в sysctl.d

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

2.Перезапустите sysctl

systemctl restart systemd-sysctl

3.Проверьте настройки sysctl для tcp_fastopen

cat /proc/sys/net/ipv4/tcp_fastopen должно вывести 3

...