За последние 24 часа нас посетили 37259 программистов и 7910 роботов. Сейчас ищут 1782 программиста ...

ssh2_scp_send иногда зависает при отправке файла

Тема в разделе "PHP для новичков", создана пользователем miketm, 23 май 2023.

  1. miketm

    miketm Активный пользователь

    С нами с:
    29 июн 2015
    Сообщения:
    22
    Симпатии:
    0
    Друзья. Подскажите, пожалуйста, как побороть проблему.

    Исходные данные: Windows Server 2012 R2
    PHP 7.4.26
    php_ssh2.dll версии 7.4.13 дистрибутив версии 1.3.1, взятый тут: https://pecl.php.net/package/ssh2

    Проблема: функция ssh2_scp_send при отправке на удаленный сервер по непонятным причинам иногда намертво зависает

    Подробное описание: есть удаленный сервер, на который я периодически отправляю разные файлы.
    Файлы разного размера, но не супер большие: от 100 кб до 10 Мб.

    В 99.9% процентов случаев все проходит гладко: маленькие файлы загружаются моментально, большие - чуть подольше, но тоже успешно.
    Но вот проблема, иногда, т.е. реально очень не часто после вызова ssh2_scp_send загрузка намертво зависает.
    Почему это происходит - понять не могу. Но основная беда в том, что я не знаю обходного решения.

    Меня даже вполне бы устроило грохать скрипт, если он выполняется больше N секунд и для этого я пытался
    применить set_time_limit(), но потом понял, что это не помогает (если зависание случилось на ssh2_scp_send, то
    set_time_limit() не отстреливает скрипт). И если грохнуть скрипт вручную, то все сразу же продолжает работать.

    Фрагмент кода я привожу ниже.

    PS
    К сожалению, получить диагностическую информацию с сервера, на который осуществляется загрузка, не представляется возможным.

    PPS
    Из забавного. Этот самый вопрос я попытался задать GPT-боту и он мне с уверенностью отвечает, что
    функция ssh2_scp_send в последней версии библиотеки имеет параметр "таймаут" (6ой по счету), но я нигде не нашел
    информации на этот счет и, как ожидалось, если задать в ssh2_scp_send больше 4х параметров, появляется
    соответствующая диагностика о том, что параметров не может быть больше 4. Похоже GPT-бот это выдумал :)

    Буду благодарен за любые рекомендации, быть может есть другие библиотеки, где таких проблем нет?

    file_put_contents($log_file, date("Y-m-d H:i:s") . ": Starting uploading files via FTP \n", FILE_APPEND);
    set_time_limit(300);
    $connection = ssh2_connect('192.168.1.1', 22);
    if (false === $connection)
    {
    file_put_contents($log_file, date("Y-m-d H:i:s") . ": Error during FTP connection \n", FILE_APPEND);
    }
    else
    {
    $auth = @ssh2_auth_password($connection, 'login', 'password');
    if (false === $auth)
    {
    file_put_contents($log_file, date("Y-m-d H:i:s") . ": Error during FTP authentification \n", FILE_APPEND);
    }
    else
    {
    file_put_contents($log_file, date("Y-m-d H:i:s") . ": ".$html_file_name." lets try to upload \n", FILE_APPEND);
    $b=ssh2_scp_send($connection, $dir."/".$html_file_name, "folder_name/".$html_file_name, 0644);
    if ($b)
    {
    file_put_contents($log_file, date("Y-m-d H:i:s") . ": ".$html_file_name." upload OK \n", FILE_APPEND);
    }
    else
    {
    file_put_contents($log_file, date("Y-m-d H:i:s") . ": ".$html_file_name." upload ERROR \n", FILE_APPEND);
    }
    }
    $disconnection = ssh2_disconnect($connection);
    }
     
  2. miketm

    miketm Активный пользователь

    С нами с:
    29 июн 2015
    Сообщения:
    22
    Симпатии:
    0
    Ни у кого не будет идей по обозначенному вопросу? Может кто-то сможет предложить альтернативную, более надежную библиотеку? Заранее благодарю
     
  3. don.bidon

    don.bidon Активный пользователь

    С нами с:
    28 мар 2021
    Сообщения:
    947
    Симпатии:
    147
    идей нет, но ты даже не потрудился код оформить. знал бы ответ, всё равно проигнорил ))
     
  4. Aleksandr.B

    Aleksandr.B Активный пользователь

    С нами с:
    2 фев 2023
    Сообщения:
    159
    Симпатии:
    41
    Адрес:
    Барнаул
    Проверь доступность порта перед соединением.

    if (fsockopen(...))