Add to Google Reader or Homepage Prihlásiť sa k odberu RSS

| Rubrika Php / mysql

Práca so súbormi pri zapnutom safe_mode

Pri tvorbe skriptov sa už mnoho z vás určite stretlo s problematickou prácou so súbormi pri zapnutom safe_mode. Tento mód je zapnutý na väčšine hostingoch kvôli bezpečnosti a málo ktorá hostingová spoločnosť bude súhlasiť s jeho vypnutím. Preto som pre vás pripravil zopár funkcií na prácu so súbormi ktore dokážu prostredníctvom natívnych FTP funkcii simulovať bežne používané funkcie na prácu so súbormi.

Potrebné nastavenia

<?
$ftp_server = 'ftp.server.sk';
$ftp_user_name = 'server.sk';
$ftp_user_pass = 'passwd';
$sub_ftp = 'web/'; // cesta k priečinku
?>

Často používana funkcia fopen() a jej FTP náhrada

S funkciou fopen() býva problém hlavne ak súbor ešte na serveri neexistuje. Riešením je vždy pred použitím funkcie takýto súbor cez FTP vytvoriť a až otvárať a zapisovať. K tejto funkcii potrebujeme dva mať fuknčné nastavenia (viď vyššie) a súbor blank.txt ktorý budeme cez FTP kopírovať – ako predlohu.

<?php
function sf_fopen($remo_file, $mode)
{
// ak nieje SafeMod ON  tak je zbytočne zdĺhavé si to komplikovať a funkcia sa vykoná klasickým spôsobom
if (!ini_get('safe_mode')) return fopen($remo_file, $mode);
 
if (file_exists($remo_file)) {
 
    $fp = fopen($remo_file, $mode);
 
} else {
 
   if(ini_get('safe_mode')) {
 
   // najprv vytvor súbor
   require_once dirname(__FILE__) . '/ftpconf.php'; // konfiguračný súbor s nastaveniami
   $file = 'blank.txt';
   $remote_file = $sub_ftp.$remo_file;
 
   // nastavenie jednoduchého FTP spojenia
   $conn_id = ftp_connect($ftp_server);
 
   // login
   $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
   $ltt = ftp_pwd($conn_id);
 
   // príprava kopírovania
   $fp1 = fopen($file, 'r');
   $ret = ftp_nb_fput($conn_id, $remote_file, $fp1, FTP_BINARY);
   while ($ret == FTP_MOREDATA) {
      // pokracuje upload...
      $ret = ftp_nb_continue($conn_id);
    }
 
   if ($ret != FTP_FINISHED) {
      echo Nastal problem pri pri spojení;
      exit;
   }
 
  ftp_chmod($conn_id, 0777, $remote_file); // nastavenie práv na zapisovanie do súboru
  fclose($fp1);
 
  // close connection
  ftp_close($conn_id);
 
  //až potom spracuj
   $fp = @fopen($remo_file, $mode);
} else {
   $fp = fopen($remo_file, $mode);
}
 
}
return $fp;
}
?>

Zmena práv súborov v PHP – alternatíva k chmod()

<?
if (!function_exists('ftp_chmod')) {
   function ftp_chmod($ftp_stream, $mode, $filename) {
     return ftp_site($ftp_stream, sprintf('CHMOD %o %s', $mode, $filename));
   }
}
 
function sf_chmod($file , $mode) {
   if(!ini_get('safe_mode')) return chmod($file , $mode);
 
   require('konfiguracny.php');
 
   $conn_id = ftp_connect($ftp_server);
 
   $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
   $file = $sub_ftp.str_replace(WB_PATH, '', $file);
   ftp_chmod($conn_id, $mode, $file);
 
   ftp_close($conn_id);
   return;
}
?>

PHP funkcia vytvorenie adresára v – alternatíva k mkdir()

<?
function sf_mkdir($dir, $mode) {
   if(!ini_get('safe_mode'))return mkdir($dir, $mode);
   require('konfiguracny.php');
 
   $conn_id = ftp_connect($ftp_server);
 
   $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
   $dir = $sub_ftp.str_replace(WB_PATH, '', $dir);
   if (!ftp_mkdir($conn_id, $dir))return FALSE;
 
   ftp_close($conn_id);
   return TRUE;
}
?>

PHP funkcia na zmazanie adresára – alternatíva k rmdir()

<?
 
function sf_rmdir($dir) {
   if(!ini_get('safe_mode'))return rmdir($dir);
   require('konfiguracny.php');
 
   $conn_id = ftp_connect($ftp_server);
 
   $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
   $dir = $sub_ftp.str_replace(WB_PATH, '', $dir);
 
   if (ftp_rmdir($conn_id, $dir)) return FALSE;
 
   ftp_close($conn_id);
   return TRUE;
}
?>

PHP funkcia na premenovanie – alternatíva k rename()

<?
function sf_rename($old, $new) {
   if(!ini_get('safe_mode'))return rename($old , $new);
   require('konfiguracny.php');
 
   $conn_id = ftp_connect($ftp_server);
 
   $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);
   $old = $sub_ftp.str_replace(WB_PATH, '', $old);
   $new = $sub_ftp.str_replace(WB_PATH, '', $new);
 
   if (!ftp_rename($conn_id, $old, $new))return FALSE;
   ftp_close($conn_id);
   return TRUE;
}
?>

Článok bol pôvodne uverejnený na PHPecko.org.

Michal Kurtulík

Naspäť naspäť Pridať komentár k článku prispieť do diskusie [0]

Vyhľadávanie

v názvoch článkov v textoch článkov

Pridať komentár

Koľko je na ruke prstov?

RSS