2010-06-12 6 views
1

Codeigniter의 FTP 라이브러리를 사용하여 PHP 스크립트에서 FTP 서버에 액세스하려고합니다. 이 함수는 훌륭하게 작동하지만 스크립트를 테스트 할 때 존재하지 않는 서버에 연결하려고하면 스크립트가 어떤 종류의 오류 메시지로 종료되지 않는다는 것을 발견했습니다.PHP/Codeigniter FTP Timeout

웹 서버가 포기하고 빈 문서를 반환 할 때까지 페이지가 계속 실행됩니다.

그래서 Codeigniter가 FTP 서버에 연결하려고 시도 할 수있는 시간을 제한하는 방법이 있는지 궁금합니다. 시간이 초과되면 메시지를 표시 하시겠습니까?

PHP 함수 set_time_limit()을 사용해 보았지만 예상 한대로 동작하지 않습니다.

도움 주셔서 감사합니다.

답변

3

Codeigniter의 ftp 클래스는 세 번째 선택적 매개 변수 timeout (http://ca2.php.net/manual/en/function.ftp-connect.php)을 지원하는 기본 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() 함수를 호출하기 때문에 재정의 될 수도 있습니다. 그래서 당신은 당신의 $의 ftp_params 배열 => 진정한 '디버그'를 설정하고,과 같이 MY_ftp에 기능을 추가 할 수 있습니다

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

을 그리고 기능은 GetError이() /** *이 기능은 를 오버라이드 (override) */ function get_error() { return $ this-> error;

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

false를 반환하는 경우 }

그래서, 당신은 당신의 오류 및 표시 할

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

를 호출 할 수 있습니다. 이제 클래스를 추가로 사용자 정의하여 더 복잡한 오류 처리 메커니즘을 사용자 정의하고 가질 수 있습니다 ...

희망 사항이 귀하의 질문에 응답합니다.

+0

와우! 고마워 Maurice! 완벽하게 작동했습니다. 실제로는 매우 간단했습니다. CI가 기본적으로이 옵션을 사용하지 않는 이유는 무엇입니까? strage .... 도움을 많이 주셔서 감사합니다 : D –

+0

당신을 환영합니다! 내가 도울 수있어서 다행 :) –

-1

대답은 간단합니다. 은 존재하지 않는 서버에 연결을 시도하지 마십시오..

+0

그래, 그게 현명한 것입니다,하지만 단순히 나를 위해이 오류를 함정에 대한 방법은 무엇입니까? 서버에 연결하기 전에 서버가 존재하는지 확인하는 방법은 어떻습니까? –

+0

-1 완벽한 세계에서 프로그래머는 사용자가 올바른 정보를 입력하도록 신뢰할 수 있다고 가정 할 수 있습니다. 그러나 ... 그것은 결코 일어나지 않습니다. 항상 최악의 상황에 대비하십시오. – gruntled

+0

잘 모르겠다. [ping] (http://www.dynamicdrive.com/forums/showthread.php?t=37370)? 이 문제를 해결하기위한 창의적인 방법이 있습니다. 나는 ** 사용자 **를 신뢰하지 않는다고 말하면서 * 접속을 시도하기 전에 검증을한다고 말하고있다. –