Проблема с потоковой сетью на php5.6-fpm с помощью функции ftp_put()

#php #apache #ftp #fastcgi

Вопрос:

я схожу с ума от этого php-скрипта: до перехода на php5.6-fpm он всегда работал (до этого я использовал apache2 mod_php), теперь, когда я загружаю файл и настраиваю ftp-соединение с другим сервером, чтобы сохранить его, я получаю эту ошибку:

Предупреждение: ftp_put(): Сбой чтения сетевого потока

Сценарий очень прост:

 lt;?php  $remotePath = '/httpdocs/2/3/9/6/7/8/8/'; $newFileName = time() . '.png';  $ftp = ftp_ssl_connect( 'example.com', 21 );  ftp_login( $ftp, 'username', 'password' );  ftp_pasv( $ftp, true );  ftp_put( $ftp, $remotePath . $newFileName, $_FILES['upload']['tmp_name'], FTP_BINARY );  ftp_close( $ftp );  

Я включил журналы на целевом сервере, и это результат операции:

 CONNECT: Client  FTP response: Client "220 (vsFTPd 3.0.3)" FTP command: Client "AUTH TLS" FTP response: Client "234 Proceed with negotiation." FTP command: Client "PBSZ 0" FTP response: Client "200 PBSZ set to 0." FTP command: Client "PROT P" FTP response: Client "200 PROT now Private." FTP command: Client "USER user" [user] FTP response: Client "331 Please specify the password." [user] FTP command: Client "PASS lt;passwordgt;" [user] OK LOGIN: Client "::ffff:0.0.0.0" [user] FTP response: Client "230 Login successful." [user] FTP command: Client "TYPE A" [user] FTP response: Client "200 Switching to ASCII mode." [user] FTP command: Client "PORT 46,4,20,119,230,43" [user] FTP response: Client "200 PORT command successful. Consider using PASV." [user] FTP command: Client "LIST /httpdocs/2/3/9/6/7/8/8" [user] FTP response: Client "150 Here comes the directory listing." [user] FTP response: Client "226 Directory send OK." [user] FTP command: Client "CWD /httpdocs/2" [user] FTP response: Client "250 Directory successfully changed." [user] FTP command: Client "CWD /httpdocs/2/3" [user] FTP response: Client "250 Directory successfully changed." [user] FTP command: Client "CWD /httpdocs/2/3/9" [user] FTP response: Client "250 Directory successfully changed." [user] FTP command: Client "CWD /httpdocs/2/3/9/6" [user] FTP response: Client "250 Directory successfully changed." [user] FTP command: Client "CWD /httpdocs/2/3/9/6/7" [user] FTP response: Client "250 Directory successfully changed." [user] FTP command: Client "CWD /httpdocs/2/3/9/6/7/8" [user] FTP response: Client "250 Directory successfully changed." [user] FTP command: Client "CWD /httpdocs/2/3/9/6/7/8/8" [user] FTP response: Client "250 Directory successfully changed." [user] FTP command: Client "CWD /httpdocs/2/3/9/6/7/8/8" [user] FTP response: Client "250 Directory successfully changed." [user] FTP command: Client "TYPE I" [user] FTP response: Client "200 Switching to Binary mode." [user] FTP command: Client "PORT 46,4,20,119,197,1" [user] FTP response: Client "200 PORT command successful. Consider using PASV." [user] FTP command: Client "STOR /httpdocs/2/3/9/6/7/8/8/1636513356.png" [user] FTP response: Client "150 Ok to send data." [user] FTP response: Client "426 Failure reading network stream." [user] FAIL UPLOAD: Client "/httpdocs/2/3/9/6/7/8/8/1636513356.png", 40950 bytes, 290.83Kbyte/sec [user] FTP command: Client "QUIT" [user] FTP response: Client "221 Goodbye."  

Я не знаю почему, но, похоже, команда пассивного режима не отправлена. Целевой сервер всегда один и тот же, и с тем же сценарием на другом сервере, но без php-fpm он работает отлично.

Сервер, на котором выполняется скрипт, основан на Debian 11, Apache 2.4 и php5.6-fpm; существует ли вероятность того, что выполнение php будет остановлено до завершения передачи? Я отключил брандмауэр для тестирования, но та же ошибка; также попробовал на другом сервере (с Deb 10 и php5.6-fpm) с тем же результатом 🙁

Забавный факт, попробовал использовать php7.4-fpm и php8.0-fpm на одном сервере, и это работает! Поэтому я думаю, что это неправильная конфигурация или настройка в php5.6… Есть идеи?

Комментарии:

1. Что ftp_pasv возвращается?

2. он возвращает значение true 🙁

Ответ №1:

Проблема решена, после целой ночи попыток понять, я пишу решение здесь, чтобы оно могло быть полезно кому-то еще: php5.6 не поддерживает протокол TLSv1.3, поэтому я отредактировал file /etc/ssl/openssl.cnf и установил system_default_sect максимальный уровень для TLS, перезапустил php-fpm и… это сработало!

 [system_default_sect] MinProtocol = TLSv1.2 MaxProtocol = TLSv1.2 CipherString = DEFAULT@SECLEVEL=2  

Для полноты эта директива не влияет на Apache2, протокол TLSv1.3 остается неизменным для веб-страниц 🙂