• Welcome to the Chevereto user community!

    Here users from all over the world gather around to learn the latest about Chevereto and contribute with ideas to improve the software.

    Please keep in mind:

    • 😌 This community is user driven. Be polite with other users.
    • 👉 Is required to purchase a Chevereto license to participate in this community (doesn't apply to Pre-sales).
    • 💸 Purchase a Pro Subscription to get access to active software support and faster ticket response times.

Multi-Server Support / CDN option

Status
Not open for further replies.
Well, Here's I'm currently using Scripteen Free Image Hosting (Not Supported)

http://www.scripteen.com/scripts/scripteen-free-image-hosting-script.html

They do offer have a multi server ftp, api/class and I've googled some of the code and appears they're using a pre-made class, but can't find the source anywhere.

Once or if you do, I've considered created a multi-three dimensional array to be able to add more than 1 FTP Server.

ftp.api.php
Code:
<?
    if (!function_exists("ftp_connect")) {
    
        require_once "ftp.class.php";
    
        function ftp_connect($host,$port=21,$timeout=0) { // Opens an FTP connection
            if ($timeout<1) $timeout = 90;
            $ftp =& new FTP();
            if (!$ftp->connect($host,$port,$timeout)) return false;
            return $ftp;
        }
        function ftp_login($ftp,$user,$pass) { // Logs in to an FTP connection
            return $ftp->login($user,$pass);
        }
        function ftp_close($ftp) { // Closes an FTP connection
            $ftp->disconnect();
        }

        function ftp_cdup($ftp) { // Changes to the parent directory
            return $ftp->cdup();
        }
        function ftp_chdir($ftp,$directory) { // Changes directories on a FTP server
            return $ftp->chdir($directory);
        }
        function ftp_chmod($ftp,$mode,$filename) { // Set permissions on a file via FTP
            return $ftp->chmod($mode,$filename);
        }
        function ftp_delete($ftp,$path) { // Deletes a file on the FTP server
            return $ftp->delete($path);
        }
        function ftp_exec($ftp,$command) { // Requests execution of a program on the FTP server
            return $ftp->exec($command);
        }
        function ftp_fget($ftp,$handle,$remote_file,$mode,$resumepos=0) { // Downloads a file from the FTP server and saves to an open file
            return $ftp->fget($handle,$remote_file,$mode,$resumepos);
        }
        function ftp_fput($ftp,$remote_file,$handle,$mode,$startpos=0) { // Uploads from an open file to the FTP server
            return $ftp->fput($remote_file,$handle,$mode,$startpos);
        }
        function ftp_get_option($ftp,$option) { // Retrieves various runtime behaviours of the current FTP stream
            return $ftp->get_option($option);
        }
        function ftp_get($ftp,$local_file,$remote_file,$mode,$resumepos=0) { // Downloads a file from the FTP server
            return $ftp->get($local_file,$remote_file,$mode,$resumepos);
        }
        function ftp_mdtm($ftp,$remote_file) { // Returns the last modified time of the given file
            return $ftp->mdtm($remote_file);
        }
        function ftp_mkdir($ftp,$directory) { // Creates a directory
            return $ftp->mkdir($directory);
        }
        function ftp_nb_continue($ftp) { // Continues retrieving/sending a file (non-blocking)
            return $ftp->nb_continue();
        }
        function ftp_nb_fget($ftp,$handle,$remote_file,$mode,$resumepos=0) { // Retrieves a file from the FTP server and writes it to an open file (non-blocking)
            return $ftp->nb_fget($handle,$remote_file,$mode,$resumepos);
        }
        function ftp_nb_fput($ftp,$remote_file,$handle,$mode,$startpos=0) { // Stores a file from an open file to the FTP server (non-blocking)
            return $ftp->nb_fput($remote_file,$handle,$mode,$startpos);
        }
        function ftp_nb_get($ftp,$local_file,$remote_file,$mode,$resumepos=0) { // Retrieves a file from the FTP server and writes it to a local file (non-blocking)
            return $ftp->nb_get($local_file,$remote_file,$mode,$resumepos);
        }
        function ftp_nb_put($ftp,$remote_file,$local_file,$mode,$startpos=0) { // Stores a file on the FTP server (non-blocking)
            return $ftp->nb_put($remote_file,$local_file,$mode,$startpos);
        }
        function ftp_nlist($ftp,$directory="") { // Returns a list of files in the given directory
            return $ftp->nlist($directory);
        }
        function ftp_pasv($ftp,$pasv) { // Turns passive mode on or off
            return $ftp->pasv($pasv);
        }
        function ftp_put($ftp,$remote_file,$local_file,$mode,$startpos=0) { // Uploads a file to the FTP server
            return $ftp->put($remote_file,$local_file,$mode,$startpos);
        }
        function ftp_pwd($ftp) { // Returns the current directory name
            return $ftp->pwd();
        }
        function ftp_quit($ftp) { // Alias of ftp_close
            return $ftp->quit();
        }
        function ftp_raw($ftp,$command) { // Sends an arbitrary command to an FTP server
            return $ftp->raw($command);
        }
        function ftp_rawlist($ftp,$directory="") { // Returns a detailed list of files in the given directory
            return $ftp->rawlist($directory);
        }
        function ftp_rename($ftp,$from,$to) { // Renames a file on the FTP server
            return $ftp->rename($from,$to);
        }
        function ftp_rmdir($ftp,$directory) { // Removes a directory
            return $ftp->rmdir($directory);
        }
        function ftp_set_option($ftp,$option,$value) { // Set miscellaneous runtime FTP options
            return $ftp->set_option($option,$value);
        }
        function ftp_site($ftp,$cmd) { // Sends a SITE command to the server
            return $ftp->site($cmd);
        }
        function ftp_size($ftp,$remote_file) { // Returns the size of the given file
            return $ftp->size($remote_file);
        }
        function ftp_ssl_connect($host,$port=21,$timeout=0) { // Opens an Secure SSL-FTP connection
            if ($timeout<1) $timeout = 90;
            $ftp =& new FTP();
            if (!$ftp->ssl_connect($host,$port,$timeout)) return false;
            return $ftp;
        }
        function ftp_systype($ftp) { // Returns the system type identifier of the remote FTP server
            return $ftp->systype();
        }
    }
?>

ftp.class.php
Code:
<?

    define("FTP_TIMEOUT",90);

    // FTP Statuscodes
    define("FTP_COMMAND_OK",200);
    define("FTP_FILE_ACTION_OK",250);
    define("FTP_FILE_TRANSFER_OK",226);
    define("FTP_COMMAND_NOT_IMPLEMENTED",502);
    define("FTP_FILE_STATUS",213);
    define("FTP_NAME_SYSTEM_TYPE",215);
    define("FTP_PASSIVE_MODE",227);
    define("FTP_PATHNAME",257);
    define("FTP_SERVICE_READY",220);
    define("FTP_USER_LOGGED_IN",230);
    define("FTP_PASSWORD_NEEDED",331);
    define("FTP_USER_NOT_LOGGED_IN",530);
    
    if (!defined("FTP_ASCII")) define("FTP_ASCII",0);
    if (!defined("FTP_BINARY")) define("FTP_BINARY",1);

    class FTP {

        var $passiveMode = TRUE;
        var $lastLines = array();
        var $lastLine = "";
        var $controlSocket = NULL;
        var $newResult = FALSE;
        var $lastResult = -1;
        var $pasvAddr = NULL; 
        
        var $error_no = NULL;
        var $error_msg = NULL;
        
        function FTP() {
        }

        function connect($host, $port=21, $timeout=FTP_TIMEOUT) { //Opens an FTP connection
            $this->_resetError();

            $err_no = 0;
            $err_msg = "";
            $this->controlSocket = @fsockopen($host, $port, $err_no, $err_msg, $timeout) or $this->_setError(-1,"fsockopen failed"); 
            if ($err_no<>0) $this->setError($err_no,$err_msg);

            if ($this->_isError()) return false;
            
            @socket_set_timeout($this->controlSocket,$timeout) or $this->_setError(-1,"socket_set_timeout failed");
            if ($this->_isError()) return false;
            
            $this->_waitForResult();
            if ($this->_isError()) return false;
            
            return $this->getLastResult() == FTP_SERVICE_READY;
        }
        
        function isConnected() {
            return $this->controlSocket != NULL;
        }
        
        function disconnect() {
            if (!$this->isConnected()) return;
            @fclose($this->controlSocket);
        }

        function close() { //Closes an FTP connection
            $this->disconnect();
        }
        
        function login($user, $pass) {  //Logs in to an FTP connection
            $this->_resetError();

            $this->_printCommand("USER $user");
            if ($this->_isError()) return false;

            $this->_waitForResult();
            if ($this->_isError()) return false;

            if ($this->getLastResult() == FTP_PASSWORD_NEEDED){
                $this->_printCommand("PASS $pass");
                if ($this->_isError()) return FALSE;

                $this->_waitForResult();
                if ($this->_isError()) return FALSE;
            }
            
            $result = $this->getLastResult() == FTP_USER_LOGGED_IN;
            return $result;
        }

        function cdup() { //Changes to the parent directory
            $this->_resetError();

            $this->_printCommand("CDUP");
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if ($this->_isError()) return FALSE;
            return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK);
        }
        
        function cwd($path) {
            $this->_resetError();

            $this->_printCommand("CWD $path");
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if ($this->_isError()) return FALSE;
            return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK);
        }

        function cd($path) {
            return $this->cwd($path);
        }

        function chdir($path) { //Changes directories on a FTP server
            return $this->cwd($path);
        }

        function chmod($mode,$filename) { //Set permissions on a file via FTP
            return $this->site("CHMOD $mode $filename");
        }

        function delete($filename) { //Deletes a file on the FTP server
            $this->_resetError();

            $this->_printCommand("DELE $filename");
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if ($this->_isError()) return FALSE;
            return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK);
        }

        function exec($cmd) { //Requests execution of a program on the FTP server
            return $this->site("EXEC $cmd");
        }

        function fget($fp,$remote,$mode=FTP_BINARY,$resumepos=0) { //Downloads a file from the FTP server and saves to an open file
            $this->_resetError();
            
            $type = "I";
            if ($mode==FTP_ASCII) $type = "A";
            
            $this->_printCommand("TYPE $type");
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if ($this->_isError()) return FALSE;
            
            $result = $this->_download("RETR $remote");
            if ($result) {
                fwrite($fp,$result);
            }
            return $result;
        }

        function fput($remote,$resource,$mode=FTP_BINARY,$startpos=0) { //Uploads from an open file to the FTP server
            $this->_resetError();
            
            $type = "I";
            if ($mode==FTP_ASCII) $type = "A";
            
            $this->_printCommand("TYPE $type");
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if ($this->_isError()) return FALSE;
            
            if ($startpos>0) fseek($resource,$startpos);
            $result = $this->_uploadResource("STOR $remote",$resource);
            return $result;
        }

        function get_option($option) { //Retrieves various runtime behaviours of the current FTP stream
            $this->_resetError();

            switch ($option) {
                case "FTP_TIMEOUT_SEC" : return FTP_TIMEOUT;
                case "PHP_FTP_OPT_AUTOSEEK" : return FALSE;
            }
            setError(-1,"Unknown option: $option");
            return false;
        }

        function get($locale,$remote,$mode=FTP_BINARY,$resumepos=0) { //Downloads a file from the FTP server
            if (!($fp = @fopen($locale,"wb"))) return FALSE;
            $result = $this->fget($fp,$remote,$mode,$resumepos);
            @fclose($fp);
            if (!$result) @unlink($locale);
            return $result;
        }
        function mdtm($name) { //Returns the last modified time of the given file
            $this->_resetError();

            $this->_printCommand("MDTM $name");
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if ($this->_isError()) return FALSE;
            if ($lr!=FTP_FILE_STATUS) return FALSE;
            $subject = trim(substr($this->lastLine,4));
            $lucifer = array();
            if (preg_match("/([0-9][0-9][0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])([0-9][0-9])/",$subject,$lucifer)) return mktime($lucifer[4],$lucifer[5],$lucifer[6],$lucifer[2],$lucifer[3],$lucifer[1],0);
            return FALSE;
        }

        function mkdir($name) { //Creates a directory
            $this->_resetError();

            $this->_printCommand("MKD $name");
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if ($this->_isError()) return FALSE;
            return ($lr==FTP_PATHNAME || $lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK);
        }

        function nb_continue() { //Continues retrieving/sending a file (non-blocking)
            $this->_resetError();
            // todo
        }

        function nb_fget() { //Retrieves a file from the FTP server and writes it to an open file (non-blocking)
            $this->_resetError();
            // todo
        }

        function nb_fput() { //Stores a file from an open file to the FTP server (non-blocking)
            $this->_resetError();
            // todo
        }

        function nb_get() { //Retrieves a file from the FTP server and writes it to a local file (non-blocking)
            $this->_resetError();
            // todo
        }

        function nb_put() { //Stores a file on the FTP server (non-blocking)
            $this->_resetError();
            // todo
        }

        function nlist($remote_filespec="") { //Returns a list of files in the given directory
            $this->_resetError();
            $result = $this->_download(trim("NLST $remote_filespec"));
            return ($result !== FALSE) ? explode("\n",str_replace("\r","",trim($result))) : $result;
        }
        
        function pasv($pasv) { //Turns passive mode on or off
            if (!$pasv) {
                $this->_setError("Active (PORT) mode is not supported");
                return false;
            }
            return true;
        }

        function put($remote,$local,$mode=FTP_BINARY,$startpos=0) { //Uploads a file to the FTP server
            if (!($fp = @fopen($local,"rb"))) return FALSE;
            $result = $this->fput($remote,$fp,$mode,$startpos);
            @fclose($fp);
            return $result;
        }

        function pwd() { //Returns the current directory name
            $this->_resetError();

            $this->_printCommand("PWD");
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if ($this->_isError()) return FALSE;
            if ($lr!=FTP_PATHNAME) return FALSE;
            $subject = trim(substr($this->lastLine,4));
            $lucifer = array();
            if (preg_match("/\"(.*)\"/",$subject,$lucifer)) return $lucifer[1];
            return FALSE;
        }

        function quit() { //Alias of close
            $this->close();
        }

        function raw($cmd) { //Sends an arbitrary command to an FTP server
            $this->_resetError();

            $this->_printCommand($cmd);
            $this->_waitForResult();
            $this->getLastResult();
            return array($this->lastLine);
        }

        function rawlist($remote_filespec="") { //Returns a detailed list of files in the given directory
            $this->_resetError();
            $result = $this->_download(trim("LIST $remote_filespec"));
            return ($result !== FALSE) ? explode("\n",str_replace("\r","",trim($result))) : $result;
        }
        
        function ls($remote_filespec="") { //Returns a parsed rawlist in an assoc array
            $a = $this->rawlist($remote_filespec);
            if (!$a) return $a;
            $systype = $this->systype();
            $is_windows = stristr($systype,"WIN")!==FALSE;
            $b = array();
            while (list($i,$line) = each($a)) {
                if ($is_windows && preg_match("/([0-9]{2})-([0-9]{2})-([0-9]{2}) +([0-9]{2}):([0-9]{2})(AM|PM) +([0-9]+|<DIR>) +(.+)/",$line,$lucifer)) {
                    $b[$i] = array();
                    if ($lucifer[3]<70) { $lucifer[3]+=2000; } else { $lucifer[3]+=1900; } // 4digit year fix
                    $b[$i]['isdir'] = ($lucifer[7]=="<DIR>");
                    $b[$i]['size'] = $lucifer[7];
                    $b[$i]['month'] = $lucifer[1];
                    $b[$i]['day'] = $lucifer[2];
                    $b[$i]['year'] = $lucifer[3];
                    $b[$i]['hour'] = $lucifer[4];
                    $b[$i]['minute'] = $lucifer[5];
                    $b[$i]['time'] = @mktime($lucifer[4]+(strcasecmp($lucifer[6],"PM")==0?12:0),$lucifer[5],0,$lucifer[1],$lucifer[2],$lucifer[3]);
                    $b[$i]['am/pm'] = $lucifer[6];
                    $b[$i]['name'] = $lucifer[8];
                } else if (!$is_windows && $lucifer=preg_split("/[ ]/",$line,9,PREG_SPLIT_NO_EMPTY)) {
                    echo $line."\n";
                    $lcount=count($lucifer);
                    if ($lcount<8) continue;
                    $b[$i] = array();
                    $b[$i]['isdir'] = $lucifer[0]{0} === "d";
                    $b[$i]['islink'] = $lucifer[0]{0} === "l";
                    $b[$i]['perms'] = $lucifer[0];
                    $b[$i]['number'] = $lucifer[1];
                    $b[$i]['owner'] = $lucifer[2];
                    $b[$i]['group'] = $lucifer[3];
                    $b[$i]['size'] = $lucifer[4];
                    if ($lcount==8) {
                        sscanf($lucifer[5],"%d-%d-%d",$b[$i]['year'],$b[$i]['month'],$b[$i]['day']);
                        sscanf($lucifer[6],"%d:%d",$b[$i]['hour'],$b[$i]['minute']);
                        $b[$i]['time'] = @mktime($b[$i]['hour'],$b[$i]['minute'],0,$b[$i]['month'],$b[$i]['day'],$b[$i]['year']);
                        $b[$i]['name'] = $lucifer[7];
                    } else {
                        $b[$i]['month'] = $lucifer[5];
                        $b[$i]['day'] = $lucifer[6];
                        if (preg_match("/([0-9]{2}):([0-9]{2})/",$lucifer[7],$l2)) {
                            $b[$i]['year'] = date("Y");
                            $b[$i]['hour'] = $l2[1];
                            $b[$i]['minute'] = $l2[2];
                        } else {
                            $b[$i]['year'] = $lucifer[7];
                            $b[$i]['hour'] = 0;
                            $b[$i]['minute'] = 0;
                        }
                        $b[$i]['time'] = strtotime(sprintf("%d %s %d %02d:%02d",$b[$i]['day'],$b[$i]['month'],$b[$i]['year'],$b[$i]['hour'],$b[$i]['minute']));
                        $b[$i]['name'] = $lucifer[8];
                    }
                }
            }
            return $b;
        }

        function rename($from,$to) { //Renames a file on the FTP server
            $this->_resetError();

            $this->_printCommand("RNFR $from");
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if ($this->_isError()) return FALSE;
            $this->_printCommand("RNTO $to");
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if ($this->_isError()) return FALSE;
            return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK);
        }

        function rmdir($name) { //Removes a directory
            $this->_resetError();

            $this->_printCommand("RMD $name");
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if ($this->_isError()) return FALSE;
            return ($lr==FTP_FILE_ACTION_OK || $lr==FTP_COMMAND_OK);
        }

        function set_option() { //Set miscellaneous runtime FTP options
            $this->_resetError();
            $this->_setError(-1,"set_option not supported");
            return false;
        }

        function site($cmd) { //Sends a SITE command to the server
            $this->_resetError();

            $this->_printCommand("SITE $cmd");
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if ($this->_isError()) return FALSE;
            return true;
        }

        function size($name) { //Returns the size of the given file
            $this->_resetError();

            $this->_printCommand("SIZE $name");
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if ($this->_isError()) return FALSE;
            return $lr==FTP_FILE_STATUS ? trim(substr($this->lastLine,4)) : FALSE;
        }

        function ssl_connect() { //Opens an Secure SSL-FTP connection
            $this->_resetError();
            $this->_setError(-1,"ssl_connect not supported");
            return false;
        }

        function systype() { // Returns the system type identifier of the remote FTP server
            $this->_resetError();

            $this->_printCommand("SYST");
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if ($this->_isError()) return FALSE;
            return $lr==FTP_NAME_SYSTEM_TYPE ? trim(substr($this->lastLine,4)) : FALSE;
        }

        function getLastResult() {
            $this->newResult = FALSE;
            return $this->lastResult;
        }
        
        /* private */
        function _hasNewResult() {
            return $this->newResult;
        }
        
        /* private */
        function _waitForResult() {
            while(!$this->_hasNewResult() && $this->_readln()!==FALSE && !$this->_isError()) { /* noop  */ }
        }
        
        /* private */
        function _readln() {
            $line = fgets($this->controlSocket);
            if ($line === FALSE) {
                $this->_setError(-1,"fgets failed in _readln");
                return FALSE;
            }
            if (strlen($line)==0) return $line;

            $lucifer = array();
            if (preg_match("/^[0-9][0-9][0-9] /",$line,$lucifer)) {
                //its a resultline
                $this->lastResult = intval($lucifer[0]);
                $this->newResult = TRUE;
                if (substr($lucifer[0],0,1)=='5') {
                    $this->_setError($this->lastResult,trim(substr($line,4)));
                }
            }
    
            $this->lastLine = trim($line);
            $this->lastLines[] = "< ".trim($line);
            return $line;
        }
        
        /* private */
        function _printCommand($line) {
            $this->lastLines[] = "> ".$line;
            fwrite($this->controlSocket,$line."\r\n");
            fflush($this->controlSocket);
        }
        
        /* private */
        function _pasv() {
            $this->_resetError();
            $this->_printCommand("PASV");
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if ($this->_isError()) return FALSE;
            if ($lr!=FTP_PASSIVE_MODE) return FALSE;
            $subject = trim(substr($this->lastLine,4));
            $lucifer = array();
            if (preg_match("/\\((\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3}),(\d{1,3})\\)/",$subject,$lucifer)) {
                $this->pasvAddr=$lucifer;
                
                $host = sprintf("%d.%d.%d.%d",$lucifer[1],$lucifer[2],$lucifer[3],$lucifer[4]);
                $port = $lucifer[5]*256 + $lucifer[6];
                
                $err_no=0;
                $err_msg="";
                $passiveConnection = fsockopen($host,$port,$err_no,$err_msg, FTP_TIMEOUT);
                if ($err_no!=0) {
                    $this->_setError($err_no,$err_msg);
                    return FALSE;
                }

                return $passiveConnection;
            }
            return FALSE;
        }
        
        /* private */
        function _download($cmd) {
            if (!($passiveConnection = $this->_pasv())) return FALSE;
            $this->_printCommand($cmd);
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if (!$this->_isError()) {
                $result = "";
                while (!feof($passiveConnection)) {
                    $result .= fgets($passiveConnection);
                }
                fclose($passiveConnection);
                $this->_waitForResult();
                $lr = $this->getLastResult();
                return ($lr==FTP_FILE_TRANSFER_OK) || ($lr==FTP_FILE_ACTION_OK) || ($lr==FTP_COMMAND_OK) ? $result : FALSE;
            } else {
                fclose($passiveConnection);
                return FALSE;
            }
        }

        /* upload */
        function _uploadResource($cmd,$resource) {
            if (!($passiveConnection = $this->_pasv())) return FALSE;
            $this->_printCommand($cmd);
            $this->_waitForResult();
            $lr = $this->getLastResult();
            if (!$this->_isError()) {
                $result = "";
                while (!feof($resource)) {
                    $buf = fread($resource,1024);
                    fwrite($passiveConnection,$buf);
                }
                fclose($passiveConnection);
                $this->_waitForResult();
                $lr = $this->getLastResult();
                return ($lr==FTP_FILE_TRANSFER_OK) || ($lr==FTP_FILE_ACTION_OK) || ($lr==FTP_COMMAND_OK) ? $result : FALSE;
            } else {
                fclose($passiveConnection);
                return FALSE;
            }
        }
        
        /* private */
        function _resetError() {
            $this->error_no = NULL;
            $this->error_msg = NULL;
        }

        /* private */
        function _setError($no,$msg) {
            if (is_array($this->error_no)) {
                $this->error_no[] = $no;
                $this->error_msg[] = $msg;
            } else if ($this->error_no!=NULL) {
                $this->error_no = array($this->error_no,$no);
                $this->error_msg = array($this->error_msg,$msg);
            } else {
                $this->error_no = $no;
                $this->error_msg = $msg;
            }
        }
        
        /* private */
        function _isError() {
            return ($this->error_no != NULL) && ($this->error_no !== 0);
        }

    }
?>
 
if you use any code from Scripteen, better trible check it, they have so many security holes in their scripts.
 
Let's follow up the whole multiserver topic here and please don't bump old topics or send me PM regarding this. One time is enough, thanks

The thing that you must understand is that a multi-server setup is mostly useless for the main goal which I believe is distribute the site load among several servers. It doesn't work that way. This is because you will always need a central server which handles and deliver all the requests. As you may imagine, this is the server with the highest load, everybody knows that host and serve static files is not a huge load at all.

So, if you think that just setting up two or more servers to distribute file storage means a huge improvement you are not seeing the real deal. Well, it could be possible to make a small improvement if this servers are made for static content, for instance, running just the necessary things. This will help you to distribute the bandwidth usage (don't think in the storage, in this days that is no issue). But they have to be different servers, optimized for each task.
A setup like this can be an improvement, but is far away from a real high impact architecture because you will just distributing bandwidth among different servers, is a neccesary thing? Totally... Is the whole issue? Of course not.

The real thing is statics servers + dynamic server + dB server. On a cloud solution you have this same abstraction but more easy, fast and cheap. You just ask for the "things" and the cdn or whatever makes the complete process.

This multiserver thing is in the schedule? Yes, but is not a priority. This is because this issue is related with a high end image hosting service and currently the plan in Chevereto is captivate the personal usage and extend the functionalities, because that is the actual demand. There is a point on having multiserver setup if we don't even use a dB yet? or and admin panel?. I have to make the new functionalities and the dB model. That is a lot of work. I want to make a SEO friendly, fast, smart and complete image hosting script first... That is on my mind in this moment.

But as I said, I'm thinking on ways to make this. I think that I can even make a pro release specially made for high usage including the server setups and so on.

Keep it up, you are giving me good ideas. :cool:
 
CDN was implemented in 3.4.3, multiservers has no release number set yet.
 
Status
Not open for further replies.
Back
Top