tohokuaikiのチラシの裏

技術的ネタとか。

FTPの「mkdir -p」版

Warningは避けられないので、気になる人は@で抑制してください。

<?php
/* Connectionは先に確立させておく */
$ftp = new FTP();

$target = '/Site/hoge/uki1/uki2/uki3/uki4/uki5';

define('WPSITE_HOST', 'localhost');
define('WPSITE_FTP_USER', 'itoh');
define('WPSITE_FTP_PASS', '*************');

$conn_id = ftp_connect(WPSITE_HOST);
ftp_login($conn_id, WPSITE_FTP_USER, WPSITE_FTP_PASS);

$ftp->ftp_mkdir($conn_id, $target);

/* ************************ */
class Ftp
{
    /**
     * @brief ftp_mkdir()の-p版
     * @param connection resource
     * @param string ターゲットパス(絶対パス)
     * @retval
     */
    function ftp_mkdir($conn_id, $target_dir)
    {
        static $path_buffer;
        
        if (is_null($path_buffer)){
            $path_buffer = array();
        }
        
        $target_dir = rtrim($target_dir, '/');
        
        if (ftp_chdir($conn_id, $target_dir)){
            if (count($path_buffer) > 0){
                $target_dir .= '/'. array_pop($path_buffer);
                if (ftp_mkdir($conn_id, $target_dir)){
                    return $this->ftp_mkdir($conn_id, $target_dir);
                }
                else {
                    return false; // create dir failed.
                }
            }
            return true;
        }
        else {
            $pathinfo = pathinfo($target_dir); 
            if (!$pathinfo['basename']){
                return false;
            }
            array_push($path_buffer, $pathinfo['basename']);
            return $this->ftp_mkdir($conn_id, $pathinfo['dirname']);
        }
    }
}