PHP / Codeigniter FTP Timeout - PullRequest
       10

PHP / Codeigniter FTP Timeout

1 голос
/ 12 июня 2010

Я пытаюсь получить доступ к FTP-серверу из своего PHP-скрипта, используя FTP-библиотеку Codeigniter. Эти функции прекрасно работают, но при тестировании сценария я обнаружил, что если я пытаюсь подключиться к несуществующему серверу, сценарий не завершается с сообщением об ошибке любого вида.

Страница продолжает выполняться, пока веб-сервер не сдастся, вернув пустой документ.

Поэтому мне интересно, есть ли способ ограничить время, в течение которого Codeigniter может пытаться подключиться к FTP-серверу, а затем отобразить сообщение, если это истекло?

Я пытался использовать функцию php set_time_limit (), но она не работает так, как я ожидал.

Спасибо за вашу помощь.

Ответы [ 2 ]

3 голосов
/ 12 июня 2010

Класс ftp Codeigniter использует базовый php-вызов ftp_connect, который поддерживает третий необязательный параметр timeout (http://ca2.php.net/manual/en/function.ftp-connect.php).

Codeigniter, однако, не использует его, но позволяет расширять библиотеки по умолчанию, которые он предоставляет (при условии, что вы готовы выполнить некоторую работу и убедиться, что любые обновления, которые вы делаете для ядра, не нарушат функциональность вашего расширенного класса) , Таким образом, чтобы решить вашу проблему, вы можете создать новую библиотеку в папке библиотеки приложения:

<?php

class MY_FTP extends CI_FTP { //Assuming that in your config.php file, your subclass prefix is set to 'MY_' like so: $config['subclass_prefix'] = 'MY_';

    var $timeout = 90;
    /**
     * FTP Connect
     *
     * @access  public
     * @param   array    the connection values
     * @return  bool
     */
    function connect($config = array())
    {
        if (count($config) > 0)
        {
            $this->initialize($config);
        }

        if (FALSE === ($this->conn_id = ftp_connect($this->hostname, $this->port, $this->timeout)))
        {
            if ($this->debug == TRUE)
            {
                $this->_error('ftp_unable_to_connect');
            }
            return FALSE;
        }

        if ( ! $this->_login())
        {
            if ($this->debug == TRUE)
            {
                $this->_error('ftp_unable_to_login');
            }
            return FALSE;
        }

        // Set passive mode if needed
        if ($this->passive == TRUE)
        {
            ftp_pasv($this->conn_id, TRUE);
        }

        return TRUE;
    }
}
?>

и из вашего скрипта вы можете добавить в массив конфигурации параметр тайм-аута:

$this->load->library('ftp'); //if ftp is not autoloaded
$ftp_params = array('hostname'=>'1.2.3.4', 'port'=>21, 'timeout'=>10); //timout is 10 seconds instead of default 90
$ftp_conn = $this->ftp->connect($ftp_params);
if(FALSE === $ftp_conn) {
//Code to handle error
}

Класс ftp не предназначен для выдачи сообщений об ошибках, если для параметра отладки не установлено значение TRUE в массиве конфигурации, в этом случае он просто отобразит ошибку. Однако это также может быть отменено, потому что все ошибки вызывают функцию _error () в классе. Таким образом, вы можете установить 'debug' => true в вашем массиве $ ftp_params и добавить функцию в MY_ftp следующим образом:

/**
 * This function overrides 
 */
function _error($line)
{
    $this->error = $line;
}

А потом есть функция getError () / ** * Эта функция переопределяет * / функция get_error () { вернуть $ this-> error; }

Так что если

$ftp_conn = $this->ftp->connect($ftp_params);

возвращает false, вы можете позвонить

$error = $this->ftp->get_error();

, чтобы получить ошибку и отобразить ее. Теперь вы всегда можете настроить и использовать более сложный механизм обработки ошибок, дополнительно настроив класс ...

Надеюсь, это ответит на ваш вопрос.

0 голосов
/ 12 июня 2010

Ответ прост: не пытайтесь подключиться к серверу, который не существует .

...