Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/codeigniter/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP/Codeigniter FTP超时_Php_Codeigniter_Ftp_Execution - Fatal编程技术网

PHP/Codeigniter FTP超时

PHP/Codeigniter FTP超时,php,codeigniter,ftp,execution,Php,Codeigniter,Ftp,Execution,我正在尝试使用Codeigniter的FTP库从我的PHP脚本访问FTP服务器。这些函数工作得很好,但是在测试脚本时,我发现如果我尝试连接到一个不存在的服务器,脚本不会以任何类型的错误消息终止 页面继续执行,直到web服务器放弃,返回一个空文档 所以我想知道,有没有办法限制Codeigniter尝试连接到FTP服务器的时间,然后在超时时显示消息 我尝试使用php函数set_time_limit(),但它的行为与我预期的不同 感谢您的帮助。答案很简单,不要尝试连接到不存在的服务器Codeignit

我正在尝试使用Codeigniter的FTP库从我的PHP脚本访问FTP服务器。这些函数工作得很好,但是在测试脚本时,我发现如果我尝试连接到一个不存在的服务器,脚本不会以任何类型的错误消息终止

页面继续执行,直到web服务器放弃,返回一个空文档

所以我想知道,有没有办法限制Codeigniter尝试连接到FTP服务器的时间,然后在超时时显示消息

我尝试使用php函数set_time_limit(),但它的行为与我预期的不同


感谢您的帮助。

答案很简单,不要尝试连接到不存在的服务器

Codeigniter的ftp类使用支持第三个可选参数timeout()的底层ftp\u 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;
    }
}
?>
ftp类的设计目的不是提供错误消息,除非在te config array中将debug参数设置为TRUE,在这种情况下,它只会显示一个错误。但是,它也可以被重写,因为所有错误都调用类中的函数_error()。因此,您可以在$ftp_params数组中设置'debug'=>true,并在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();
获取错误并显示它。 现在,您可以通过进一步定制类来定制和拥有更复杂的错误处理机制


希望它能回答您的问题。

是的,这是明智的,但我真的没有办法抓住这个错误吗?在我尝试连接到服务器之前,如何检查服务器是否存在?-1在一个完美的世界中,程序员可以假设用户可以被信任输入正确的信息。但是这永远不会发生。总是做最坏的打算。我不知道,也许是吧?有一些创造性的方法可以解决这个问题。我不是说信任用户,我是说在尝试连接之前进行验证。验证是我的应用最重要的一件事。在尝试FTP连接之前,我确实找到了一个很好的ping服务器的小脚本,但是它增加了额外的几秒钟的执行时间,如果服务器真的启动了,这并不是真正必要的。莫里斯提供的解决方案非常有效。图书馆的一个不错的小扩展。奇怪的是,CI没有使用内置php ftp函数的额外参数!谢谢你们的帮助,伙计们。哇!谢谢你,莫里斯!这非常有效。这其实非常简单。为什么CI在默认情况下不使用该选项?strage。。。。非常感谢你的帮助
$error = $this->ftp->get_error();